使用批处理异步生产者时,kafka如何发送确认? ack是每个消息/每批次/每个子批次(即每个分区的批次)? 是否建议在异步批处理prdocuer中使用ack?或者更好的只是使用回调机制?
答案 0 :(得分:0)
在使用批处理异步生产者时,kafka如何发送ack
通过更新se Future或执行回调代码来选择。
确认是按消息/按批次/按子批次(即按分区分配)
好问题。我认为确认是针对整个请求的,因此该请求的所有消息(但不确定,我没有找到信息)
是否建议在异步批处理prdocuer中使用ack?或更好 只是使用回调机制?
这是两个不同的概念,如果不执行future,则send始终与kafka保持异步。 如果要分批发送许多记录,则必须无阻碍地发送。 (无需每次都执行future.get())
答案 1 :(得分:0)
“使用批处理异步生产器时,kafka如何发送ack?ack是按消息/按批处理/按子批处理(即按分区按批处理)吗?”
每个批次发送确认(也意味着:每个分区)。如果批处理中的一个或多个单个消息失败,则整个批处理均视为失败。根据您的重试配置,然后将重新发送该批处理。
“是否建议在异步批处理prdocuer中使用ack?还是仅使用回调机制更好?”
我认为这不是一个非此即彼的问题。您可以拥有acks>0
并同时使用回调。通常,acks
设置使您可以独立于任何回调来提高Producer的稳定性。
如果您需要了解发送失败的原因的全部详细信息,则应使用回调。我在我的另一篇文章中提供了关于Producer Callback Exceptions的更多详细信息。
此外,您可以使用异步生产者的回调来处理手动提交,同时避免如Kafka Consumer offset commit check to avoid committing smaller offsets
中所述由于退休而提交较低的偏移量。