DEV Community

Cover image for Por dentro do ScyllaDB: A escolha do Discord para performance máxima
Higor Diego
Higor Diego

Posted on

Por dentro do ScyllaDB: A escolha do Discord para performance máxima

Para qualquer profissional de tecnologia, projetar sistemas que operam em hiperescala é um dos desafios mais complexos e fascinantes. Poucas empresas no mundo lidam com uma escala tão extrema quanto o Discord, uma plataforma que conecta milhões de usuários simultaneamente, processando um volume de dados que beira o inimaginável.

A experiência do usuário em uma plataforma como essa é diretamente impactada pela latência. Uma simples mensagem que demora a chegar pode degradar a qualidade do serviço. Agora, imagine esse desafio na escala de trilhões de mensagens. Para o Discord, a latência não era um incômodo, mas um obstáculo crítico que precisava ser superado.

Neste artigo, faremos uma análise técnica da jornada do Discord, desde os desafios de escalabilidade com tecnologias tradicionais até a migração para o ScyllaDB, o banco de dados que se tornou a solução para seus problemas de performance. Se você se interessa por arquitetura de sistemas distribuídos e soluções de engenharia para problemas de larga escala, este estudo de caso é para você.

Casos como o do Discord não são exceção no mercado. Em diferentes projetos que acompanhamos, vemos empresas enfrentando exatamente os mesmos sintomas: crescimento rápido, aumento de usuários, mais dados sendo processados e, junto com isso, latência subindo, custos explodindo e instabilidade aparecendo em momentos críticos.

Muitos clientes chegam até nós quando o sistema “ainda funciona”, mas já começou a dar sinais claros de estresse: picos de latência, filas acumulando, banco de dados no limite e times apagando incêndio em produção. Esse é exatamente o ponto onde decisões arquiteturais passam a ser tão importantes quanto novas funcionalidades.

A Jornada por Performance: De MongoDB a ScyllaDB

A história da infraestrutura do Discord é uma verdadeira saga de engenharia, uma busca contínua pela performance perfeita em uma escala que poucos ousam enfrentar.

Os Primeiros Dias com MongoDB

No início, como muitas startups, o Discord utilizava MongoDB. Era uma solução flexível, de fácil desenvolvimento e que serviu bem ao propósito inicial. Contudo, a plataforma tinha uma característica fundamental: uma carga de trabalho extremamente pesada em escrita (write-heavy). Cada mensagem enviada é uma nova escrita no banco de dados.

Quando o Discord atingiu a marca de 100 milhões de mensagens, os problemas começaram a aparecer. O conjunto de dados e índices já não cabia mais na RAM, e a latência, antes previsível, começou a disparar. O MongoDB, embora excelente para muitos casos de uso, não era otimizado para a avalanche de escritas que o Discord precisava suportar. A arquitetura estava chegando ao seu limite.

A Era do Cassandra e a Busca por Escalabilidade

A equipe de engenharia precisava de uma solução construída para escalabilidade e cargas de trabalho de escrita massivas. A escolha natural na época (por volta de 2017) foi o Cassandra.

O Cassandra foi projetado com uma arquitetura distribuída e sem mestre (masterless), otimizada para alta disponibilidade e, crucialmente, para uma performance de escrita excepcional. A migração foi um sucesso e permitiu que o Discord continuasse sua trajetória de crescimento exponencial, chegando a bilhões e, eventualmente, trilhões de mensagens.

Novas Fronteiras, Novos Desafios

Mesmo uma ferramenta poderosa como o Cassandra tem seus limites quando levada a um extremo que poucas empresas no mundo já viram. Com um cluster de 177 nós e trilhões de mensagens, novos inimigos da performance surgiram:

  1. O "Garbage Collector" da JVM: O Cassandra roda na JVM, e suas pausas para "coleta de lixo", embora geralmente rápidas, tornavam-se um problema massivo em um cluster daquele tamanho. Essas pausas geravam picos de latência que se propagavam pelo sistema, afetando a experiência do usuário de forma imprevisível.

  2. "Partições Quentes" (Hot Partitions): Servidores ou canais extremamente populares concentravam um volume desproporcional de tráfego em nós específicos do cluster. Esses nós superaqueciam, criando gargalos que retardavam as operações para todos.

A equipe do Discord se viu novamente em uma encruzilhada. Eles não precisavam de um pequeno ajuste; eles precisavam de um salto quântico em eficiência. Era hora de repensar a fundação mais uma vez. E foi nessa busca que o ScyllaDB entrou no radar.

