Red de conocimiento informático - Conocimiento informático - Código fuente de implementación

Código fuente de implementación

Apache Kafka (Kafka para abreviar) fue originalmente un sistema de mensajería distribuida desarrollado por Linkedln. Ahora es un subproyecto de Apache. La comunidad Kafka también es muy activa y se ha convertido en el sistema de mensajería más utilizado en este campo. A juzgar por la versión, el lema de Kafka ha cambiado de "un sistema de mensajería distribuido de alto rendimiento" a "una plataforma de medios de transmisión distribuida".

En cuanto a Kafka, comenzaré desde el principio e implementaré sus principios lógicos subyacentes y su código fuente. Se recomienda leer con paciencia desde el principio. Creo que ganarás algo.

Como plataforma de datos en streaming lo más importante es tener las siguientes características.

Sistema de mensajes:

El sistema de mensajes (también llamado cola de mensajes) tiene principalmente dos modelos de mensajes: poner en cola y publicar y suscribirse. Kafka aprovecha una base de consumidores. Cuando Kafka utiliza un modelo de cola, puede distribuir el procesamiento de manera uniforme entre los miembros consumidores de un grupo de consumidores.

A continuación analizaremos varios conceptos básicos de Kafka desde diferentes ángulos e intentaremos resolver los siguientes problemas.

