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)

  1. full: record seterusnya tak muat dalam batch.size
  2. expired: dah menunggu ≥ linger.ms
  3. exhausted: ada send() sedang menunggu memori
  4. atau flush() / close()

RecordAccumulator.batchReady()

Config dan default

JavaDefault (4.x)librdkafkaDefault
batch.size16384 Bbatch.size / batch.num.messages1000000 B / 10000
linger.ms5 mslinger.ms (= queue.buffering.max.ms)5 ms
compression.typenonecompression.typenone
buffer.memory32 MBqueue.buffering.max.messages / .kbytes100000 / 1048576 KB
max.block.ms60000 mstiada: produce() tak pernah blockn/a
delivery.timeout.ms120000 msdelivery.timeout.ms (= message.timeout.ms)300000 ms

ProducerConfig · librdkafka CONFIGURATION.md

Block, throw, atau callback (Java send())

KeadaanHasil
Tunggu metadata, tunggu memoriblock 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/fatalthrow dari send()

Peraturan ringkas: ApiException → callback; KafkaException lain → throw. KafkaProducer.doSend()

librdkafka (Python produce())

KeadaanHasil
Queue tempatan penuhraise BufferError serta-merta; app yang memutuskan: poll() dan cuba lagi, atau buang
Mesej melebihi delivery.timeout.mserror dalam on_delivery; ruang dalam queue dibebaskan
Ralat lainraise 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.