kafka IllegalStateError:生产者被强制关闭

时间:2018-08-20 06:19:46

标签: python python-3.x apache-kafka kafka-producer-api

我有以下代码:

 __kafka_client = KafkaProducer(value_serializer=lambda m: json.dumps(m).encode('ascii'))
 for(msg in messages):    
    __kafka_client.send('TOPIC', dumps(msg)).add_callback(on_kafka_send_success).add_errback(on_kafka_send_error)

def on_kafka_send_success(record_metadata):
    print(record_metadata.topic)
def on_kafka_send_error(excp):
   kafa_error_message  = "Error while sending kafka message :"+str(excp);
   raise Exception(excp)

` 循环结束时出现以下错误:

Error while sending kafka message :IllegalStateError: Producer is closed forcefully.
NoneType: None

如何避免/解决此问题?

2 个答案:

答案 0 :(得分:1)

这个问题在我直接调用生产/发送方法后关闭客户端进程时重现。显然,在解释器运行send()调用之前,不一定要刷新消息缓冲区。 就像Bhuneshwer的答案(https://stackoverflow.com/a/51940821/12912120)中一样, 您可以使用flush()以便在终止进程之前刷新消息缓冲区,或者如果您不立即结束进程,消息将尽快发送(此“很快”可以由queue.buffering配置。最高毫秒)。

请注意,flush()会阻塞直到缓冲区刷新完成,因此在每个生产调用之后使用刷新等效于实现同步流,并且可能会影响性能。

请参阅合流卡夫卡伙计们提供的以下答案以获取更多信息: https://github.com/confluentinc/confluent-kafka-python/issues/137#issuecomment-282427382

答案 1 :(得分:0)

已解决

__kafka_client = KafkaProducer(value_serializer=lambda m: json.dumps(m).encode('ascii'))
 for(msg in messages):    
    __kafka_client.send('TOPIC', dumps(msg)).add_callback(on_kafka_send_success).add_errback(on_kafka_send_error)

__kafka_clinet.flush()