我是Kafka的新手,我有一个使用Java Apache Camel库实现的Kafka客户。我发现的问题是-消费者需要很长时间(> 15分钟)来处理几则消息,这对于我们的用例来说是很好的。
需要一些配置帮助,因为如果15分钟内未处理,则15分钟后将重新发送同一消息(我相信线程控制不会返回)。我认为这可能是默认间隔,不确定是哪个属性。
所以,我必须在哪里修复配置
我的制作人具有以下属性:
<entry key="bootstrap.servers" value="${kafka.bootstrap.servers}" />
<entry key="key.serializer" value="org.apache.kafka.common.serialization.StringSerializer" />
<entry key="value.serializer" value="org.apache.kafka.common.serialization.StringSerializer" />
我的使用者配置看起来像
<endpoint id="apolloKafkaJanitorEventListenerURI"
uri="kafka:${kafka.bootstrap.servers}?topic=${apollo.janitor.event.topic}&
groupId=${apollo.janitor.event.group.id}&
consumersCount=${apollo.janitor.event.consumer.count}&
consumerRequestTimeoutMs=${eventConsumerRequestTimeoutMs}&
sessionTimeoutMs=${eventConsumerSessionTimeoutMs}&
maxPartitionFetchBytes=${eventConsumerMaxPartitionFetchBytes}" />
我用Google搜索没有发现任何相关问题。在生产者和消费者上找到了“ acks = 0”属性。还没测试过,但想先看看我是否在正确的轨道上
KafkaManualCommit manual =
exchange.getIn().getHeader(KafkaConstants.MANUAL_COMMIT, KafkaManualCommit.class);
manual.commitSync();
答案 0 :(得分:1)
问题可能出在生产者端。您可能需要检查生产者是否正在重新发送消息。您可以使用相同的日志记录语句。或者您可以为kafka生产者仅使用一次语义。您只需要为此添加一个额外的属性即可。
其他原因可能是您的消费者未提交偏移量。您可能也需要为此进行一些头脑风暴
答案 1 :(得分:1)
您尝试避免多次发送同一封邮件。这是错误的方法。
在消息传递系统中,您必须处理可以多次传递的消息,仅仅是因为在某些情况下需要它们以保证消息传递(see here for a short explanation)。
在不牺牲系统其他方面的情况下,您无法完全避免多次交付。
如果您改为构建您的consumers idempotent ,他们不在乎代理是否多次发送邮件。这样,您就不必限制经纪人了。