¿Qué hace Construcción de consumidores de Kafka?
Cuándo usar
- Escribir o depurar consumidores/productores de Kafka.
- Elegir estrategia de confirmación de offsets y garantías de entrega.
- Ajustar paralelismo de grupos de consumidores, rebalanceo o manejo de mensajes envenenados.
- NO usar para procesamiento de flujos/ventanas (usar
processing-streaming-data).
Flujo de trabajo
- [ ] Dimensionar particiones según el paralelismo objetivo (consumidores <= particiones)
- [ ] Confirmar offsets DESPUÉS del procesamiento exitoso
- [ ] Hacer que el sumidero sea idempotente (upsert por clave de evento)
- [ ] Manejar rebalanceos (confirmar al revocar, evitar pausas largas en poll)
- [ ] Enrutar mensajes envenenados a un tema de mensajes muertos
- Las particiones limitan el paralelismo. Un grupo de consumidores escala solo hasta el número de particiones; los consumidores adicionales quedan inactivos. Elige particiones para el rendimiento máximo.
- Confirmar después de procesar. Confirma los offsets una vez que el trabajo está durablemente realizado, no antes — confirmar temprano pierde mensajes en un fallo.
- Sumidero idempotente. Al menos una vez significa duplicados al reintentar; upsert por una clave de evento estable para que el reprocesamiento sea inofensivo.
- Los rebalanceos ocurren. Confirma al revocar la partición y mantén los intervalos de
poll()por debajo demax.poll.interval.mspara que el broker no expulse al consumidor. - Mensajes envenenados van a un tema de mensajes muertos con el error, para que un registro malo no bloquee la partición.
Patrones
Confirmación manual después del procesamiento:
consumer = KafkaConsumer("orders", group_id="etl",
enable_auto_commit=False,
max_poll_records=500)
for msg in consumer:
try:
upsert(process(msg)) # idempotente por clave
consumer.commit() # confirmar solo después del éxito
except PoisonError:
send_to_dlq(msg)
consumer.commit() # saltar el registro malo
Productor idempotente / transaccional — establece enable.idempotence=true (deduplica reintentos) y usa transacciones para lectura-procesamiento-escritura exactamente una vez entre temas.
Optimización de rendimiento — aumenta max.poll.records, fetch.min.bytes, y procesa en lotes; mantén el procesamiento rápido para evitar expulsión por rebalanceo.
Errores comunes
- Auto-commit + procesamiento lento — los offsets avanzan antes de que el trabajo se complete; un fallo pierde mensajes. Prefiere confirmación manual después del procesamiento.
- Más consumidores que particiones — los extras quedan inactivos; reparticiona para escalar.
- Procesamiento largo entre polls — excede
max.poll.interval.msy desencadena rebalanceos infinitos; procesa en lotes acotados o usa un trabajador en segundo plano. - Sin ruta de mensajes muertos — un mensaje envenenado bloquea toda la partición.
- Confiar en exactamente una vez sin un sumidero idempotente — cualquier salto de al menos una vez reintroduce duplicados.