topic kafka , descripción de la partition (producer, consumer , factor de replication , offset)
Hola, esto es codeshow.
En este momento, aprenderemos sobre topic y partition en kafka .
Para usar kafka, debe tener un topic.
Con base en este topic, los producer publish mensajes,
el consumer se suscribe a los mensajes.
Ejecute kafka para crear un topic .
Consulte el video anterior para conocer la configuración del entorno.
Ejecute devcontainers para practicar kafka .
Espere hasta que el container se ejecute.
Cuando el container termine de ejecutarse, abriremos docker desktop.
Ejecute shell en el container kafka .
Para la búsqueda de topic , utilice la option de lista de topics kafka .
kafka-topics --bootstrap-server kafka:9092 --list
Confirmé que no hay ningún topic, excepto los schemas y offsets de consumer de topic creados de forma predeterminada.
Cree un topic usando la option create del comando kafka- topics .
kafka-topics --bootstrap-server kafka:9092 --create --topic hello --partitions 1 --replication-factor 1
Creé un topic con el nombre hello con el comando de topics kafka .
El nombre del topic se especifica mediante la option de nombre.
La option del factor de replicación es una option para seleccionar cuántas copias de datos de partition hacer.
Establecí el valor del factor de réplica tanto como el número de nodos kafka .
Los valores más altos incurren en el costo de copiar particiones entre nodos, lo que afecta el rendimiento.
En cambio, si el valor es pequeño, los datos pueden perderse en caso de falla de kafka .
Normalmente se recomienda un valor de 3 o superior.
Como referencia, se produce un error si coloca un factor de replication mayor que la cantidad de nodos kafka en el momento de la create .
kafka-topics --bootstrap-server kafka:9092 --create --topic error --partitions 1 --replication-factor 4
Explicaré las partitions con otra option .
La partition es información muy importante en kafka.
La option de particiones es información que establece en cuántos topic dividir.
Si un producer publish 100 topic y este topic solo tiene 1 partition,
100 topic se apilan en 1 partition.
Si un consumer tarda 1 minuto en procesar 1 topic.
Tomará 100 minutos procesar 100 topic .
Si establece la partition en 4, los topic se apilan en 25 en cada una de las 4 particiones.
Dado que una partition puede tener como máximo un consumer,
Ahora puede agregar 3 consumer tanto como aumente el número de particiones.
El tiempo de procesamiento se puede reducir en 1/4 de 100 minutos a 25 minutos.
Practicaremos los contenidos hasta ahora usando el shell.
Practicaré producer y consumer sobre el topic hello .
Ejecute la terminal en el container kafka .
Coloca al producer a la izquierda y al consumer a la derecha.
Conéctese a kafka usando el comando del producer de la console kafka .
kafka-console-producer --bootstrap-server kafka:9092 --topic hello
El producer está conectado al broker de kafka .
Conéctese a kafka mediante el comando del consumer de la console kafka .
La partition aumenta secuencialmente desde el índice 0.
En la práctica, dado que el size de la partición es 1, solo se puede usar la partition 0.
Introduzca el partition 0 como option .
kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 0
Ingrese el message de hello para el producer .
Puede verificar hello en consumer .
Entonces, ¿pueden varios consumer conectarse a una partition ?
Ejecutemos una terminal adicional y agreguemos un consumer.
kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 0
El consumer se conecta sin problemas.
Entonces, ¿qué sucede cuando publish un mensaje como producer ?
Hay dos escenarios.
- Los mensajes se entregan secuencialmente, una vez en el orden de los consumer .
Esto se llama el round robin . - Todos los mensajes se envían a todos los consumer.
El nombre se llama broadcasting.
Ingrese el mensaje hello1 como producer para verificar la operación.
Aparece un mensaje hello1 en ambos consumer.
Introduce el mensaje hello2 de nuevo como producer.
Aparece un mensaje hello2 en ambos consumer.
En kafka , todos los consumer conectados a la misma partition reciben mensajes a través de broadcasting .
Como referencia, rabbit mq, otro broker de message , puede conectar varios worker a una queue .
Y con round robin, los worker reciben mensajes secuencialmente.
Esta parte funciona de manera diferente a kafka, por lo que aquellos que hayan experimentado primero con rabbit mq pueden confundirse.
rabbit mq aumenta el rendimiento al aumentar el size de los worker en una queue ,
kafka aumenta el rendimiento al aumentar el size de partición de un topic .
En este ejercicio, cambiaremos el número de partition.
Aumentemos el número de partition de 1 a 2.
Salga del producer presionando ctrl c.
Aumentemos el size de la partición a 2 usando la option alter del comando de topics de kafka .
kafka-topics --bootstrap-server kafka:9092 --alter --partitions 2 --topic hello
Verifique la información de la partición con la describe de los topics de kafka .
kafka-topics --bootstrap-server kafka:9092 --topic hello --describe
Como referencia, también puede verificar el tamaño de partition aumentado de 2 en la topic de AKHQ .
Ejecute producer nuevamente y agregue consumer a la partition #1 recién agregada.
kafka-console-producer --bootstrap-server kafka:9092 --topic hello
Finalice el consumer conectado a la partition 0 existente y conecte el consumer a la nueva partition 1.
kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 0
kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 1
Cree un número aleatorio de mensajes con el producer.
Hay dos consumer, pero el topic se divide y se entrega a un solo consumer.
Esta es la cache en que kafka funciona cuando no hay una key .
Si no hay key, el primer número de partition enviado cache y el topic se reenvía sólo a esta partition .
Si no hay key , no tiene sentido aumentar la partition porque solo se usa una partition .
En otras palabras, la key es información importante que determina la partition en la que topic en kafka .
Añadiremos una key para que los topic queden bien divididos y almacenados entre partition .
Agregue la option de property al producer y ejecútelo nuevamente.
kafka-console-producer --bootstrap-server kafka:9092 --topic hello --property "key.separator=-" --property "parse.key=true"
Pongamos un valor aleatorio como producer.
Ahora puede ver que el topic se divide en partition y se guarda.
En particular, puede verificar que la misma key se publish en la misma partition a través del consumer.
Usando la option de separator de claves, se publish la key antes del guión y el value después.
a es la key y b es el value.
Como referencia, en el pasado, solo se publish el value hello sin key .
Si los valores que preceden al guión son los mismos, la key es la misma.
Es importante destacar que la misma key siempre se almacena en la misma partition.
Sin embargo, si las key son diferentes, se almacenan en la misma partition o en partition diferentes.
Para entender esta parte, veamos cómo manejar las key en kafka .
kafka hash la key y calcula el resto tanto como el número de nodos kafka , y determina el valor del resultado como el partition .
Dado que ahora hay dos partition, solo 0 y 1 pueden aparecer como números de partition .
Como referencia, el hash usa murmur2 hash.
Un punto importante que debe comprender acerca de las partition es que kafka solo garantiza el orden de los topic partition .
Es decir, a la hora de publish topic cuyo orden sea importante, ponerlos en la misma partition.
Verifiqué que el key siempre se almacena en la misma partition,
Para topic donde el orden es importante, ¡asegúrese de usar la misma key!
A continuación, explicaré el offset de la partition .
kafka se diferencia de la queue de message existente en que no elimina los mensajes de la queue después del consume .
Las particiones son similares a los arreglos.
Los topic de una partition se almacenan en orden, como los elementos de una matriz.
Así como accede a un valor de matriz por índice, puede consume desde un índice específico de la partition a través de offset .
Como referencia, cada partition tiene el último offset.
Entonces, si un nuevo consumer se conecta sin la option de compensación, consume desde la última offset .
Sin embargo, si se proporciona una option de compensación, la información de offset se consume primero.
Como ejercicio, daremos dos comandos a la terminal.
- Ordene al consumer que ejecute desde el offset 0.
- Comando para ejecutar consumer sin comando de offset .
kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 1 --offset 0
kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 1
Si le das a la option índice de compensación 0, puedes comprobar que se vuelve a ejecutar desde el principio.
Si la option de compensación no está presente, la offset predeterminada es la más reciente.
consume solo topic recién publish .
Finalmente, como una restricción importante en las partition,
No puede poner un valor más pequeño para el size de la partition .
Solo se pueden ingresar valores más grandes para el size de la partition .
Daré el comando alter para reducir la partition de 2 a 1.
kafka-topics --bootstrap-server kafka:9092 --alter --partitions 1 --topic hello
Puede ver un mensaje de error que le indica que establezca la option de partition en un valor superior a 2.
Con esto concluye la explicación de los topic y partition de kafka .
La próxima vez, veremos cómo usar los groups de consumer .
Como referencia, en lugar de que el consumer consume directamente la partition ,
Los groups de consumer se utilizan más en la práctica.
Para comprender mejor estos groups de consumer , esta clase
Tuve tiempo para aprender la partition.
La configuración de notificación de suscripción y me gusta es muy útil para los creadores de contenido.
gracias