Skip to content

Consumer groups y offsets

Consumer groups permiten escalar consumo y repartir partitions entre instancias. Los offsets indican hasta donde ha leido cada grupo.

Consumer group

Un consumer group es un conjunto de consumers que colaboran leyendo un topic.

mermaid
flowchart TB
  P0["Partition 0"] --> C1["Consumer A"]
  P1["Partition 1"] --> C2["Consumer B"]
  P2["Partition 2"] --> C3["Consumer C"]

Dentro del mismo group, una partition solo se asigna a un consumer a la vez.

Varios grupos

Grupos distintos leen de forma independiente.

mermaid
flowchart LR
  T["orders.created"] --> G1["billing-service group"]
  T --> G2["email-service group"]
  T --> G3["analytics group"]

Cada grupo tiene sus propios offsets.

Offset commit

Kafka guarda offsets en el topic interno __consumer_offsets.

Un commit significa:

txt
Este grupo ya proceso hasta este offset.

Auto commit

Simple:

txt
enable.auto.commit=true

Riesgo: confirmar offsets antes de que el procesamiento real haya terminado.

Commit manual

Mas control:

txt
enable.auto.commit=false

Patron:

txt
poll -> procesar lote -> commit

Rebalance

Un rebalance reasigna partitions cuando:

  • Entra un consumer nuevo.
  • Sale un consumer.
  • Un consumer deja de enviar heartbeats.
  • Cambia la lista de topics.

Durante un rebalance puede pausarse temporalmente el consumo.

Lag

Lag es la diferencia entre el ultimo offset disponible y el offset confirmado por el grupo.

txt
lag = log_end_offset - committed_offset

Mucho lag indica que consumidores no alcanzan el ritmo de produccion.

Reprocesamiento

Puedes mover offsets:

bash
kafka-consumer-groups --bootstrap-server localhost:9092 \
  --group analytics \
  --topic orders.created \
  --reset-offsets --to-earliest --execute

Hazlo con cuidado. Reprocesar puede duplicar efectos si los consumidores no son idempotentes.

Offset earliest y latest

Configuracion:

txt
auto.offset.reset=earliest
auto.offset.reset=latest

Solo se usa si no hay offset previo valido para el grupo.

Buenas practicas

  • Monitoriza lag por grupo.
  • Usa commit manual en procesos criticos.
  • Disena consumidores idempotentes.
  • Evita procesamientos demasiado lentos dentro del poll loop.
  • Ajusta numero de partitions y consumers segun throughput.
  • Documenta como reprocesar de forma segura.