卡夫卡消费者收到相同的消息

时间:2018-12-13 10:30:19

标签: java apache-kafka apache-camel producer-consumer

我是Kafka的新手,我有一个使用Java Apache Camel库实现的Kafka客户。我发现的问题是-消费者需要很长时间(> 15分钟)来处理几则消息,这对于我们的用例来说是很好的。

需要一些配置帮助,因为如果15分钟内未处理,则15分钟后将重新发送同一消息(我相信线程控制不会返回)。我认为这可能是默认间隔,不确定是哪个属性。

所以,我必须在哪里修复配置

  • 生产者级别,因此它不会重新发送
  • 或者生产者不参与重新发送,它是Broker-Kafka服务器,因此消费者必须确认该消息-就我而言,就是在处理之前。

我的制作人具有以下属性:

<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}&amp;
                                                        groupId=${apollo.janitor.event.group.id}&amp;
                                                        consumersCount=${apollo.janitor.event.consumer.count}&amp;
                                                        consumerRequestTimeoutMs=${eventConsumerRequestTimeoutMs}&amp;
                                                        sessionTimeoutMs=${eventConsumerSessionTimeoutMs}&amp;
                                                        maxPartitionFetchBytes=${eventConsumerMaxPartitionFetchBytes}" />

我用Google搜索没有发现任何相关问题。在生产者和消费者上找到了“ acks = 0”属性。还没测试过,但想先看看我是否在正确的轨道上

KafkaManualCommit manual =
       exchange.getIn().getHeader(KafkaConstants.MANUAL_COMMIT, KafkaManualCommit.class);
   manual.commitSync();

https://github.com/apache/camel/blob/master/components/camel-kafka/src/main/docs/kafka-component.adoc

2 个答案:

答案 0 :(得分:1)

问题可能出在生产者端。您可能需要检查生产者是否正在重新发送消息。您可以使用相同的日志记录语句。或者您可以为kafka生产者仅使用一次语义。您只需要为此添加一个额外的属性即可。

其他原因可能是您的消费者未提交偏移量。您可能也需要为此进行一些头脑风暴

答案 1 :(得分:1)

您尝试避免多次发送同一封邮件。这是错误的方法

在消息传递系统中,您必须处理可以多次传递的消息,仅仅是因为在某些情况下需要它们以保证消息传递(see here for a short explanation)。

在不牺牲系统其他方面的情况下,您无法完全避免多次交付。

如果您改为构建您的consumers idempotent ,他们不在乎代理是否多次发送邮件。这样,您就不必限制经纪人了。