O diferencial do ScyllaDB não reside apenas em ser 'mais rápido', mas em sua arquitetura fundamental, que prometia resolver a causa raiz dos problemas que eles enfrentavam com o Cassandra.

Esse tipo de cenário é muito parecido com o que vemos em clientes que crescem rápido: a tecnologia que funcionava bem no início começa a virar gargalo. Não é falha da ferramenta, é mudança de contexto. Arquitetura que nasce pequena precisa evoluir conforme o negócio muda.

Análise da Arquitetura: O Poder do ScyllaDB

Para entender o poder do ScyllaDB, a analogia de um restaurante de alta performance é útil. Enquanto outras soluções podem ter uma "cozinha compartilhada" que gera contenção, o ScyllaDB projeta cada componente para máxima eficiência.

Os pilares dessa arquitetura são:

  • Base em C++: Ao ser escrito em C++, o ScyllaDB opera mais próximo ao hardware, eliminando a camada de abstração da JVM e, consequentemente, as pausas imprevisíveis causadas pelo Garbage Collector. O resultado é uma performance com menos sobrecarga e maior previsibilidade.

  • Arquitetura "Shard-per-Core": Este é o ponto central de sua eficiência. Em vez de compartilhar recursos, o ScyllaDB designa um núcleo de CPU (um "shard") para gerenciar um conjunto específico de dados. Cada shard tem sua própria memória, cache e I/O. Isso elimina a contenção por recursos e otimiza o paralelismo, permitindo que o banco de dados escale linearmente com o número de núcleos.

  • Framework Assíncrono Seastar: O Seastar é o motor que impulsiona essa arquitetura. É um framework de programação de alta performance que gerencia as tarefas de forma assíncrona, garantindo que os núcleos da CPU estejam sempre processando dados, sem tempos ociosos ou bloqueios desnecessários.

Essa fundação arquitetônica ataca diretamente os problemas enfrentados pelo Discord: elimina as pausas do Garbage Collector e, graças à eficiência do modelo shard-per-core, gerencia as partições quentes de forma muito mais eficaz.

Em projetos com clientes, usamos esse mesmo tipo de análise: entender onde existe contenção, onde há disputa por recursos e onde a arquitetura impede o paralelismo. Nem sempre a solução é ScyllaDB, mas o método de pensar é sempre o mesmo: resolver a causa do problema, não apenas o sintoma.

Escalabilidade no ScyllaDB: Como Funciona?

A escalabilidade do ScyllaDB vai além do shard-per-core. Ela se baseia em uma arquitetura distribuída, sem mestre (masterless), onde todos os nós são iguais. Na nossa experiência, o ponto crítico a entender é como os dados são distribuídos…

  1. Distribuição em Anel (Token Ring): Os dados no ScyllaDB são distribuídos em um anel usando hashing consistente. Cada nó no cluster é responsável por um ou mais intervalos de dados (tokens). Quando você escreve um dado, uma função de hash é aplicada à chave de partição para determinar em qual nó (e seu respectivo shard) aquele dado deve ser armazenado.

  2. Fator de Replicação (Replication Factor): Para garantir a alta disponibilidade, os dados não são armazenados em apenas um nó. O fator de replicação define quantas cópias de cada dado existirão no cluster. Um fator de 3, por exemplo, significa que cada pedaço de dado será replicado em 3 nós diferentes.

  3. Protocolo Gossip: Como os nós sabem uns dos outros? Através do protocolo Gossip. Periodicamente, cada nó "fofoca" com outros nós aleatórios, trocando informações sobre o estado do cluster. É assim que um nó descobre se outro ficou offline ou se um novo nó entrou no cluster.

  4. Escalabilidade Elástica: Adicionar um novo nó ao cluster é um processo transparente. O novo nó anuncia sua presença via Gossip, recebe suas responsabilidades no anel de tokens, e o cluster automaticamente começa a transferir os dados relevantes para ele, rebalanceando a carga sem a necessidade de intervenção manual.

Essa combinação de distribuição, replicação e comunicação descentralizada é o que permite ao ScyllaDB escalar horizontalmente, simplesmente adicionando mais máquinas.

Vantagens e Desvantagens: Quando ScyllaDB Brilha (e Quando Não)?

Nenhuma tecnologia é bala de prata. Como especialista, é crucial avaliar os prós e contras.

Vantagens:

  • Performance Extrema: Para cargas de trabalho de alta escrita e leitura que exigem baixa latência, o ScyllaDB é, sem dúvida, um dos bancos de dados mais rápidos do mercado.

  • Custo-Benefício em Escala: Graças à sua eficiência, você geralmente precisa de menos nós (e hardware menos robusto) em comparação com o Cassandra para atingir a mesma performance, o que se traduz em economia de custos.

  • Compatibilidade com o Ecossistema Cassandra: A compatibilidade com a CQL e os drivers do Cassandra é uma vantagem imensa, facilitando migrações e o aproveitamento de ferramentas existentes.

