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)?