Producer flow: từ .produce() đến broker
Khi bạn gọi producer.produce(topic, key, value), Kafka client thực hiện các bước sau:
- Serialization — key và value được serialize thành byte[]
- Partition assignment — quyết định message vào partition nào (dựa trên key hash hoặc round-robin)
- Record accumulator — message được buffer vào batch trong memory, tổ chức theo (topic, partition)
- Sender thread — background thread gom các batch đủ điều kiện và gửi đến broker leader
- Broker acknowledgment — broker trả lời theo cấu hình
acks - Callback / delivery report — producer notify kết quả (success/error)
produce() là non-blocking — nó chỉ đẩy message vào buffer. flush() hoặc
poll() mới thực sự gửi. Nếu process crash trước khi flush, message trong buffer sẽ mất.
acks — durability guarantee quan trọng nhất
acks kiểm soát khi nào broker coi là "đã nhận" message. Đây là trade-off giữa tốc độ và độ an toàn:
acks=all chỉ có ý nghĩa khi kết hợp với min.insync.replicas=2 ở topic/broker config.
Nếu chỉ còn 1 ISR và min.insync.replicas=1, thực chất ngang với acks=1.
Batching & linger.ms
Kafka producer không gửi từng message một — nó gom lại thành batch để tối ưu network. Hai config kiểm soát batch:
| Config | Default | Ý nghĩa | Tune khi nào |
|---|---|---|---|
batch.size |
16KB | Kích thước tối đa của một batch (bytes). Batch đầy → gửi ngay. | Tăng lên 64KB-1MB nếu throughput cao và có thể chấp nhận latency nhỏ |
linger.ms |
0ms | Thời gian chờ thêm message vào batch dù chưa đầy. 0 = gửi ngay. | Set 5-20ms để tăng batch size khi throughput không đều |
buffer.memory |
32MB | Tổng memory cho record accumulator. Đầy → produce() block. |
Tăng nếu producer tạo message nhanh hơn tốc độ gửi |
conf = {
'bootstrap.servers': 'localhost:9092',
'acks': 'all',
'retries': 3,
'linger.ms': 10, # chờ 10ms để gom batch
'batch.size': 65536, # 64KB batch size
'compression.type': 'snappy', # compress batch trước khi gửi
'enable.idempotence': 'true', # không duplicate khi retry
}
Partitioner — message đi về partition nào?
- Key không null — hash(key) % numPartitions. Cùng key → cùng partition → đảm bảo ordering
- Key null, Kafka < 2.4 — round-robin giữa các partition
- Key null, Kafka ≥ 2.4 — sticky partitioner: gom vào một partition cho đến khi batch đủ lớn, rồi đổi → throughput tốt hơn round-robin
Compression
Kafka hỗ trợ compress batch trước khi gửi. Producer compress, broker lưu compressed, consumer decompress. Broker không cần decode để route.
| Algorithm | Ratio | CPU | Best for |
|---|---|---|---|
none | 1x | Không | Latency cực thấp, không quan tâm bandwidth |
gzip | Tốt nhất (~5x) | Cao | Cold storage, không nhạy cảm latency |
snappy | Tốt (~3x) | Thấp | Balance — phù hợp cho hầu hết use case |
lz4 | Trung bình (~2x) | Rất thấp | Latency nhạy cảm, throughput cao |
zstd | Tốt nhất (~5x) | Trung bình | Kafka 2.1+, modern default tốt nhất |
Idempotent Producer — tránh duplicate khi retry
Khi broker crash sau khi ghi nhưng trước khi gửi ack, producer sẽ retry. Nếu broker thực ra đã ghi thành công, message sẽ bị ghi hai lần (duplicate).
Bật enable.idempotence=true: Kafka gán mỗi message một sequence number duy nhất.
Broker phát hiện duplicate và discard, producer retry an toàn.
conf = {
'bootstrap.servers': 'localhost:9092',
'enable.idempotence': 'true', # tự động set acks=all, retries=MAX
# Khi enable.idempotence=true, các config sau được auto set:
# acks=all, retries=INT_MAX, max.in.flight.requests.per.connection=5
}
Config cheat sheet theo use case
| Use Case | acks | linger.ms | compression | idempotence |
|---|---|---|---|---|
| Metrics / Logs | 0 | 0 | lz4 | false |
| App events | 1 | 5 | snappy | false |
| Order / Payment | all | 0-5 | snappy | true |
| CDC / Audit log | all | 10 | zstd | true |
| Bulk import | 1 | 50 | gzip | false |
- Bài 1: Kafka là gì? Core concepts & architecture
- Bài 2: Cài đặt với Docker — Kafka UI trong 15 phút
- Bài 3: Producer deep dive — acks, batching, ordering
- Bài 4: Consumer & Consumer Groups — offset, rebalancing
- Bài 5: Partitions & Replication — durability đảm bảo thế nào
- Bài 6: Kafka trong Production — monitoring, tuning, common issues