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:
-
Si
auto.offset.reset
se establece en elsmallest
, ¿siempre comenzará a consumir desde el desplazamiento 0? -
Si
auto.offset.reset
se establece en ellargest
, ¿comenzará a consumir desde el desplazamiento 5? -
¿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:
-
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 deauto.offset.reset
y continuará desde el lugar donde murió porque simplemente obtendrá el desplazamiento almacenado del almacenamiento de desplazamiento (Kafka o ZK como mencioné). -
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ónauto.offset.reset
decidirá si comenzar desde el principio del tema (elsmallest
) o desde el final del tema (ellargest
)
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.