Embora eu tenha me encontrado com Kafka antes, recentemente percebi que Kafka talvez possa ser usado como (a base de) um CQRS , armazenamento de eventos .
Um dos principais pontos que Kafka suporta:
- Captura / armazenamento de eventos, todos os HA, é claro.
- Arquitetura de pub / sub
- Capacidade de reproduzir o log de eventos, o que permite que novos assinantes se registrem no sistema após o fato.
É certo que eu não sou 100% versado em CQRS / Event sourcing, mas isso parece bem próximo do que um eventstore deveria ser. O engraçado é que eu realmente não consigo descobrir muito sobre Kafka sendo usado como loja de eventos, então talvez eu esteja perdendo alguma coisa.
Então, falta algo em Kafka para que seja uma boa loja de eventos? Isso funcionaria? Usando produção? Interessado em insight, links, etc.
Basicamente, o estado do sistema é salvo com base nas transações / eventos que o sistema já recebeu, em vez de apenas salvar o estado / instantâneo atual do sistema, o que geralmente é feito. (Pense nisso como um razão geral em contabilidade: todas as transações acabam chegando ao estado final). Isso permite todo tipo de coisas legais, mas basta ler os links fornecidos.
fonte
Respostas:
O Kafka deve ser um sistema de mensagens com muitas semelhanças com um armazenamento de eventos, mas para citar sua introdução:
Portanto, embora as mensagens possam ser potencialmente retidas indefinidamente, a expectativa é que elas sejam excluídas. Isso não significa que você não pode usar isso como um armazenamento de eventos, mas pode ser melhor usar outra coisa. Dê uma olhada no EventStore para uma alternativa.
ATUALIZAR
Documentação Kafka :
ATUALIZAÇÃO 2
Uma preocupação com o uso do Kafka para fornecimento de eventos é o número de tópicos necessários. Normalmente, na fonte de eventos, há um fluxo (tópico) de eventos por entidade (como usuário, produto etc.). Dessa forma, o estado atual de uma entidade pode ser reconstituído reaplicando todos os eventos no fluxo. Cada tópico do Kafka consiste em uma ou mais partições e cada partição é armazenada como um diretório no sistema de arquivos. Também haverá pressão do ZooKeeper à medida que o número de znodes aumenta.
fonte
Eu sou um dos autores originais de Kafka. O Kafka funcionará muito bem como um registro para o fornecimento de eventos. É tolerante a falhas, dimensiona para enormes tamanhos de dados e possui um modelo de particionamento embutido.
Nós o usamos para vários casos de uso deste formulário no LinkedIn. Por exemplo, nosso sistema de processamento de fluxo de código-fonte aberto, Apache Samza, vem com suporte interno para fornecimento de eventos.
Acho que você não ouve muito sobre o uso do Kafka para fornecimento de eventos, principalmente porque a terminologia do fornecimento de eventos não parece ser muito prevalente no espaço da Web do consumidor em que o Kafka é mais popular.
Eu escrevi um pouco sobre esse estilo de uso de Kafka aqui .
fonte
Continuo voltando a este controle de qualidade. E não encontrei as respostas existentes sutis o suficiente, por isso estou adicionando esta.
TL; DR. Sim ou Não, dependendo do uso da fonte de eventos.
Existem dois tipos principais de sistemas de origem de eventos, dos quais estou ciente.
Processadores de eventos a jusante = Sim
Nesse tipo de sistema, os eventos acontecem no mundo real e são registrados como fatos. Como um sistema de armazém para acompanhar paletes de produtos. Basicamente, não há eventos conflitantes. Tudo já aconteceu, mesmo que estivesse errado. (Ou seja, o palete 123456 foi colocado no caminhão A, mas foi programado para o caminhão B.) Posteriormente, os fatos são verificados quanto a exceções por meio de mecanismos de relatório. Kafka parece bem adequado para esse tipo de aplicativo de processamento de eventos downstream.
Nesse contexto, é compreensível o motivo pelo qual a Kafka a defende como uma solução de Event Sourcing. Porque é bem parecido com o modo como já é usado, por exemplo, fluxos de cliques. No entanto, as pessoas que usam o termo Event Sourcing (em oposição ao Stream Processing) provavelmente estão se referindo ao segundo uso ...
Fonte de verdade controlada por aplicativo = Não
Esse tipo de aplicativo declara seus próprios eventos como resultado de solicitações de usuários passando pela lógica de negócios. Kafka não funciona bem nesse caso por dois motivos principais.
Falta de isolamento da entidade
Esse cenário precisa da capacidade de carregar o fluxo de eventos para uma entidade específica. O motivo comum para isso é criar um modelo de gravação transitório para a lógica de negócios usar para processar a solicitação. Fazer isso é impraticável em Kafka. O uso de tópico por entidade pode permitir isso, exceto que não é um iniciador quando pode haver milhares ou milhões de entidades. Isso ocorre devido aos limites técnicos no Kafka / Zookeeper.
Um dos principais motivos para usar um modelo de gravação transitório dessa maneira é tornar as alterações da lógica de negócios baratas e fáceis de implantar.
Em vez disso, é recomendável usar o tópico por tipo para o Kafka, mas isso exigiria o carregamento de eventos para cada entidade desse tipo apenas para obter eventos para uma única entidade. Como você não pode dizer por posição de log quais eventos pertencem a qual entidade. Mesmo usando Snapshots para iniciar a partir de uma posição de log conhecida, esse pode ser um número significativo de eventos para agitar.
Falta de detecção de conflitos
Em segundo lugar, os usuários podem criar condições de corrida devido a solicitações simultâneas contra a mesma entidade. Pode ser bastante indesejável salvar eventos conflitantes e resolvê-los após o fato. Portanto, é importante ser capaz de evitar eventos conflitantes. Para dimensionar o carregamento de solicitações, é comum usar serviços sem estado, enquanto evita conflitos de gravação usando gravações condicionais (somente gravações se o último evento da entidade for #x). Simulação simultânea otimista. Kafka não suporta simultaneidade otimista. Mesmo que o apoiasse no nível do tópico, seria necessário ir até o nível da entidade para ser eficaz. Para usar o Kafka e evitar eventos conflitantes, você precisará usar um gravador com estado e serializado no nível do aplicativo. Este é um requisito / restrição arquitetural significativo.
Outras informações
Atualizar por comentário
O comentário foi excluído, mas a pergunta era algo como: o que as pessoas usam para armazenamento de eventos?
Parece que a maioria das pessoas lança sua própria implementação de armazenamento de eventos em um banco de dados existente. Para cenários não distribuídos, como back-ends internos ou produtos independentes, está bem documentado como criar um armazenamento de eventos baseado em SQL. E existem bibliotecas disponíveis no banco de dados de vários tipos. Também existe o EventStore , criado para esse fim.
Em cenários distribuídos, vi algumas implementações diferentes. O projeto Panther do Jet usa o Azure CosmosDB , com o recurso Alterar Feed para notificar os ouvintes. Outra implementação semelhante que ouvi na AWS está usando o DynamoDB com seu recurso Streams para notificar os ouvintes. A chave da partição provavelmente deve ser a identificação do fluxo para melhor distribuição de dados (para diminuir a quantidade de provisionamento em excesso). No entanto, uma repetição completa entre fluxos no Dynamo é cara (leitura e custo). Portanto, esse impl também foi configurado para o Dynamo Streams despejar eventos no S3. Quando um novo ouvinte fica online, ou um ouvinte existente deseja uma repetição completa, ele lê o S3 para recuperar o atraso.
Meu projeto atual é um cenário de vários inquilinos, e eu montei o meu em cima do Postgres. Algo como o Citus parece apropriado para escalabilidade, particionando por tentativa + fluxo.
Kafka ainda é muito útil em cenários distribuídos. É um problema não trivial expor os eventos de cada serviço a outros serviços. Uma loja de eventos não é construída para isso normalmente, mas é exatamente isso que Kafka faz bem. Cada serviço tem sua própria fonte interna de verdade (pode ser o armazenamento de eventos ou não), mas ouve Kafka para saber o que está acontecendo "fora". O serviço também pode postar eventos em Kafka para informar o "exterior" de coisas interessantes que o serviço fez.
fonte
Você pode usar o Kafka como loja de eventos, mas eu não recomendo fazê-lo, embora possa parecer uma boa escolha:
Então, antes de fazer sua escolha, você pensa duas vezes. O armazenamento de eventos como combinação de interfaces da camada de aplicação (monitoramento e gerenciamento), o armazenamento SQL / NoSQL e o Kafka como intermediário é a melhor opção do que deixar o Kafka lidar com ambas as funções para criar uma solução completa com todos os recursos.
O armazenamento de eventos é um serviço complexo que requer mais do que o Kafka pode oferecer se você for sério sobre a aplicação de sourcing de eventos, CQRS, Sagas e outros padrões na arquitetura orientada a eventos e permanecer com alto desempenho.
Sinta-se livre para desafiar minha resposta! Talvez você não goste do que eu digo sobre seu corretor favorito com muitos recursos sobrepostos, mas ainda assim, o Kafka não foi projetado como armazenamento de eventos, mas mais como corretor e buffer de alto desempenho ao mesmo tempo para lidar com produtores rápidos e cenários lentos de consumidores, por exemplo.
Consulte a estrutura de código-fonte aberto event microservices para descobrir mais sobre os possíveis problemas: http://eventuate.io/
Atualização a partir de 8 de fevereiro de 2018
Não incorporo novas informações nos comentários, mas concordo com alguns desses aspectos. Esta atualização é mais sobre algumas recomendações para a plataforma orientada a eventos de microsserviço. Se você é sério sobre o design robusto dos microsserviços e o desempenho mais alto possível em geral, fornecerei algumas dicas que podem lhe interessar.
Se você se pergunta sobre desempenho, pode comparar-se ao conjunto de benchmarks existente. https://github.com/networknt/microservices-framework-benchmark
Não use Kafka :-)) É meia piada. Quero dizer, enquanto Kafka é ótimo, é outro sistema centrado no corretor. Acho que o futuro está nos sistemas de mensagens sem corretor. Você pode se surpreender, mas existem sistemas mais rápidos que os Kafka :-), é claro que você deve descer para o nível mais baixo. Olhe para Chronicle.
Para o armazenamento de eventos, recomendo a extensão superior do Postgresql chamada TimescaleDB, que se concentra no processamento de dados de séries temporais de alto desempenho (eventos são séries temporais) em grande volume. É claro que o CQRS, recursos de fonte de eventos (repetição, etc.) são construídos no framework light4j, prontos para usar, que usa o Postgres como pouco armazenamento.
Para mensagens, tente olhar para Chronicle Queue, Map, Engine, Network. Quero dizer, livrar-se dessas soluções centradas em corretores à moda antiga e usar o sistema de micro messaging (incorporado). A fila de crônicas é realmente ainda mais rápida que Kafka. Mas eu concordo que não é tudo em uma solução e você precisa fazer algum desenvolvimento, caso contrário você compra a versão Enterprise (paga uma). No final, o esforço para construir a partir do Chronicle sua própria camada de mensagens será pago, removendo o ônus de manter o cluster Kafka.
fonte
Sim, você pode usar o Kafka como uma loja de eventos. Funciona muito bem, especialmente com a introdução do Kafka Streams , que fornece uma maneira nativa do Kafka de processar seus eventos no estado acumulado que você pode consultar .
A respeito de:
Isso pode ser complicado. Eu cobri isso em detalhes aqui: https://stackoverflow.com/a/48482974/741970
fonte
Sim, o Kafka funciona bem no modelo de fornecimento de eventos, especialmente o CQRS; no entanto, você deve tomar cuidado ao definir TTLs para tópicos e sempre lembre-se de que o Kafka não foi projetado para este modelo, mas podemos usá-lo muito bem.
fonte
Eu acho que você deve olhar para o quadro axônio, juntamente com o apoio a Kafka
fonte