De acordo com o site Kafka :
"O Kakfa é usado para criar pipelines de dados em tempo real e aplicativos de streaming " .
Pesquisando na Internet em toda parte, encontrei a seguinte definição geralmente aceita do que são " dados de fluxo ":
- Dados de fluxo são dados que fluem contiguamente de uma fonte para um destino em uma rede; e
- Os dados do fluxo não são de natureza atômica, o que significa que qualquer parte do fluxo de dados é significativa e processável, em oposição a um arquivo cujos bytes não significam nada, a menos que você tenha todos eles; e
- Os dados do fluxo podem ser iniciados / parados a qualquer momento; e
- Os consumidores podem anexar e desanexar de um fluxo de dados à vontade e processar apenas as partes desejadas
Agora, se algo que eu disse acima estiver incorreto, incompleto ou totalmente errado, comece me corrigindo! Supondo que estou mais ou menos no caminho certo, então ...
Agora que entendo o que são "dados em fluxo", entendo o que Kafka e Kinesis querem dizer quando se autodenominam como middleware de processamento / intermediação para aplicativos com dados em fluxo. Mas isso despertou meus interesses: o "fluxo de middleware" como Kafka ou Kinesis pode / deve ser usado para dados que não são de fluxo contínuo, como os intermediários de mensagens tradicionais? E vice-versa: os MQs tradicionais como RabbitMQ, ActiveMQ, Apollo etc. podem ser usados para transmitir dados?
Vamos dar um exemplo em que um aplicativo enviará sua barragem constante de mensagens JSON que precisam ser processadas e o processamento é bastante complexo (validação, transformações nos dados, filtragem, agregações etc.):
- Caso nº 1: as mensagens são cada quadro de um filme; essa é uma bagagem JSON por quadro de vídeo que contém os dados do quadro e alguns metadados de suporte
- Caso 2: As mensagens são dados de séries temporais, talvez os batimentos cardíacos de alguém em função do tempo. Portanto, a mensagem nº 1 é enviada representando meu batimento cardíaco em t = 1, a mensagem nº 2 contém meu batimento cardíaco em t = 2, etc.
- Caso nº 3: os dados são completamente díspares e não relacionados ao tempo ou como parte de qualquer "fluxo de dados". Talvez os eventos de auditoria / segurança sejam disparados quando centenas de usuários navegam no aplicativo clicando nos botões e realizando ações
Com base em como o Kafka / Kinesis é cobrado e no meu entendimento sobre o que são "dados de streaming", eles parecem candidatos óbvios para os Casos 1 (dados de vídeo contíguos) e 2 (dados de séries temporais contíguas). No entanto, não vejo nenhuma razão para que um mediador de mensagens tradicional como o RabbitMQ não possa lidar com essas duas entradas com eficiência.
E no Caso # 3, somos fornecidos apenas a um evento que ocorreu e precisamos processar uma reação a esse evento. Então, para mim, isso diz respeito à necessidade de um corretor tradicional como o RabbitMQ. Mas também não há razão para que Kafka ou Kinesis não possam lidar com o processamento de dados de eventos.
Então, basicamente, estou procurando estabelecer uma rubrica que diz: Tenho X dados com características Y. Eu deveria usar um processador de fluxo como o Kafka / Kinesis para lidar com isso. Ou, inversamente, um que me ajude a determinar: eu tenho dados W com características Z. Eu devo usar um intermediário de mensagens tradicional para lidar com isso.
Por isso, pergunto: Quais fatores sobre os dados (ou não) ajudam a orientar a decisão entre o processador de fluxo ou o intermediário de mensagens, pois ambos podem lidar com dados de fluxo contínuo e ambos podem lidar com dados de mensagem (sem fluxo contínuo)?
Kafka / Kinesis é modelado como um fluxo. Um fluxo tem propriedades diferentes das mensagens.
Geralmente, use Kafka para processamento de fluxo offline, use filas de mensagens para mensagens cliente-servidor em tempo real.
Exemplos de casos de uso do pivotal :
Às vezes, pode ser útil usar os dois! Por exemplo, no Caso de Uso 2, se esse fosse um fluxo de dados de um marcapasso, eu faria com que o marcapasso transmitisse dados de pulsação para uma fila de mensagens RabbitMQ (usando um protocolo legal como o MQTT), onde são processados imediatamente para veja se o coração da fonte ainda está batendo. Isso poderia alimentar um painel e um sistema de resposta a emergências. A fila de mensagens também depositaria os dados da série temporal no Kafka, para que pudéssemos analisar os dados da pulsação ao longo do tempo. Por exemplo, podemos implementar um algoritmo para detectar doenças cardíacas observando tendências no fluxo de batimentos cardíacos.
fonte
KafkaProducer
,Kafka
eKafkaConsumer
. Digamos queKafkaProducer
mora dentro de um aplicativo Java, e issoKafkaConsumer
está sendo executado em algum aplicativo / back-end Ruby.KafkaProducer
enviaMessage1
para Kafka que precisa ser transformado viaFunction1
. Onde ficaFunction1
o código? No Kafka (apropriado) ou dentro doKafkaConsumer
(aplicativo Ruby)?