¿Apache Kafka es apropiado para su uso como cola de tareas?


Kafka divide los mensajes entrantes en particiones, de acuerdo con la partición asignada por el productor. Los mensajes de las particiones luego son consumidos por los consumidores en diferentes grupos de consumidores.

Esta arquitectura me hace desconfiar de usar Kafka como una cola de trabajo/tarea, porque tengo que especificar la partición en el momento de la producción, lo que limita indirectamente qué consumidores pueden trabajar en ella porque una partición se envía a un solo consumidor en un grupo de consumidores. Preferiría no especificar el partición antes de tiempo, de modo que cualquier consumidor está disponible para tomar esa tarea puede hacerlo. ¿Hay una manera de estructurar particiones / productores en una arquitectura Kafka donde las tareas pueden ser retiradas por el siguiente consumidor disponible, sin tener que dividir el trabajo antes de tiempo eligiendo una partición cuando se produce el trabajo?

Usar solo una partición para este tema pondría todas las tareas en la misma cola, pero luego el número de consumidores está limitado a 1 por grupo de consumidores, por lo que cada el consumidor tendría que estar en un grupo diferente. Luego, todas las tareas se distribuyen a cada grupo de consumidores, que no es el tipo de cola de trabajo que estoy buscando.

¿Apache Kafka es apropiado para su uso como cola de tareas?

Author: nephets, 2016-03-24

4 answers

Usar Kafka para una cola de tareas es una mala idea. Utilice RabbitMQ en su lugar, lo hace mucho mejor y con más elegancia.

Aunque puede usar Kafka para una cola de tareas, obtendrá algunos problemas: Kafka no permite consumir una sola partición por muchos consumidores (por diseño), por lo que si, por ejemplo, una sola partición se llena con muchas tareas y el consumidor que posee la partición está ocupado, las tareas en esa partición se "inanición". Esto también significa que el orden de consumo de las tareas en el tema no serán idénticas al orden en el que se produjeron las tareas, lo que podría causar problemas graves si las tareas deben consumirse en un orden específico (en Kafka para lograr esto, debe tener solo un consumidor y una partición, lo que significa consumo en serie por un solo nodo. Si tiene varios consumidores y varias particiones, el orden de consumo de tareas no estará garantizado en el nivel de tema).

De hecho, los temas de Kafka no son colas en computer science manner (en inglés). Cola significa Primero en entrar Primero en salir-esto no es lo que obtienes en Kafka en el nivel de tema.

Otro problema es que es difícil cambiar el número de particiones dinámicamente. Agregar o eliminar nuevos trabajadores debe ser dinámico. Si desea asegurarse de que los nuevos trabajadores obtendrán tareas en Kakfa, tendrá que establecer el número de partición al máximo de trabajadores posibles. Esto no es lo suficientemente elegante.

Así que la línea de fondo - utilizar RabbitMQ u otras colas en su lugar.

Habiendo dicho todo eso, Samza (de linkedin) está usando kafka como una especie de cola de tareas basada en streaming: Samza

 21
Author: Ofer Eliassaf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-31 08:15:43

Yo diría que esto depende de la escala. ¿Cuántas tareas anticipas en una unidad de tiempo?

Lo que describes como tu objetivo final es básicamente cómo funciona Kafka por defecto. Cuando produce mensajes, la opción predeterminada (la más utilizada) es usar el particionador aleatorio, que elige particiones en la forma de round robin, manteniendo las particiones uniformemente utilizadas (por lo que es posible evitar especificar una partición).
El propósito principal de las particiones es paralelizar el procesamiento de mensajes, por lo que deberías usarlo de esa manera.
Otra "cosa" comúnmente utilizada para la que se usan las particiones es asegurar que ciertos mensajes se consuman en el mismo orden en que se producen (luego se especifica la clave de partición de tal manera que todos estos mensajes terminen en la misma partición. Por ejemplo, usar userId como clave aseguraría que todos los usuarios se procesen de esa manera).

 5
Author: Marko Bonaci,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-24 20:07:56

Hay dos obstáculos principales al intentar usar Kafka como una cola de mensajes:

  1. Como se describe en Respuesta de Ofer, solo puede consumir una sola partición de un solo consumidor, y el orden de procesamiento está garantizado solo dentro de una partición. Entonces, si no puede distribuir las tareas de manera justa entre las particiones, esto podría ser un problema

  2. De forma predeterminada, solo puede reconocer el procesamiento de todos los mensajes hasta un punto determinado (desplazamiento). A diferencia de lo tradicional colas de mensajes, no se puede hacer reconocimiento selectivo y en caso de fallo, reintentos selectivos. Esto se puede abordar usando kmq, que agrega la capacidad individual de acks con la ayuda de un tema adicional (descargo de responsabilidad: Soy el autor de kmq).

RabbitMQ es una alternativa, por supuesto, pero también ofrece diferentes (menores) garantías de rendimiento y replicación. En resumen, los documentos de RabbitMQ indican que el broker no es tolerante a particiones. Vea también nuestra comparación de colas de mensajes con replicación de datos, mqperf.

 2
Author: adamw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-27 13:54:12

Hay mucha discusión en este tema que gira en torno al orden de ejecución de las tareas en una cola de trabajo o tarea. Yo plantearía la idea de que el orden de ejecución no debe ser una característica de una cola de trabajo.

Una cola de trabajo es un medio para controlar el uso de recursos mediante la aplicación de un número controlable de subprocesos de trabajo para completar tareas distintas. Hacer cumplir una orden de procesamiento en las tareas de una cola significa que también está haciendo cumplir una orden de finalización en las tareas de la cola que efectivamente significa que las tareas en la cola siempre se procesarán secuencialmente con la siguiente tarea procesándose solo después del FINAL de la tarea anterior. Esto significa efectivamente que tiene una sola cola de tareas con subprocesos.

Si el orden de ejecución es importante en algunas de sus tareas, entonces esas tareas deben agregar la siguiente tarea en la secuencia a la cola de trabajo al completarla. Eso o admite un tipo de trabajo secuencial que, cuando se procesa, procesa una lista de trabajos secuencialmente en un trabajador.

De ninguna manera la cola de trabajo debería ordenar su trabajo - el siguiente procesador disponible siempre debería tomar la siguiente tarea sin importar lo que haya ocurrido antes o después de que la tarea se complete.

También estaba mirando a kafka como base para una cola de trabajo, pero cuanto más lo investigo, menos se parece a la plataforma deseada.

Lo veo principalmente como un medio de sincronizar recursos dispares y no tanto como un medio de ejecución de solicitudes de trabajo dispares.

Otra área que creo que es importante en una cola de trabajo es el soporte de una priorización de tareas. Por ejemplo, si tengo 20 tareas en la cola, y una nueva tarea llega con una prioridad más alta, quiero que esa tarea salte al inicio de la línea para que la recoja el siguiente trabajador disponible. Kafka no lo permitiría.

 0
Author: Rodney P. Barbati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-15 21:47:25