Rujukan · Producer
Producer batching: Java vs librdkafka
Bila batch keluar, apa yang block, apa yang throw. Disemak pada Kafka 4.1 dan librdkafka master.
Batch dikira ready bila (Java)
- full: record seterusnya tak muat dalam
batch.size - expired: dah menunggu ≥
linger.ms - exhausted: ada
send()sedang menunggu memori - atau
flush()/close()
RecordAccumulator.batchReady()
Config dan default
| Java | Default (4.x) | librdkafka | Default |
|---|---|---|---|
batch.size | 16384 B | batch.size / batch.num.messages | 1000000 B / 10000 |
linger.ms | 5 ms | linger.ms (= queue.buffering.max.ms) | 5 ms |
compression.type | none | compression.type | none |
buffer.memory | 32 MB | queue.buffering.max.messages / .kbytes | 100000 / 1048576 KB |
max.block.ms | 60000 ms | tiada: produce() tak pernah block | n/a |
delivery.timeout.ms | 120000 ms | delivery.timeout.ms (= message.timeout.ms) | 300000 ms |
ProducerConfig · librdkafka CONFIGURATION.md
Block, throw, atau callback (Java send())
| Keadaan | Hasil |
|---|---|
| Tunggu metadata, tunggu memori | block dalam send(), kedua-duanya berkongsi satu bajet max.block.ms |
Bajet habis (TimeoutException, BufferExhaustedException) | callback + Future gagal |
Record terlalu besar (RecordTooLargeException) | callback + Future gagal, serta-merta |
| Serializer gagal, interrupt, producer closed/fatal | throw dari send() |
Peraturan ringkas: ApiException → callback; KafkaException lain → throw. KafkaProducer.doSend()
librdkafka (Python produce())
| Keadaan | Hasil |
|---|---|
| Queue tempatan penuh | raise BufferError serta-merta; app yang memutuskan: poll() dan cuba lagi, atau buang |
Mesej melebihi delivery.timeout.ms | error dalam on_delivery; ruang dalam queue dibebaskan |
| Ralat lain | raise KafkaException |
confluent-kafka-python Producer.produce
Kira-kira pantas untuk edge
Masa sehingga queue penuh = min(max.messages ÷ kadar, max.kbytes ÷ (kadar × saiz mesej KB)).
Dalam outage yang lebih panjang daripada delivery.timeout.ms, mesej tertua luput dan hilang terlebih dahulu.