Según el sitio de Kafka :
" Kakfa se utiliza para construir canalizaciones de datos en tiempo real y aplicaciones de transmisión " .
Buscando en Internet a lo largo y ancho, he encontrado la siguiente definición generalmente aceptada de lo que es " transmisión de datos ":
- Los datos de flujo son datos que fluyen de manera contigua desde un origen a un destino a través de una red; y
- Los datos de flujo no son de naturaleza atómica, lo que significa que cualquier parte de un flujo de datos que fluye es significativa y procesable, a diferencia de un archivo cuyos bytes no significan nada a menos que tenga todos ellos; y
- Los datos de flujo se pueden iniciar / detener en cualquier momento; y
- Los consumidores pueden adjuntar y desconectarse de una secuencia de datos a voluntad, y procesar solo las partes que deseen
Ahora bien, si algo de lo que dije anteriormente es incorrecto, incompleto o totalmente incorrecto, ¡comience por corregirme! Asumiendo que estoy más o menos encaminado, entonces ...
Ahora que entiendo qué es la "transmisión de datos", entiendo lo que Kafka y Kinesis quieren decir cuando se consideran a sí mismos como middleware de procesamiento / intermediación para aplicaciones con transmisión de datos. Pero ha despertado mis intereses: ¿se puede / debe "transmitir middleware" como Kafka o Kinesis para datos que no se transmiten, como los corredores de mensajes tradicionales? Y viceversa: ¿pueden / deberían usarse MQ tradicionales como RabbitMQ, ActiveMQ, Apollo, etc. para transmitir datos?
Tomemos un ejemplo en el que una aplicación enviará su constante descarga de mensajes JSON que deben procesarse, y el procesamiento es bastante complejo (validación, transformación de los datos, filtrado, agregaciones, etc.):
- Caso n. ° 1: los mensajes son cuadros de una película; es un mensaje JSON por cuadro de video que contiene los datos del cuadro y algunos metadatos de soporte
- Caso # 2: Los mensajes son datos de series de tiempo, tal vez el latido de alguien en función del tiempo. Entonces, el mensaje n. ° 1 se envía representando mi latido en t = 1, el mensaje n. ° 2 contiene mi latido en t = 2, etc.
- Caso # 3: Los datos son completamente dispares y no están relacionados por tiempo o como parte de cualquier "flujo de datos". Quizás eventos de auditoría / seguridad que se disparan cuando cientos de usuarios navegan por la aplicación haciendo clic en los botones y realizando acciones
Basado en cómo se facturan los Kafka / Kinesis y en mi comprensión de lo que son los "datos de transmisión", parecen ser candidatos obvios para los Casos n. ° 1 (datos contiguos de video) y n. ° 2 (datos contiguos de series de tiempo). Sin embargo, no veo ninguna razón por la cual un agente de mensajes tradicional como RabbitMQ no pueda manejar eficientemente ambas entradas también.
Y con el Caso # 3, solo se nos proporciona un evento que ha ocurrido y necesitamos procesar una reacción a ese evento. Entonces, para mí esto habla de necesitar un corredor tradicional como RabbitMQ. Pero tampoco hay razón para que Kafka o Kinesis no puedan manejar el procesamiento de datos de eventos.
Básicamente, estoy buscando establecer una rúbrica que diga: Tengo datos X con características Y. Debería usar un procesador de flujo como Kafka / Kinesis para manejarlo. O, por el contrario, uno que me ayuda a determinar: tengo datos W con características Z. Debería usar un agente de mensajes tradicional para manejarlo.
Entonces, pregunto: ¿Qué factores sobre los datos (o de otro modo) ayudan a dirigir la decisión entre el procesador de flujo o el intermediario de mensajes, ya que ambos pueden manejar datos de transmisión y ambos pueden manejar datos de mensajes (sin transmisión)?
Kafka / Kinesis se modela como una secuencia. Una secuencia tiene propiedades diferentes que los mensajes.
En general, use Kafka para el procesamiento de flujo fuera de línea, use colas de mensajes para mensajes cliente-servidor en tiempo real.
Ejemplos de casos de uso de pivotal :
¡A veces puede ser útil usar ambos! Por ejemplo, en el caso de uso n.º 2, si se tratara de una secuencia de datos de un marcapasos, diría que el marcapasos transmita datos de latidos a una cola de mensajes RabbitMQ (usando un protocolo genial como MQTT) donde se procesa inmediatamente para mira si el corazón de la fuente aún late. Esto podría alimentar un tablero de instrumentos y un sistema de respuesta de emergencia. La cola de mensajes también depositaría los datos de series temporales en Kafka para que pudiéramos analizar los datos de latidos a lo largo del tiempo. Por ejemplo, podríamos implementar un algoritmo para detectar enfermedades del corazón notando tendencias en la corriente del latido del corazón.
fuente
KafkaProducer
,Kafka
yKafkaConsumer
. Digamos queKafkaProducer
vive dentro de una aplicación Java, y queKafkaConsumer
se ejecuta en alguna aplicación / backend de Ruby.KafkaProducer
envíaMessage1
a Kafka que necesita ser transformado a través deFunction1
. ¿Dónde viveFunction1
el código? ¿En Kafka (correcto) o dentro deKafkaConsumer
(la aplicación Ruby)?