[Kafka de la serie 5 de la entrada al abandono] Estrategia de consumo en profundidad de la arquitectura Kafka

En el blog anterior [Kafka From Getting Started to Abandoning Series Four] Kafka Architecture Deep-Producer Strategy , un análisis detallado de estrategias de productor más complejas, este blog hablará sobre estrategias de consumidor relativamente simples.

Los patrones de consumo

Los mensajes se pueden entregar de dos maneras, una es que el corredor los empuja al consumidor, la otra es que el consumidor los extrae del corredor. Cada uno de estos dos métodos tiene ventajas y desventajas:

  • El modo push es difícil de adaptar a consumidores con diferentes tasas de consumo, porque la tasa de envío de mensajes la determina el corredor. Su objetivo es entregar mensajes lo más rápido posible, pero esto puede hacer que los consumidores lleguen demasiado tarde para procesar los mensajes. Las manifestaciones típicas son la denegación de servicio y la congestión de la red.
  • El modo pull puede consumir mensajes a un ritmo adecuado según la capacidad de consumo del consumidor. La desventaja del modo pull es que si Kafka no tiene datos, los consumidores pueden caer en un bucle y devolver datos vacíos todo el tiempo.

Para Kafka, el modo pull es más adecuado. Puede simplificar el diseño del corredor. El consumidor puede controlar de forma independiente la tasa de consumo de mensajes y el consumidor puede controlar el consumo por sí mismo:

  • Controle la forma de consumo: se puede consumir en lotes o artículo por artículo , y se pueden seleccionar diferentes métodos de envío para lograr diferentes semánticas de transmisión
  • Mecanismo de devolución de tiempo de espera: los consumidores de Kafka pasarán un tiempo de espera del parámetro de duración cuando consuman datos. Si actualmente no hay datos disponibles para el consumo, el consumidor esperará un período de tiempo antes de regresar. Este período de tiempo es el tiempo de espera

Las demandas de los consumidores de Kafka pueden satisfacerse mediante la atracción y determinadas estrategias. requiere atención:

  • Si el número de subprocesos consumidores es mayor que el número de parches, algunos subprocesos no recibirán el mensaje;
  • Si el número de paticiones es mayor que el número de subprocesos que consumen, algunos subprocesos recibirán varios mensajes de patición;
  • Si un hilo consume varias parcelas, no se puede garantizar el orden de los mensajes que recibe y los mensajes dentro de una parición están ordenados.

Es necesario señalar estos tres puntos, la relación entre el consumo de mensajes y el número de particiones.

Estrategia de asignación de particiones

Hay varios consumidores en un grupo de consumidores y varias particiones en un tema, por lo que la asignación de particiones está obligada a estar involucrada, es decir, para determinar qué consumidor consume esa partición. Kafka tiene tres estrategias de asignación: RoundRobin, Range, Sticky . Independientemente de la estrategia, cuando la cantidad de consumidores en el grupo de consumidores cambia [aumenta o disminuye] o la partición del tema de suscripción aumenta, se activará la reasignación

Estrategia de sonó

La estrategia de asignación de rango es para cada tema. Primero , las particiones en el mismo tema se ordenan por número de serie y los hilos del consumidor se ordenan alfabéticamente . Luego, divida el número de particiones por el número de subprocesos consumidores para determinar cuántas particiones consume cada subproceso consumidor. Si no puede dividir, los primeros subprocesos del consumidor consumirán una partición más. Por supuesto, la desventaja de esto es que la distribución a cada consumidor en cada grupo es desigual . Los ejemplos son los siguientes:

Inserte la descripción de la imagen aquí
De esta manera, ConsumerA soportará cada vez más presión.

Estrategia de RoudRobin

La estrategia de RoudRobin es también la estrategia de sondeo. El principio de la estrategia de RoundRobin es ordenar las particiones de todos los consumidores en el grupo de consumidores y todos los temas suscritos por los consumidores en orden lexicográfico , y luego asignar las particiones a cada consumidor una por una a través del algoritmo de sondeo. Por:

  • Si en el mismo grupo de consumidores, todos los consumidores se suscriben al mismo mensaje, la distribución de particiones de la estrategia RoundRobin será uniforme.
  • Si dentro del mismo grupo de consumidores, los mensajes suscritos no son los mismos, cuando se realiza la asignación de partición, no es una asignación de sondeo completa, lo que puede causar una asignación de partición desigual. Si un consumidor no se suscribe a un tema en el grupo de consumidores, cuando se asigne la partición, el consumidor no se asignará a ninguna partición de este tema.

