Entonces, piensa en este productor y consumidor estándar, si simplemente usas Kafka.js o cualquier cliente que decidas usar. Los productores normales y los consumidores normales no tienen garantías sólidas. Lo que quiero decir con eso es que no te garantiza que vayas a enviar un solo mensaje en el lado del productor, podría haber duplicados. Es lo que llamamos al menos una vez. Esa es la garantía, lo que significa que puedes tener duplicados. Y en algunos sistemas, no puedes hacer eso. Si estás depositando dinero, no deberías hacer eso. Especialmente al retirar dinero de un cliente, no deberías hacer eso. Y en el lado del cliente, también puedes tener procesamiento duplicado. Esos son los valores predeterminados que obtienes si los usas. Hay soluciones para eso.
Entonces, Kafka ofrece una semántica de exactamente una vez. Eso es lo que significa EOS. Y límites de transacción. Y es muy común que tengas un patrón como ese, en el que tienes un procesador, un mensaje que se inicia como un proceso, quieres consumir el mensaje, hacer algún procesamiento y producir el mensaje en otro tema en una sola transacción. Por lo tanto, quieres asegurarte de que cuando consumas, hagas el procesamiento, algo salga mal. Si vuelves a procesar o reinicias tu sistema, procesas ese mensaje nuevamente, porque no finalizaste esos tres pasos, que es enviar ese mensaje al siguiente paso. Y para esto, debes hacer alguna configuración en Kafka.
Desde el lado del productor, debes establecer la idempotencia en verdadero. Eso garantiza que no se duplique y se envíe. Y en el lado del consumidor, debes deshabilitar la confirmación automática del desplazamiento, lo que significa que tu cliente lee el mensaje, pero ahora tienes el control. Cuando quieras decirle a Kafka que realmente procesaste este mensaje, confirmas el desplazamiento. Y también quieres establecer una propiedad llamada max in-flight request en uno, para que no haya procesamiento paralelo y puedas mantener las garantías de ordenamiento. Y en el lado del productor, en el último paso, recuerda, es consumir y luego producir, y quieres que todo esto esté en la misma transacción. Lo que quieres establecer es un ID de transacción, para que el broker pueda establecer los límites de transacción y decir que el punto es verdadero también. Y lo que esto garantiza es que cuando consumes, procesas y envías, es parte de una única transacción atómica. El cliente de Kafka, esto no es una transacción distribuida, como una transacción XA. No está garantizado que si haces una llamada a la base de datos en el lado que se revierta. Debes encargarte de eso. Está en los límites de Kafka. Es lo mismo que tu transacción normal de base de datos entre dos tablas a las que estás acostumbrado, así que ten eso en cuenta.
Algunas configuraciones del clúster, y también he terminado porque mi reloj ya está parpadeando. Debes tener al menos tres particiones y al menos dos réplicas en sincronización para tus temas para que esto funcione. Por lo tanto, si lo intentas localmente y no lo tienes, no funcionará, y también debes iniciar la transacción como puedes ver, iniciar una transacción, enviar un mensaje, enviar los desplazamientos y luego confirmar las transacciones, lo que significa que todo va a suceder o se revertirá. Y eso es básicamente lo que quieres hacer, y es realmente importante tener eso en cuenta. Eso es todo. Si quieres saber más sobre esto, escribo en esta publicación de blog específica sobre esto, y también tengo un archivo docker-compose donde tengo múltiples nodos de Kafka donde puedes probar este tipo de trabajo más avanzado en tu máquina local. Muchas gracias.
Comments