Configuração dinâmica no Kubernetes: Airbnb revela o Sitar-Agent

Airbnb detalha a arquitetura do Sitar-Agent, sidecar que distribui configurações dinâmicas para milhares de pods no Kubernetes, com foco em resiliência e performance.

R

Diagrama da arquitetura do Sitar-Agent da Airbnb em um cluster Kubernetes
Diagrama da arquitetura do Sitar-Agent da Airbnb em um cluster Kubernetes

A Airbnb compartilhou detalhes da arquitetura do Sitar-Agent, um sidecar Kubernetes que distribui atualizações de configuração dinâmica para dezenas de milhares de pods, processando mudanças várias vezes por minuto. O sistema foi redesenhado com Java, bootstrapping via snapshots no Amazon S3 e a substituição do Sparkey pelo SQLite, visando maior confiabilidade e desempenho.

  • Sitar-Agent é um sidecar que centraliza a entrega de configuração em ambiente Kubernetes.

  • Nova versão utiliza Java, snapshots S3 e SQLite no lugar do Sparkey.

  • Inicialização por snapshot reduz overhead e garante operação mesmo sem o serviço central.

  • Modelo pull-based com polling a cada 10 segundos garante propagação ágil de mudanças.

O que é o Sitar-Agent e por que a Airbnb o criou?

O Sitar-Agent nasceu da necessidade de modificar o comportamento de aplicações sem exigir novos deploys. Em um ambiente com microsserviços escritos em Java, Python, Go, TypeScript e Ruby, a atualização manual de arquivos de configuração em cada serviço era inviável. O sidecar resolve isso ao centralizar a lógica de entrega de configuração, expondo os dados localmente via sistema de arquivos compartilhado e cache em memória.

Essa abordagem garante independência de linguagem e consistência operacional: todos os serviços leem as configurações do agente local, eliminando implementações duplicadas e divergências de comportamento.

A necessidade de configuração dinâmica em escala

Em grandes frotas de microsserviços, alterações operacionais, como ajuste de timeouts, endpoints ou ativação de flags, precisam ser propagadas em segundos, não em minutos. O Sitar-Agent atende a isso com um modelo pull-based: ele consulta o backend de configuração (Sitar) a cada 10 segundos, aplicando as diferenças incrementalmente.

A escolha por polling em vez de push foi intencional: reduz o acoplamento com o serviço central e permite que os pods continuem operando com a última configuração conhecida mesmo se o backend ficar indisponível temporariamente.

Arquitetura de sidecar versus bibliotecas embutidas

Engenheiros da Airbnb ponderaram entre incluir a lógica de configuração como biblioteca nas aplicações ou mantê-la em um contêiner auxiliar. O sidecar prevaleceu por simplificar a operação: não é necessário incluir dependências em cada microsserviço nem reimplementar a lógica em múltiplas linguagens.

O sidecar virou um “canivete suíço” da configuração: a gente faz deploy, ele se vira sozinho.

A nova arquitetura: snapshots S3, Java rewrite e SQLite

A versão mais recente do Sitar-Agent trouxe três grandes mudanças estruturais. A primeira foi a reescrita em Java, linguagem já dominante em boa parte da infraestrutura da Airbnb, o que facilitou a manutenção e a integração com outras ferramentas internas.

A segunda foi a introdução de snapshots periódicas da configuração armazenadas no Amazon S3. Quando um pod inicia, o agente carrega o snapshot mais recente, reduzindo drasticamente o tempo de inicialização e evitando sobrecarregar o backend central com milhares de requisições simultâneas.

A terceira, e mais delicada, foi a substituição do datastore local Sparkey pelo SQLite. Sparkey, embora eficiente para leitura, apresentava limitações de concorrência e uma curva de aprendizado íngreme para novos desenvolvedores. Após avaliar RocksDB e SQLite, a equipe optou pelo SQLite devido ao seu modelo de concorrência robusto, simplicidade operacional e suporte maduro em múltiplas plataformas.

Inicialização com snapshots do Amazon S3

O fluxo de inicialização com S3 oferece um ganho duplo: performance e resiliência. Em vez de esperar o download completo das configurações a partir do zero, o agente obtém um estado quase atualizado instantaneamente. Em seguida, apenas as alterações incrementais são sincronizadas, permitindo que o serviço entre em operação em dezenas de segundos.

Mais importante: se o serviço central de configuração estiver fora do ar, o pod ainda consegue iniciar com o snapshot e funcionar normalmente. Essa tolerância a falhas reduz o “blast radius” de incidentes e evita cenários de indisponibilidade em cascata.

Migração do Sparkey para o SQLite

A troca de datastore foi executada com cautela. A equipe usou validação de shadow-read (leitura dupla nos dois sistemas para comparar resultados) e lançamentos controlados por feature flags, migrando gradualmente cargas de produção. O resultado foi uma redução na complexidade operacional sem impacto perceptível para as aplicações.

Modelo de distribuição pull-based e desempenho

O Sitar-Agent adota um modelo pull que pode parecer contraintuitivo: afinal, push costuma ser associado a menor latência. No entanto, o pull oferece previsibilidade. Cada agente consulta o backend a cada 10 segundos; o backend, por sua vez, usa cache server-side e rastreamento incremental de mudanças para responder com o mínimo de dados.