La ventaja de esto es que la distribución es más equilibrada .
Inserte la descripción de la imagen aquí

Por supuesto, la premisa es que cada consumidor del mismo grupo de consumidores debe suscribirse al mismo tema.

Estrategia pegajosa

Esta estrategia de partición se introdujo a partir de la versión 0.11 y tiene dos propósitos principales

  • La distribución de la partición debe ser lo más uniforme posible
  • La asignación de partición debe ser la misma que la última asignación

Análisis de ejemplo: Por ejemplo, hay 3 consumidores (C0, C1, C2), todos se suscriben a 2 temas (T0 y T1) y cada tema tiene 3 particiones (p0, p1, p2), luego el suscrito Todas las particiones se pueden identificar como T0p0, T0p1, T0p2, T1p0, T1p1, T1p2. En este momento, después de usar la estrategia de asignación Sticky, el resultado de la asignación de la partición es el mismo que el de RoudRobin:
Inserte la descripción de la imagen aquí
pero si se asume que C2 falla y sale del grupo de consumidores, entonces la partición debe ser reequilibrada. Si se usa la estrategia de asignación RoundRobin, seguirá el consumo C0 y C1 realizan una nueva asignación de encuestas y los resultados después del reequilibrio son los siguientes:
Inserte la descripción de la imagen aquí

Pero si se usa la estrategia de asignación Sticky, el resultado después del reequilibrio se verá así:

Inserte la descripción de la imagen aquí
Aunque se desencadenó la redistribución, se memorizaron los resultados de la última asignación de C0 y C1. La ventaja de esto es que después de que ocurre la redistribución de la partición, es posible para la misma partición que el consumidor anterior y el consumidor recién asignado no sean los mismos, y la mitad del procesamiento para el consumidor anterior también estará en el consumidor recién asignado. Procéselo de nuevo, entonces los recursos del sistema se desperdiciarán . El uso de la estrategia Sticky puede hacer que la estrategia de asignación tenga cierta "rigidez" y hacer que las dos asignaciones sean lo mismo posible, lo que puede reducir la pérdida de recursos del sistema y otras situaciones anormales.

Mantenimiento de compensación

En realidad, cuando los consumidores consumen datos, puede haber varias fallas que pueden causar tiempo de inactividad. En este momento, si el consumidor se recupera más tarde, debe continuar consumiendo desde la ubicación antes de la falla , en lugar de desde el principio . Empiece a consumir. Por lo tanto, los consumidores deben registrar qué compensación han consumido en tiempo real, de modo que puedan seguir consumiendo después de la posterior recuperación de fallas. Antes de la versión 0.9 de Kafka, el consumidor guardaba el desplazamiento en Zookeeper de forma predeterminada. A partir de la versión 0.9, el consumidor guarda el desplazamiento en un tema integrado de Kafka de forma predeterminada. El tema es __consumer_offsets: en el
Inserte la descripción de la imagen aquí
mismo grupo, al expandir dinámicamente la asignación de particiones El consumidor recién ingresado luego consume el mensaje de partición en lugar de volver a consumir. La compensación se divide según: grupo + tema + partición , para garantizar que las máquinas del grupo puedan seguir consumiendo cuando haya un problema

Prueba de grupo de consumidores

Modifique el archivo de configuración de la máquina para que la máquina 102 y la máquina 103 estén en un grupo:
Inserte la descripción de la imagen aquí
luego inicie el productor en 101 para enviar mensajes y reciba mensajes en 102 y 103
Inserte la descripción de la imagen aquí
al mismo tiempo : encontró que solo la máquina 102 recibió el mensaje al mismo tiempo: la
Inserte la descripción de la imagen aquí
máquina 103 no lo recibió Cualquier mensaje:
Inserte la descripción de la imagen aquí
los criterios de consumo de Kafka están verificados: la misma partición en el mismo grupo solo puede ser consumida por un consumidor. Es comprensible que si varios consumidores en un grupo consumen la misma partición, ¿cómo garantiza el grupo de consumidores un mensaje de partición única? ¿Y el pedido?

Supongo que te gusta

Origin blog.csdn.net/sinat_33087001/article/details/108398002
Recomendado
Clasificación