A resiliência em sistemas de software é uma arte que poucos dominam totalmente. Recentemente, a equipe de engenharia da Agoda compartilhou uma solução customizada que eles desenvolveram para garantir que operações críticas do Kafka continuem funcionando em múltiplos data centers, mesmo durante falhas. Isso é um desafio e tanto, considerando que eles processam mais de 3 trilhões de registros do Kafka diariamente. Vamos explorar essa abordajem e entender como a Arquitetura de Software pode contribuir significativamente nessa jornada.
O Desafio da Continuidade em Sistemas Distribuídos
No cenário atual, onde a dependência de dados é crescente, a continuidade dos serviços não é apenas desejável, mas essencial. A Agoda enfrentou a necessidade de um mecanismo de failover que pudesse transferir cargas de trabalho de consumidores entre diferentes clusters do Kafka sem perder o estado de processamento e, claro, sem causar duplicação ou perda de dados. Para isso, eles não se apoiaram nas soluções padrão como os stretch clusters do Kafka, que se mostraram impraticáveis devido à latência geográfica, nem no MirrorMaker 2, que não oferece a sincronização bidirecional de offsets.
A Inovação por Trás da Solução
A solução desenvolvida pela Agoda estende o MirrorMaker 2 para suportar failover confiável, failback sem costura e tradução persistente de offset. A ideia central é a sincronização bidirecional sempre ativa dos offsets dos grupos de consumidores e dos registros de OffsetSync entre clusters. Assim, quando um grupo de consumidores registra um offset em um data center, esse offset é traduzido e atualizado no outro cluster através de um serviço de sincronização customizado que utiliza o Kafka Connect e os mecanismos de OffsetSync.
Esse processo é fundamental, especialmente em cenários de failover, onde o cluster secundário assume automaticamente a partir do ponto exato onde o processamento foi interrompido, graças aos offsets traduzidos e replicados. E, quando o data center primário volta à ativa, o sistema permite o failback: os offsets dos consumidores são sincronizados de volta para o cluster original, garantindo a continuidade sem duplicar mensagens ou perder progresso. Isso demonstra um cuidado extremo com a eficiência operacional.
Dicas Avançadas para Arquitetura Resiliente
- Invista em Observabilidade: Utilize ferramentas como o Grafana para monitorar métricas essenciais como atrasos de replicação e falhas de sincronização. A visibilidade em tempo real é crucial para detectar anomalias antes que se tornem problemas sérios.
- Implementação do Failover automatizdo: Automatize o failover e failback para que sua equipe possa se concentrar em outras tarefas. A intervenção manual pode ser um ponto de falha.
- Teste Regularmente: Realize testes regulares de failover e failback para garantir que os processos funcionem como esperado. Simule falhas e veja como seu sistema reage.
- Documentação e Compartilhamento de Conhecimento: Mantenha uma documentação clara sobre o funcionamento da sua arquitetura. Isso facilita a integração de novos membros na equipe e reduz erros.
Reflexões Finais
A abordagem da Agoda para lidar com a resiliência do Kafka é um exemplo claro de que, no mundo dos dados, não há espaço para soluções "tamanho único". Cada empresa deve avaliar suas necessidades e construir soluções que se alinhem com suas operações e objetivos. No fim das contas, a flexibilidade e a inovação são os pilares que sustentam uma arquitetura de software robusta. E, como sempre digo, quem não se adapta, fica para trás.
Então, fica a pergunta: sua arquitetura está preparada para enfrentar desafios inesperados? Pense nisso!