Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Estruturas de dados que suportam 300 mil jogadores simultâneos

Estruturas de dados que suportam 300 mil jogadores simultâneos

Juan Lopes

June 16, 2021
Tweet

More Decks by Juan Lopes

Other Decks in Programming

Transcript

  1. Objetivo desta apresentação Apresentar estruturas de dados avançadas que podem

    ajudar a resolver problemas interessantes. Catalogar as estruturas de dados usadas na Zwift, evidenciando como estruturas customizadas podem ser benéficas. Apresentar o processo decisório que pode levar um time a escolher implementar uma estrutura de dados customizada. 3 1. CONTEXTO Que tipo de problemas são resolvidos na Zwift? 2. ESTUDO DE CASO Por que resolvemos alguns problemas usando estruturas customizadas?
  2. WHATNOT SSL OFFLOADER RDS HTTPS OTHER SERVICE CLUSTERS instance-1 instance-2

    instance-n KAFKA REDIS ACTIVEMQ UDP RELAY CLUSTER instance-1 instance-2 instance-n TCP RELAY CLUSTER instance-1 instance-2 instance-n UDP 3022 TCP 3023 API RELAY CLUSTER instance-1 instance-2 instance-n UDP 3021 × N Game Server 11 Palestra sobre a arquitetura do Zwift https://www.youtube.com/watch?v=SmQrHlqDw7U&t=3630s
  3. 5Hz 2.5Hz 1Hz 0.5Hz 0.2Hz Culling dos 100 vizinhos mais

    próximos, com diversas frequências de atualização, dependendo da distância. 14 Player Culling
  4. Escalabilidade UDP Atribui focos de maneira a produzir um diagrama

    de Voronoi listrado que balanceia jogadores entre servidores. 2. STRIPES Similar ao Stripes, mas em 2D. Divide os jogadores em linhas e depois em células com o mesmo número de jogadores. 3. BRICKWALL Divide recursivamente o espaço (e o conjunto de jogadores) até que cada célula possa ser atribuído a um único servidor. 4. KD-TREE Atribui focos de Voronoi aleatoriamente e verifica se a solução é viável (se não há jogadores demais no mesmo servidor). 1. VORONOI 19
  5. “ Estruturas de dados genéricas são construídas para atender a

    maioria dos casos com um desempenho razoável. Para tanto, é quase sempre necessário fazer escolhas que não necessariamente refletem a realidade de quem vai usar. 22
  6. 24 O Problema ▷ Índice reconstruido a cada 3 segundos

    ▷ Até 300 mil jogadores no índice ▷ Consulta sobre os 100 vizinhos mais próximos de cada jogador. 300 mil × 100 = 30 milhões de vizinhos gerados a cada 3 segundos.
  7. V3 Usar biblioteca com RTree. V1 Algoritmo ingênuo com Java

    Streams. V2 Otimização de V1 com QuickSelect. Soluções V5 Construir KDTree customizada. V4 Usar biblioteca com KDTree. 25
  8. “ Ideia ingênua: ordenar todos os pontos por distância e

    pegar os K mais próximos. 26 V1. Naive
  9. V5. Custom KDTree 46 [O(n logn)] Complexidade Computacional A primeira

    análise a se fazer sobre a aplicabilidade de uma estrutura a um problema é a complexidade esperada da solução. Eficiência de Cache Estruturas bem modeladas colocam dados correlatos em posições próximas na memória, otimizando a eficiência de cache da solução. Otimização de Espaço Um aspecto geralmente menos importante que os outros, mas ainda relevante. Entretanto, otimizar espaço às vezes pode ser a diferença entre caber no cache L1 ou ter que rodar direto da RAM. GC Pressure Em sistemas de alta frequência, é importante evitar alocações desnecessárias. O custo de GC às vezes pode ser bastante significativo. E as pausas às vezes catastróficas. Preocupações importantes sobre estruturas de dados.
  10. V5. Custom KDTree 48 [O(n logn)] 3 4 5 6

    1 2 0 Representando árvore binária completa em array (Representação em largura) Vantagem: nós de uma mesma camada ficam próximos no array. Filhos de N: N*2, N*2+1. Representação comum em binary heaps.
  11. V5. Custom KDTree 49 [O(n logn)] 0 2 4 6

    1 5 3 Representando árvore binária completa em array (Representação em-ordem) Vantagem: nós estruturalmente próximos tendem a ficar próximos no array.
  12. 51 V5. Custom KDTree Uma estrutura genérica normalmente não poderia

    assumir as mesmas premissas. Otimizações possíveis por assumir: ◦ KDTree com K=2 ◦ Estrutura imutável ◦ Queries reaproveitáveis [O(n logn)]