扩展Kafka消费者池,同时确保处理所有消息

时间:2017-06-19 21:32:42

标签: apache-kafka kafka-consumer-api

我想在传统的消息队列配置中使用Kafka。那就是:

  1. 制作人可以在消费者开始之前开始写主题
  2. 具有多个消费者的特定主题
  3. 可以添加消费者以提高吞吐量
  4. 无论配置如何,最终都会处理所有消息
  5. 答:第1点意味着我认为我需要用auto.offset.reset启动我的初始消费者,否则我会错过在消费者开始之前发送的消息。

    第3点意味着我可以通过添加消费者来重新平衡。假设A点是正确的,我应该将哪个值用于auto.offset.reset = earliest

    B:如果我设置auto.offset.reset = latest,那么我会处理重复的邮件吗? (我知道重新平衡本身的行为可能导致重复的消息处理)。

    C:或者我应该设置auto.offset.reset?如果是这样,Kafka会确保处理所有消息吗?

    D:这是否意味着我需要为不同时间开始的消费者提供不同的.txt配置值?

    我正在使用当前版本0.10.2.1。

2 个答案:

答案 0 :(得分:1)

在Kafka中设置消费者有两个基本原则,ConsumerConsumer Group。但auto.offset.reset的概念保持不变。

  

答:第1点意味着我认为我需要使用auto.offset.reset = earliest来启动我的初始消费者,否则我将错过在消费者开始之前发送的消息。

     

第3点意味着我可以通过添加消费者来重新平衡。假设A点是正确的,我应该将哪个值用于auto.offset.reset?

我认为您正在向同一组添加新的消费者。在这种情况下,您必须增强对主题的分区,否则新消费者将保持闲置状态。因为,主题上的一个分区只能由使用者组中的一个使用者使用。

如果新的消费者需要在消息开始之前使用添加到主题的消息,那么消费者组的设置应该是auto.offset.reset = earliest。此配置仅在该特定分区没有提交的偏移量时才会播放(在重新平衡的情况下)。

  

B:如果我设置auto.offset.reset = earliest那么我会处理重复的消息吗? (我知道重新平衡本身的行为可能导致重复的消息处理)。

没有。在消费者重新平衡的情况下,它获取指定分区的最新提交偏移量。它在没有提交偏移的情况下使用auto.offset.reset = earliest配置。

  

C:或者我应该设置auto.offset.reset = latest?如果是这样,Kafka会确保处理所有消息吗?

请阅读我对B点的评论。

我希望它有所帮助。

答案 1 :(得分:0)

当ZooKeeper中没有初始偏移量或者偏移量超出范围时,使用

auto.offset.reset。它只是消费者群体第一次启动时,ZooKeeper缺少偏移量。例如,如果消费者组中的所有消费者都停留的时间超过主题保留期,则可能会发生超出范围的偏移。因此,通过适当地配置保留时间,您不会因此而看到超出范围的偏移。

如果您使用auto.offset.reset = earliest,那么在没有初始偏移或超出范围偏移的情况下,您可能会重新处理消息。但是既然你必须应对重复无论如何的可能性(因为Kafka至少提供了一次语义),这不应该有任何不同。

如果您使用auto.offset.reset = latest,那么在没有初始偏移或超出范围偏移的情况下,您可能无法处理某些消息。