Desvantagens:

  • Complexidade Operacional: Não se engane, ScyllaDB é um sistema distribuído complexo. O gerenciamento, monitoramento e troubleshooting de um cluster exigem conhecimento especializado.

  • Curva de Aprendizagem: Embora a CQL seja familiar, otimizar a performance e entender as métricas específicas do ScyllaDB (diferentes das do Cassandra) exige estudo.

  • Modelo de Dados Restritivo: Assim como outros bancos NoSQL, o ScyllaDB não é uma solução para todos os problemas. A ausência de JOINs e a necessidade de modelar os dados em torno das suas consultas são cruciais. Se o seu caso de uso exige consultas complexas e ad-hoc, um banco de dados SQL pode ser mais apropriado.

Para clientes, esse tipo de avaliação é essencial. Não existe tecnologia perfeita, existe tecnologia adequada ao momento do negócio, ao time e ao orçamento. Parte do nosso trabalho é justamente ajudar a escolher a ferramenta certa para o desafio certo.

Minha Opinião de Especialista:

Eu recomendo o ScyllaDB para cenários onde a baixa latência e a alta taxa de transferência (throughput) são requisitos não negociáveis. Pense em feeds de atividades, sistemas de IoT, time-series data, e aplicações de chat em larga escala como o Discord. Se você já usa Cassandra e está enfrentando gargalos de performance, o ScyllaDB é o candidato natural para uma migração.

Contudo, para projetos menores ou equipes sem experiência em sistemas distribuídos, a complexidade operacional pode ser um obstáculo. Nesses casos, um banco de dados gerenciado (DBaaS) ou uma tecnologia mais simples pode ser um ponto de partida mais sensato.

A Migração: Uma Operação Cirúrgica

A teoria por trás do ScyllaDB é sólida, mas o desafio da migração era imenso. Como mover trilhões de mensagens para um novo banco de dados sem indisponibilidade ou perda de dados?

A equipe do Discord executou um plano de migração notável. Em vez de usar ferramentas padrão, eles desenvolveram uma solução customizada em Rust para garantir a máxima performance. Os resultados da migração foram impressionantes: a ferramenta atingiu picos de 3.2 milhões de registros por segundo.

O processo completo, que tinha uma estimativa inicial de três meses, foi concluído em impressionantes 9 dias.

Em projetos reais, nem toda migração é tão extrema, mas o cuidado é o mesmo: planejar, testar, validar e executar sem interromper o negócio. Migração bem feita é aquela que o usuário final nem percebe.

Os Resultados Falam por Si

Os resultados pós-migração foram transformadores e validaram a escolha da nova arquitetura. Os ganhos de performance e eficiência foram imediatos:

  • Latência: Os picos de latência, que antes chegavam a 500ms, foram eliminados. O sistema se estabilizou em uma latência constante de 5ms.

  • Infraestrutura: O cluster foi drasticamente reduzido de 177 para apenas 72 nós, uma economia de quase 60% em infraestrutura.

  • Custos: Consequentemente, a redução no número de máquinas gerou uma economia significativa nos custos operacionais.

Com essa migração, o Discord não apenas resolveu seu problema de latência, mas também construiu uma fundação mais estável, eficiente e escalável para o futuro.

Para nós, estudar casos como esse não é só curiosidade técnica. É parte do nosso processo de preparar soluções melhores para os clientes, antecipando problemas que eles ainda nem sentiram — mas que certamente sentirão se o sistema crescer.

Conclusão: A Ferramenta Certa para o Desafio Certo

A história do Discord não é apenas sobre a troca de um banco de dados por outro. É uma lição sobre a importância de entender a fundo os problemas de arquitetura e não ter medo de questionar o status quo para encontrar a solução certa. Ao escolher ScyllaDB, a equipe de engenharia do Discord não optou pelo caminho mais fácil, mas pelo caminho que resolvia a causa raiz de seus problemas de latência e escalabilidade.

Para desenvolvedores e arquitetos, o aprendizado é claro: o sucesso de um sistema em hiperescala depende fundamentalmente das escolhas de sua fundação. Analisar casos como este nos prepara para tomar decisões mais informadas em nossos próprios projetos, independentemente da escala.

A pergunta final é: qual desafio de arquitetura você está enfrentando hoje — e o que precisaria mudar na sua fundação para que ele deixe de ser um problema amanhã?

Top comments (0)