我使用spring-kafka
版本1.1.3
来使用来自主题的消息。消费者配置中的自动提交设置为true
和max.poll.records
至10
。与服务器协商session.timeout.ms
为10秒。
收到消息后,我将部分消息保存到数据库中。我的数据库有时会很慢,导致kafka监听器会话超时:
组mygroup的自动偏移提交失败:无法完成提交 因为该组已经重新平衡并分配了分区 另一名成员。这意味着后续调用之间的时间 poll()比配置的session.timeout.ms长 通常意味着民意调查循环花费了太多时间的消息 处理。您可以通过增加会话来解决此问题 超时或通过减少poll()中返回的批量的最大大小 与max.poll.records。
由于我无法在服务器上增加会话超时且max.poll.records
已经降低到10,我希望能够在事务中包装我的数据库调用,这将会在kafka会话超时的情况下回滚。
这可能吗?我该如何做到这一点?
不幸的是,我无法在文档中找到解决方案。
答案 0 :(得分:2)
您必须考虑升级到Spring Kafka 1.2
和Kafka 0.10.x
。旧的阿帕奇卡夫卡有一个心跳的缺陷。因此,使用autoCommit
和慢速监听器会导致意外的重新平衡,并且您可能会遇到这样的问题。您使用的Spring Kafka版本具有以下逻辑:
// if the container is set to auto-commit, then execute in the
// same thread
// otherwise send to the buffering queue
if (this.autoCommit) {
invokeListener(records);
}
else {
if (sendToListener(records)) {
if (this.assignedPartitions != null) {
// avoid group management rebalance due to a slow
// consumer
this.consumer.pause(this.assignedPartitions);
this.paused = true;
this.unsent = records;
}
}
}
因此,您可以考虑关闭autoCommit
并依赖默认启用的内置pause
功能。
答案 1 :(得分:0)
决定升级到Kafka 0.11,因为它增加了交易支持(见Release Notes)。