At-most-once (fire-and-forget): producer acks=0, consumer commit offset trước khi xử lý — message có thể mất, không bao giờ duplicate.
- Dùng cho metrics/log không cần chính xác tuyệt đối. At-least-once: producer
acks=all+ retries, consumer commit sau khi xử lý thành công — không mất message nhưng có thể xử lý trùng (duplicate) khi consumer crash sau xử lý nhưng trước commit. - Yêu cầu consumer logic phải idempotent. Exactly-once: khó nhất, cần cả producer và consumer phối hợp.
- Producer: bật
enable.idempotence=true+ Kafka Transactions (transactional.id). - Consumer:
isolation.level=read_committed+ đặt offset commit trong cùng transaction với business logic (nếu write ra DB phải là transactional outbox). - Kafka Streams với
processing.guarantee=exactly_once_v2tự handle toàn bộ. - Exactly-once có overhead ~20-30% latency — chỉ dùng cho billing, financial transactions.