Después de que el productor publica el mensaje en el clúster fk, el consumidor utilizará dos modelos de consumo de mensajes: modelo push (pu) y modelo pull (sistema de mensajes basado en el modelo push, en el que el agente de mensajes registra el Estado de consumo del consumidor, después de enviar el mensaje al consumidor, marque el mensaje como consumido.

Sin embargo, este método no garantiza bien la semántica de procesamiento del mensaje, por ejemplo, después de que el agente de mensajes envía el mensaje. , cuando Los mensajes pueden perderse cuando el proceso consumidor cuelga o no recibe el mensaje debido a razones de red (porque el intermediario de mensajes ha marcado el mensaje para su consumo, pero en realidad no lo ha procesado para garantizar el envío). Al procesar la semántica del mensaje, el mensaje puede perderse. El agente debe establecer el estado en "Enviado" después de enviar el mensaje y actualizarlo a "Consumido" solo después de recibir una solicitud de confirmación del consumidor. todos los mensajes en el agente de mensajes, lo cual también es imposible.

Se almacenan múltiples registros de partición para cada tema en Kafka en el clúster de Kafka. Al mismo tiempo, para tolerancia a fallas, cada partición se replicará en múltiples. Nodos del intermediario de mensajes, uno de los cuales será la réplica maestra, su nodo será una copia de seguridad (copia esclava, también llamada copia esclava).

La copia maestra será responsable de todas las lecturas y escrituras del cliente. operaciones, y la copia de seguridad solo sincronizará los datos en la copia maestra. Ahora, cuando ocurra una falla, la copia en la copia de seguridad se elegirá como la nueva copia primaria, ya que solo la copia primaria en cada partición acepta lecturas y escrituras. cada servidor será la copia primaria para algunas particiones y la copia de respaldo para otras particiones. Todos los servidores en el clúster Kafka equilibran la carga del cliente en su conjunto.

El sistema de mensajería generalmente consta de "consumidores" productores y. Los agentes de mensajes (corredores) escriben mensajes. El intermediario leerá el mensaje del intermediario de mensajes. Para el intermediario de mensajes, el productor y el consumidor pertenecen al cliente: el productor y el consumidor enviarán las solicitudes del cliente al servidor. El servidor almacenará el mensaje y lo obtendrá respectivamente. El servidor devolverá el resultado de la respuesta al cliente.

La nueva aplicación productora utiliza el objeto de aplicación af para representar el proceso del cliente productor, en lugar de enviar el mensaje. directamente al servidor. El mensaje se coloca primero en la cola del cliente y luego el hilo de envío del mensaje envía el mensaje desde la cola al servidor Kafka en forma de sal. El Reco dACCUl'lUlato es responsable de almacenar en caché los mensajes generados por. el cliente productor y el hilo de envío (Sende) son responsables de leer la red por lotes del agregador y enviarla al servidor. Para garantizar una respuesta rápida a las solicitudes de la red del cliente, Kafka utiliza un selector (seleccione la conexión de red para leer y escribir). y dejar que la conexión de red (Netwo kCl i.ent) maneje la solicitud de red del cliente.

Cuando los mensajes se agregan al recopilador de registros, se agrupan por particiones y se colocan en la cola de cada partición. contiene los registros que se enviarán al nodo correspondiente a esa partición. El hilo de envío del cliente solo puede usar el hilo Sende para superponer cada partición del lote, obtener el nodo de script principal correspondiente a la partición y sacar el registro del lote en la columna correspondiente a la partición para enviar el mensaje.

El hilo de envío de mensajes tiene dos formas de enviar mensajes directamente según la partición, y los nodos de destino de las particiones se superponen.

Supongamos que hay dos servidores con particiones, entonces cada servidor tiene una partición. El hilo de envío de mensajes atraviesa cada toque del lote para enviar mensajes al nodo de réplica principal de la partición, y siempre hay solicitudes. Primero las agruparía por el nodo de réplica principal de la partición, todas las particiones que pertenecen al mismo nodo se juntan, por lo que siempre hay solo dos solicitudes, lo que puede reducir en gran medida la red.

El sistema de mensajería está formado por un sistema de almacenamiento productor y un consumidor. Este capítulo analiza el proceso del productor que envía mensajes al servidor. Este capítulo analiza el proceso en el que los consumidores leen mensajes escritos por productores desde el sistema de almacenamiento del servidor. Primero, comprenderé algunos conocimientos básicos de los consumidores.

Como sistema de mensajería distribuida, Kafka admite múltiples productores y consumidores, y los productores pueden publicar mensajes en diferentes particiones en diferentes nodos del clúster. Xiaofei también puede consumir mensajes en múltiples particiones en múltiples nodos en un clúster. Cuando se escribe un mensaje, varios productores pueden leer el mensaje en la misma partición. Si varios usuarios leen varias particiones al mismo tiempo, para garantizar que los diferentes datos del archivo de registro se distribuyan a diferentes usuarios, se deben utilizar métodos como la sincronización de bloqueo para controlar el archivo de registro a nivel de partición.

Por el contrario, si se acuerda que "la misma partición solo puede ser procesada por un consumidor", no se requiere sincronización de bloqueo, lo que mejora la capacidad de procesamiento del consumidor, y esto no viola la Semántica de procesamiento del mensaje: original. Requiere que varios consumidores lo procesen y ahora puede ser manejado por un consumidor. 3-Se proporciona el método de implementación más simple del sistema de mensajería. Los datos de los productores provienen de una variedad de fuentes y todos son coautores. Cuando el clúster de Kafka procesa mensajes, hay varios consumidores que comparten tareas y la lógica de procesamiento de estos consumidores es la misma.

Debido a que la partición se reasignará y el propietario de la partición cambiará, todos los consumidores detendrán el proceso de deshacer existente antes de que se reasigne la partición. Al mismo tiempo, cuando se asigna una partición a un consumidor, la información del propietario se registrará en ZK, por lo que los datos del nodo en ZK deben eliminarse primero. Una partición se puede asignar solo cuando se libera el subproceso de extracción del propietario asociado con esa partición.

Si esta información no se publica antes de redistribuir una partición, la misma partición puede ser propiedad de varios consumidores después del reequilibrio. Por ejemplo, la partición Pl es inicialmente propiedad del consumidor. Si el proceso de revocación y el nodo ZK no se liberan, entonces la partición reequilibrada Pl se asignará al consumidor, de modo que tanto los consumidores como los consumidores disfrutarán de la partición Pl. Esto obviamente no cumple con el principio de "solo se puede asignar una partición". a un consumidor" en fka. "Restricciones. Los pasos para una operación de reequilibrio son los siguientes.

Si el nodo coordinador falla, el servidor tendrá su propio mecanismo de tolerancia a fallas para elegir una nueva parte coordinadora para administrar a todos los consumidores en el grupo de consumidores. Los clientes consumidores no tienen la autoridad para realizar este trabajo. Todo lo que puede hacer es esperar un momento y preguntar al servidor si se ha seleccionado un nuevo nodo coordinador. Si el consumidor descubre que ahora hay un nodo coordinador que administra el coordinador, se conectará a esta nueva parte del coordinador. Debido a que el servidor selecciona recientemente este nodo coordinador, cada consumidor debe volver a conectarse al nodo coordinador.

Cuando un consumidor se reincorpora a un grupo de consumidores, tendrá un impacto en el trabajo de extracción del consumidor antes y después de ser asignado a una partición. El consumidor debe dejar de extraer mensajes antes de enviar la "Solicitud de unirse al grupo" y, después de recibir la partición en la "Respuesta de unirse al grupo", el cliente también puede configurar un "Restablecimiento del consumidor" personalizado antes y después de unirse al grupo de escucha de saldo. Manejar los cambios de partición adecuadamente.