Este post foi co-escrito com Mike Zorn, Arquiteto de Software da LaunchDarkly como autor principal.
LaunchDarkly's A plataforma de gerenciamento de recursos permite que os clientes liberem recursos e meçam seu impacto. Como parte dessa plataforma, os SDKs coletam dados de eventos e a plataforma de ingestão de eventos consome e analisa esses dados para medir o impacto. À medida que a plataforma foi lançada e a adoção do cliente aumentou, tivemos que dimensionar o pipeline de dados de eventos para atender às demandas dos negócios para novos casos de uso que exigiam perda zero de dados. Explicaremos os desafios que encontramos com a arquitetura inicial e as vantagens alcançadas com o uso Fluxos de dados do Amazon Kinesis e serviços adicionais da AWS na nova arquitetura. Também abordaremos os diferentes fatores que consideramos na implementação do Amazon Kinesis Data Streams para economia e desempenho.
Declaração do problema
A missão da LaunchDarkly é mudar fundamentalmente a forma como as empresas fornecem software, ajudando-as a inovar mais rapidamente, implantar sem medo e tornar cada lançamento uma obra-prima. Com o LaunchDarkly, permitimos que os clientes implantem quando quiserem, liberem quando estiverem prontos e obtenham controle total do código para enviar rapidamente, reduzir riscos e recuperar suas noites e fins de semana.
Em 2017, a plataforma de ingestão de eventos consistia em uma frota de servidores web que gravariam eventos em vários bancos de dados, conforme mostrado abaixo, que armazenavam dados de eventos para alimentar vários recursos do produto LaunchDarkly. Esses recursos permitem que os clientes do LaunchDarkly obtenham visibilidade total sobre o desempenho de um recurso ao longo do tempo, otimizem recursos por meio de experimentação e verifiquem rapidamente sua implementação. Infelizmente, todas as gravações de banco de dados para alimentar esses recursos foram executadas em um único processo nesses servidores da Web; portanto, se qualquer um desses bancos de dados tivesse um problema de disponibilidade, os eventos seriam enfileirados na memória até que o processo ficasse sem memória e falhasse. Como esse mesmo banco de dados seria usado para gravar dados de cada servidor da Web, todos eles acabariam ficando sem memória e travando. Esse ciclo se repetiria até que o problema de disponibilidade do banco de dados fosse corrigido. Durante esse período, houve uma perda permanente de todos os dados de eventos enviados pelos SDKs.
O sistema atual tolerava alguma perda de dados, pois os aplicativos que usavam esses dados eram limitados. Mas os novos recursos e fluxos de trabalho tinham requisitos mais rigorosos na prevenção de perda de dados.
Decidimos explorar alternativas em que todos os consumidores são construídos com tolerância a falhas isoladas, de modo que cada consumidor seja independente um do outro em caso de problemas. Construímos um pipeline orientado a eventos que seria altamente durável, escalável e também forneceria a capacidade de reprodução de dados. Como resultado, passamos da ingestão de cerca de 1 TB de dados por dia para mais de 100 TB de dados agora.
Solução
O diagrama a seguir ilustra nosso design atualizado. Para dar suporte aos novos casos de uso, adicionamos Fluxos de dados do Amazon Kinesis, AWS Lambda, e Mangueira de incêndio de dados do Amazon Kinesis à arquitetura.
O design tem os seguintes componentes principais
- Cliente móvel usando o LaunchDarkly SDK para avaliar sinalizadores de recursos
- O Application Load Balancer distribui o tráfego para os nós do Amazon EC2
- Os nós do Amazon EC2 executam um aplicativo go que grava o tráfego no Amazon Kinesis Data Streams
- Amazon Kinesis Data Streams persiste dados de forma durável
- AWS Lambda grava vários tipos de dados em bancos de dados
- Amazon OpenSearch Service registra dados sobre usuários
- Amazon ElastiCache registra dados sobre status de sinalização
- O Amazon Kinesis Firehose agrupa dados de avaliação de sinalizadores e os grava no Amazon S3
- Amazon S3 registra dados sobre avaliações de sinalizadores
Os dados fluem de um LaunchDarkly SDK para a API de eventos, que é apoiada por um Application Load Balancer (ALB). Esse ALB roteia o tráfego para uma frota de servidores Amazon EC2. Esses servidores mantêm os dados no Amazon Kinesis Data Streams. Os dados são lidos do Amazon Kinesis Data Streams por funções do Lambda que transformam e gravam os dados em diferentes formatos em vários bancos de dados. O design tem algumas propriedades que foram muito importantes para este caso de uso.
- Durabilidade
- Isolamento
- Reprodução de dados
A durabilidade evitaria a perda de dados quando surgissem problemas no processamento de dados. O isolamento impediria que outros consumidores de dados falhassem quando um consumidor tivesse uma falha. A reprodução de dados nos permitiria depurar anomalias de dados e corrigi-las retroativamente.
O Amazon Kinesis Data Streams atende a essas três propriedades. Os dados gravados no Amazon Kinesis Data Streams são mantidos de forma durável até que os dados desapareçam do stream. O Amazon Kinesis Data Streams permite o isolamento do consumidor: cada consumidor mantém sua própria posição de iterador, para que os consumidores possam processar dados de um stream independentemente um do outro. Por fim, o Amazon Kinesis Data Streams possibilita a reprodução de dados porque os consumidores podem definir a posição do iterador de estilhaço como no passado. Por exemplo, um consumidor pode ser configurado para iniciar a leitura em 1 hora no passado se a última hora de dados precisar ser reproduzida.
Algumas tecnologias adicionais foram consideradas que nos permitiriam alcançar essas propriedades de design. O Amazon Simple Notification Service (Amazon SNS) combinado com o Amazon Simple Queue Service (Amazon SQS) permitiria um sistema com durabilidade e isolamento. A reprodução de dados não estava disponível imediatamente e precisava de uma implementação personalizada para oferecer suporte a esse recurso.
O Apache Kafka também foi considerado, mas apesar de atender a essas propriedades de design, não foi adotado porque a equipe não tinha experiência anterior com o Apache Kafka. O Amazon Kinesis Data Streams atende a essas propriedades de design e é totalmente gerenciado, o que reduz a necessidade de se preocupar com a falta de conhecimento operacional.
Análise detalhada da implementação do Amazon Kinesis Data Streams
Antes de iniciarmos nossa implementação do Amazon Kinesis Data Streams, durante nossa fase inicial de prova de conceito, aprendemos que, embora o Amazon Kinesis Data Streams seja totalmente gerenciado, há alguns aspectos que precisam ser levados em consideração ao implementá-lo em escala.
- custos
- Tratamento de erros do cliente
Os custos sob demanda do Amazon Kinesis Data Streams são proporcionais ao volume de dados colocado no stream. No entanto, se o tráfego for relativamente regular e previsível, o faturamento do throughput provisionado é mais econômico. No faturamento de taxa de transferência provisionada, os clientes também serão cobrados por cargas úteis de put, que é essencialmente um custo extra, especialmente se houver vários registros pequenos. Como o caso de uso do LaunchDarkly tinha tráfego previsível e uniforme, foi usado o throughput provisionado. No entanto, tínhamos um tamanho de registro pequeno (cerca de 100 bytes em média), por isso era importante implementar o batching para controlar os custos.
A Kinesis Producer Library (KPL) oferece suporte a uma variedade de idiomas e, se você usar qualquer um deles, poderá contar com isso para agrupar registros com eficiência para você. No entanto, como o LaunchDarkly usa Go para aplicativos de back-end, tínhamos um código personalizado porque o Go como produtor não era compatível com o KPL. Nossa solução foi agrupar dados em lote para que ficassem próximos a 25 kB (o tamanho de uma carga útil de put). Fizemos isso usando buffers de protocolo e concatenando-os dentro de um registro.
Erros de cliente ocorrem quando o aplicativo que grava no Amazon Kinesis Data Streams falha ao gravar dados com êxito. Estes são importantes para minimizar, e há alguns fatores a serem considerados para conseguir isso. Primeiro, projete seu aplicativo para que haja o menor número possível de modos de falha no caminho de gravação final. Em nosso aplicativo, autenticamos uma solicitação, verificamos o valor de alguns sinalizadores de recursos e gravamos os dados no Amazon Kinesis Data Stream. Otimizamos nosso código para não executar consultas de banco de dados ou solicitações de rede antes que os dados sejam gravados no Amazon Kinesis Data Streams para evitar falhas de consulta/chamada, o que pode causar perda de dados. Outra etapa a ser implementada é aumentar o número de tentativas no AWS SDK (usamos 10). Dessa forma, se houver um problema transitório ao gravar dados no Amazon Kinesis Data Streams, os dados terão maior probabilidade de serem persistidos. Por fim, ter um limite de taxa granular é importante se você estiver usando fluxos provisionados. Às vezes, os produtores finais configuram inadvertidamente um SDK para enviar quantidades incríveis de dados ao nosso sistema. Nesses cenários, temos um limitador de taxa para evitar que um único locatário consuma muito de nossa capacidade provisionada.
Depois de descobrir como resolver todos esses problemas, procedemos à migração para a nova arquitetura em duas fases.
A primeira foi enviar nossos dados para o Amazon Kinesis Data Streams. A segunda foi mover nossa carga de trabalho do consumidor de nossos servidores Amazon EC2 para AWS Lambda. Para ambas as fases, usamos Sinalizador de recurso LaunchDarkly com um lançamento de porcentagem para aumentar gradualmente o tráfego para a nova arquitetura.
A primeira fase, envio de dados para o Amazon Kinesis Data Streams, foi muito tranquila. O mecanismo de lote funcionou conforme o esperado e nossa taxa de transferência também foi conforme o esperado. Uma coisa que não esperávamos era um aumento nos custos de transferência de dados de nossa nuvem privada virtual (VPC). Por padrão, o tráfego do Amazon Kinesis Data Streams passará pelo gateway de conversão de endereço de rede (NAT) da VPC. As cobranças são baseadas no volume de dados que flui pelos gateways NAT. Para reduzir esses custos, o design foi otimizado para configurar um endpoint de link privado da AWS em cada zona de disponibilidade onde o aplicativo Amazon EC2 está hospedado. Essa otimização de design minimiza os custos de transferência de dados.
A segunda fase, mover a carga de trabalho para o AWS Lambda, não foi tão tranquila. Acontece que alterar drasticamente a simultaneidade de uma carga de trabalho de dezenas de servidores para centenas de contextos de execução do Lambda pode ter algumas consequências não intencionais. No Amazon EC2, agregamos nossos dados de avaliação de sinalizadores em cada host e liberamos um arquivo no Amazon S3 uma vez por minuto. No AWS Lambda, essa agregação tornou-se cerca de 20 vezes menos eficaz devido ao aumento da simultaneidade. Para superar o problema de muitos arquivos para nossos sistemas de processamento de dados downstream, usamos o Amazon Kinesis Data Firehose. Nós o usamos para agrupar dados automaticamente em arquivos no Amazon S3. Assim que integramos esse serviço à arquitetura, conseguimos migrar toda a nossa carga de trabalho para o AWS Lambda.
Com base na experiência do LaunchDarkly, o Amazon Kinesis Data Streams é uma boa opção para casos de uso de processamento de dados de eventos. Depois que os eventos são persistentes de forma durável no Amazon Kinesis Data Streams, os consumidores de stream são fáceis de criar e a retenção de eventos é gerenciada para você. Se você está pensando em usar o Amazon Kinesis Data Streams, há algumas coisas que você deve considerar em sua implementação.
- Configure os endpoints do AWS Private Link para reduzir os custos de transferência de dados.
- Use o KPL ou implemente seu próprio lote de registro para que as cargas úteis sejam próximas a 25 kB.
- Use limites de taxa para garantir que você não exceda a capacidade provisionada (se não estiver usando fluxos sob demanda).
- Aumente as contagens de novas tentativas para garantir que os dados sejam gravados.
Conclusão
Este sistema está em produção há mais de 3 anos e estamos muito satisfeitos com ele. Ele escalou de ingerir cerca de 1 TB por dia em 2018 para mais de 100 TB por dia agora. Por meio desse crescimento, esse sistema provou ser confiável, eficiente e econômico. O sistema manteve 99.99% de disponibilidade e 99.99999% de durabilidade dos dados. Os tempos de processamento de ponta a ponta estão dentro de 30 s. Os custos aumentaram com o aumento do uso, mas estão dentro do nosso orçamento para essa carga de trabalho.
Esperamos que esta postagem possa orientá-lo a criar seu pipeline de análise e processamento de eventos com base em Fluxos de dados do Amazon Kinesis enquanto aproveita o poder das tecnologias totalmente gerenciadas para não apenas acelerar as metas de negócios, mas também ter um sistema flexível que integra novos casos de uso e recursos com facilidade.
Sobre os autores
Mike Zorn é arquiteto de software na LaunchDarkly. Ele ajudou a dimensionar a infraestrutura do LaunchDarkly de cem milhões de avaliações de sinalizadores de recursos por dia para dezenas de trilhões de avaliações que são atendidas hoje em dia. Ele está na indústria de software há mais de uma década, trabalhando em organizações que vão desde o governo federal até pequenas startups.
Chinmayi Narasimhadevara é Arquiteto de Soluções focado em Analytics e Machine Learning na Amazon Web Services. Ela tem mais de 15 anos de experiência em tecnologia da informação. Ela ajuda os clientes da AWS a criar soluções avançadas, altamente escaláveis e de alto desempenho.
- Conteúdo com tecnologia de SEO e distribuição de relações públicas. Seja amplificado hoje.
- Platoblockchain. Inteligência Metaverso Web3. Conhecimento Ampliado. Acesse aqui.
- Fonte: https://aws.amazon.com/blogs/big-data/launchdarklys-journey-from-ingesting-1-tb-to-100-tb-per-day-with-amazon-kinesis-data-streams/
- 1
- 1 TB
- 10
- 100
- 15 anos
- 2017
- 2018
- a
- habilidade
- Capaz
- Sobre
- acelerar
- Conta
- Alcançar
- alcançado
- Adicional
- endereço
- adotado
- Adoção
- avançado
- vantagens
- Idade
- agregação
- Todos os Produtos
- permite
- alternativas
- Apesar
- Amazon
- Amazon EC2
- Amazon Kinesis
- Amazon Web Services
- quantidades
- analítica
- análises
- e
- Outro
- apache
- api
- Aplicação
- aplicações
- arquitetura
- aspectos
- autenticar
- autor
- automaticamente
- disponibilidade
- disponível
- média
- AWS
- AWS Lambda
- Apoiado
- Backend
- balanceador
- baseado
- Porque
- antes
- ser
- abaixo
- Melhor
- morada
- Caixa
- orçamento
- construir
- construído
- negócio
- Capacidade
- casas
- casos
- Causar
- desafios
- alterar
- mudança
- acusações
- verificar
- cliente
- Fechar
- Na nuvem
- código
- combinado
- Empresas
- Consequências
- Considerar
- consideração
- considerado
- considerando
- consumidor
- Consumidores
- Contextos
- ao controle
- Custo
- relação custo-benefício
- custos
- Crash
- Batido
- crio
- Atual
- personalizadas
- cliente
- Clientes
- dados,
- Perda de Dados
- informática
- banco de dados
- bases de dados
- dia
- década
- decidido
- profundo
- Padrão
- entregar
- demandas
- implantar
- Design
- DID
- diferente
- dramaticamente
- durabilidade
- durante
- cada
- Eficaz
- eficiência
- eficientemente
- permite
- end-to-end
- Ponto final
- garantir
- Todo
- erro
- erros
- especialmente
- essencialmente
- Éter (ETH)
- avaliar
- avaliação
- avaliações
- Mesmo
- Evento
- eventos
- eventualmente
- exemplo
- excedem
- execução
- esperado
- vasta experiência
- experiência
- Explicação
- explorar
- extra
- fatores
- falha
- Falha
- RÁPIDO
- mais rápido
- Característica
- Funcionalidades
- Federal
- Governo federal
- poucos
- Envie o
- Arquivos
- final
- Finalmente
- Primeiro nome
- Fixar
- bandeiras
- ANIMARIS
- flexível
- Fluxos
- Ruborizado
- focado
- seguinte
- da
- cheio
- totalmente
- funções
- fundamentalmente
- Ganho
- porta de entrada
- ter
- Go
- Objetivos
- Bom estado, com sinais de uso
- Governo
- gradualmente
- Growth
- guia
- manipular
- feliz
- ter
- ajudou
- ajuda
- ajuda
- altamente
- esperança
- hospedeiro
- hospedado
- Como funciona o dobrador de carta de canal
- Como Negociar
- Contudo
- HTTPS
- Centenas
- Impacto
- executar
- implementação
- implementação
- importante
- in
- Crescimento
- aumentou
- incrível
- de treinadores em Entrevista Motivacional
- independentemente
- indústria
- INFORMAÇÕES
- tecnologia da informação
- Infraestrutura
- do estado inicial,
- inovar
- integrado
- isolado
- isolamento
- emitem
- questões
- IT
- se
- viagem
- Chave
- Mangueira de dados Kinesis
- Streams de dados Kinesis
- Falta
- Idiomas
- Sobrenome
- lançado
- conduzir
- aprendido
- aprendizagem
- aproveitando
- Biblioteca
- LIMITE
- Limitado
- limites
- LINK
- carregar
- fora
- máquina
- aprendizado de máquina
- mantém
- fazer
- gerenciados
- de grupos
- muitos
- a medida
- mecanismo
- Conheça
- Memória
- migrado
- milhão
- Missão
- mais
- mover
- em movimento
- você merece...
- Cria
- rede
- Novo
- Novos Recursos
- nós
- notificação
- número
- ONE
- operacional
- otimização
- Otimize
- otimizado
- Opção
- ordem
- organizações
- original
- Outros
- Superar
- próprio
- parte
- passado
- caminho
- por cento
- percentagem
- realizar
- atuação
- realização
- permanente
- fase
- oleoduto
- plataforma
- platão
- Inteligência de Dados Platão
- PlatãoData
- posição
- possível
- Publique
- poder
- Previsível
- evitar
- Prevenção
- Prévio
- privado
- processo
- em processamento
- produtor
- Produtores
- Produto
- Produção
- Propriedades
- protocolo
- comprovado
- fornecer
- colocar
- rapidamente
- Rampa
- variando
- Taxa
- Leia
- Leitura
- pronto
- registro
- registros
- retificado
- reduzir
- reduz
- relativamente
- liberar
- confiável
- repetir
- solicitar
- pedidos
- requeridos
- Requisitos
- resultar
- retenção
- Risco
- rotas
- Execute
- mesmo
- escalável
- Escala
- cenários
- Sdk
- Segundo
- envio
- serviço
- Serviços
- conjunto
- vários
- rede de apoio social
- mostrando
- simples
- desde
- solteiro
- Tamanho
- pequeno
- sem problemas
- So
- Software
- solução
- Soluções
- alguns
- Ressentimento
- começo
- começado
- Startups
- Passo
- armazenadas
- transmitir canais
- córregos
- entraram com sucesso
- ajuda
- Suportado
- suportes
- .
- sistemas
- Profissionais
- Tecnologias
- Equipar
- inquilino
- A
- deles
- coisa
- coisas
- três
- Através da
- Taxa de transferência
- tempo
- vezes
- para
- juntos
- tolerância
- também
- topo
- Total
- tráfego
- transferência
- Transformar
- Tradução
- trilhões
- verdadeiro
- tipos
- para
- Atualizada
- us
- Uso
- usar
- caso de uso
- valor
- variedade
- vário
- verificar
- Virtual
- visibilidade
- volume
- web
- servidor web
- serviços web
- qual
- enquanto
- precisarão
- dentro
- trabalhou
- fluxos de trabalho
- trabalhar
- seria
- escrever
- escrita
- escrito
- anos
- investimentos
- zefirnet
- zero