Isso permite que dezenas de milhares de pods recebam atualizações em menos de 30 segundos, o que é mais do que suficiente para ajustes operacionais como ativação de circuit breakers ou troca de endpoints de banco de dados.

Como o Sitar-agent entrega configuração localmente

Dentro do pod, o sidecar monta um volume compartilhado onde escreve arquivos de configuração no formato esperado por cada serviço. Além disso, mantém um cache em memória para acesso ultra-rápido. As aplicações consomem esses dados sem precisar saber que há um agente no meio, uma abstração simples que funciona igualmente em Java, Python ou Go.

Latência e resiliência em atualizações constantes

O maior desafio foi garantir que atualizações frequentes (até 6 vezes por minuto) não causassem oscilações. Para isso, o agente aplica as mudanças atomicamente: ele prepara os novos arquivos em um diretório temporário e depois os move para o local definitivo, evitando que as aplicações leiam configurações parciais.

Impacto e lições para times de infraestrutura

O caso do Sitar-Agent deixa algumas lições para organizações que operam Kubernetes sidecar em larga escala:

  • Sidecars não são apenas para service mesh: podem centralizar lógica de negócio como configuração, feature flags e secrets.

  • Snapshots em object storage (S3) são uma estratégia eficaz de bootstrap e disaster recovery.

  • Escolher um datastore embedded conhecido (SQLite) reduz barreiras de manutenção e onboarding de times.

  • Pull-based updates com cache inteligente escalam melhor que push em ambientes com milhares de consumidores.

Comparação entre Sparkey e SQLite como datastore local do Sitar-Agent
CaracterísticaSparkeySQLite
Modelo de concorrênciaSuporte limitado a leituras simultâneasLeitura concorrente com write-ahead log
Ecossistema de linguagensLigações específicas (Rust/C)Amplo suporte em Java, Python, Go etc.
Simplicidade operacionalRequer ferramentas auxiliares para manutençãoAdministração direta via CLI e bibliotecas padrão
Risco de migraçãoAlto – pouco conhecimento difundidoReduzido – validação com shadow-read e feature flags

Arraste para o lado para ver toda a tabela.

Perguntas Frequentes

Qual a principal vantagem do sidecar em relação a uma biblioteca de configuração?

O sidecar isola a lógica de entrega de configuração, evitando duplicação de código em cada microsserviço e garantindo comportamento consistente independentemente da linguagem de programação. Além disso, atualizações do agente não exigem rebuild das aplicações.

Como o Sitar-Agent evita inconsistências durante picos de atualização?

O agente utiliza escrita atômica: prepara os arquivos em um diretório temporário e os move para o diretório de configuração definitivo em uma única operação. Isso impede que as aplicações leiam arquivos parcialmente escritos.

Por que SQLite foi escolhido em vez de RocksDB?

SQLite oferece um modelo de concorrência mais robusto para cargas mistas de leitura/escrita, é extremamente testado, possui um ecossistema maduro de ferramentas e sua simplicidade reduziu o risco de migração e o esforço de manutenção. RocksDB, embora eficiente em cenários write-heavy, não trouxe vantagens decisivas para o padrão de acesso do Sitar-Agent.

O modelo pull-based (polling) não gera latência indesejada?

Para configuração operacional, um intervalo de 10 segundos é aceitável e evita a complexidade de um sistema de push. O uso de cache server-side e deltas reduz o volume de dados trafegado, e o polling frequente garante que a propagação de mudanças ocorra em menos de 30 segundos, o que é suficiente para a maioria dos cenários operacionais.

Fontes e referencias

R

Sobre o autor

Redação

Editor-chefe

Usuário técnico criado para escrever conteúdos da redação.

Perguntas frequentes

Qual a principal vantagem do sidecar em relação a uma biblioteca de configuração? +

O sidecar isola a lógica de entrega de configuração, evitando duplicação de código em cada microsserviço e garantindo comportamento consistente independentemente da linguagem de programação. Além disso, atualizações do agente não exigem rebuild das aplicações.

Como o Sitar-Agent evita inconsistências durante picos de atualização? +

O agente utiliza escrita atômica: prepara os arquivos em um diretório temporário e os move para o diretório de configuração definitivo em uma única operação. Isso impede que as aplicações leiam arquivos parcialmente escritos.

Por que SQLite foi escolhido em vez de RocksDB? +

SQLite oferece um modelo de concorrência mais robusto para cargas mistas de leitura/escrita, é extremamente testado, possui um ecossistema maduro de ferramentas e sua simplicidade reduziu o risco de migração e o esforço de manutenção. RocksDB, embora eficiente em cenários write-heavy, não trouxe vantagens decisivas para o padrão de acesso do Sitar-Agent.

O modelo pull-based (polling) não gera latência indesejada? +

Para configuração operacional, um intervalo de 10 segundos é aceitável e evita a complexidade de um sistema de push. O uso de cache server-side e deltas reduz o volume de dados trafegado, e o polling frequente garante que a propagação de mudanças ocorra em menos de 30 segundos, o que é suficiente para a maioria dos cenários operacionais.

Mais em Infraestrutura

Newsletter

Receba os destaques no seu e-mail

Cadastre-se e acompanhe as novidades em primeira mão.