使用kafka-python api向主题发送一堆消息。一部分消息成功发送到主题,但并非所有消息都在程序终止之前发送,并显示以下错误消息:
KeyError: <kafka.producer.record_accumulator.RecordBatch object at 0x143d290>
Batch is already closed -- ignoring batch.done()
Error processing errback
Traceback (most recent call last):
File "/usr/lib/python2.6/site-packages/kafka/future.py", line 79, in _call_backs
f(value)
File "/usr/lib/python2.6/site-packages/kafka/producer/sender.py", line 185, in _failed_produce
self._complete_batch(batch, error, -1, None)
File "/usr/lib/python2.6/site-packages/kafka/producer/sender.py", line 243, in _complete_batch
self._accumulator.deallocate(batch)
File "/usr/lib/python2.6/site-packages/kafka/producer/record_accumulator.py", line 507, in deallocate
self._incomplete.remove(batch)
File "/usr/lib/python2.6/site-packages/kafka/producer/record_accumulator.py", line 587, in remove
return self._incomplete.remove(batch)
每次运行都会在我的主题中实际收到不同数量的消息。问题似乎是kafka producer.send调用在程序到达之前没有完成发送。
根据kafka文档,producer.send是一个异步方法,可能是根本原因 - 并非所有异步线程在进程被终止之前完成发送:
send()方法是异步的。调用时,它会将记录添加到a 待处理记录的缓冲区发送并立即返回。这允许 生产者将个别记录分组在一起以提高效率。
有许多天真的解决方案(例如将batch.size
设置为较低的数字)可能会导致性能瓶颈。
您如何解决此问题而不会过多地影响性能?
答案 0 :(得分:3)
请在退出前致电producer.flush()
。