tutorial quickstart kafka applications java distributed-computing apache-kafka

java - quickstart - ¿Qué determina la compensación del consumidor de Kafka?



kafka java (3)

Además hay más compensaciones.retención.minutos. Si el tiempo desde la última confirmación es> offsets.retention.minutes , entonces auto.offset.reset también se auto.offset.reset

Soy relativamente nuevo en Kafka. He experimentado un poco con él, pero algunas cosas no me quedan claras con respecto a la compensación del consumidor. Por lo que he entendido hasta ahora, cuando un consumidor comienza, el desplazamiento desde el que comenzará a leer está determinado por la configuración de configuración auto.offset.reset ( auto.offset.reset si estoy equivocado).

Ahora, por ejemplo, digamos que hay 10 mensajes (compensaciones de 0 a 9) en el tema, y ​​un consumidor consumió 5 de ellos antes de que cayera (o antes de que matara al consumidor). Luego diga que reinicio ese proceso del consumidor. Mis preguntas son:

  1. Si auto.offset.reset se establece en el smallest , ¿siempre comenzará a consumir desde el desplazamiento 0?

  2. Si auto.offset.reset se establece en el largest , ¿comenzará a consumir desde el desplazamiento 5?

  3. ¿El comportamiento con respecto a este tipo de escenario es siempre determinista?

No dude en comentar si algo en mi pregunta no está claro. Gracias por adelantado.


Es un poco más complejo de lo que describiste. La configuración auto.offset.reset SOLO si su grupo de consumidores no tiene un desplazamiento válido confirmado en algún lugar (2 almacenes de desplazamiento compatibles ahora son Kafka y Zookeeper). Y también depende del tipo de consumidor que use.

Si utiliza un consumidor de Java de alto nivel, imagine los siguientes escenarios:

  1. Tiene un consumidor en un grupo de consumidores group1 que ha consumido 5 mensajes y ha muerto. La próxima vez que inicie este consumidor, ni siquiera usará esa configuración de auto.offset.reset y continuará desde el lugar donde murió porque simplemente obtendrá el desplazamiento almacenado del almacenamiento de desplazamiento (Kafka o ZK como mencioné).

  2. Tiene mensajes en un tema (como lo describió) y comienza un consumidor en un nuevo grupo de consumidores group2 . No hay ningún desplazamiento almacenado en ningún lado y esta vez la configuración auto.offset.reset decidirá si comenzar desde el principio del tema (el smallest ) o desde el final del tema (el largest )

Una cosa más que afecta qué valor de compensación corresponderá a las configuraciones largest smallest y smallest largest es la política de retención de registros. Imagine que tiene un tema con retención configurada en 1 hora. Produce 5 mensajes y luego, una hora más tarde, publica 5 mensajes más. El desplazamiento largest seguirá siendo el mismo que en el ejemplo anterior, pero el smallest no podrá ser 0 porque Kafka ya eliminará estos mensajes y, por lo tanto, el desplazamiento más pequeño disponible será 5 .

Todo lo mencionado anteriormente no está relacionado con SimpleConsumer y cada vez que lo ejecute, decidirá por dónde comenzar usando la configuración auto.offset.reset .


Solo una actualización: desde Kafka 0.9 en adelante, Kafka está utilizando una nueva versión Java del consumidor y los nombres de los parámetros auto.offset.reset han cambiado; Del manual:

Qué hacer cuando no hay compensación inicial en Kafka o si la compensación actual ya no existe en el servidor (por ejemplo, porque esos datos se han eliminado):

más temprano : restablece automáticamente el desplazamiento al primer desplazamiento

último : restablecer automáticamente el desplazamiento al último desplazamiento

none : lanza una excepción al consumidor si no se encuentra una compensación previa para el grupo de consumidores

cualquier otra cosa: lanzar una excepción al consumidor.

Pasé algún tiempo para encontrar esto después de verificar la respuesta aceptada, así que pensé que podría ser útil para la comunidad publicarla.