Spring Kafka多个消费者的分区

时间:2017-09-10 07:56:49

标签: apache-kafka kafka-consumer-api spring-kafka

我们正在使用spring kafka来消费消息。我们为每个分区创建了接收器以接收消息。现在我们需要从单个分区到消费者消息需要多个接收器。

例如让我们假设我们有一个分区0.目前我们只有一个接收器(接收器1)接收来自该分区的消息。 现在我想为同一个分区(分区0)添加另一个Receiver(Receiver 2)。

因此,如果Producer向此分区发送100条消息,则应由Receiver 1接收50条消息,并且应在Receiver 2中接收剩余的50条消息。我不希望消息重复。两个接收器类都属于同一组。(我设置了props.put(" group.id"," unique_group_id")

请帮助我了解这种情况是否可以实现。

2 个答案:

答案 0 :(得分:1)

不,你不能这样做。每个分区只能由单个使用者组中的一个使用者使用。

如果您希望2个消费者使用相同的分区,则这2个消费者必须属于2个不同的消费者群体。但是,在这种情况下,两个消费者都将收到此分区的所有消息。

您需要的是Error: getLayoutInflater can only be called from within the same library group 。 2个工作程序使用来自单个队列的消息,并且每个消息将仅由一个工作程序使用。有许多开源worker queue,例如worker queuesActiveMQ等。

答案 1 :(得分:0)

如果您无法增加该主题的分区数量,则会出现一些“讨厌的”问题。你可以使用的技巧。在两个接收器中使用不同的consumer-group-id,并在pool()丢弃一个接收器上具有偶数偏移的消息和在第二个接收器上具有奇数偏移的消息之后,如下所示:

  R1       R2
| 100      100 [X]
| 101 [X]  101
| 102      102 [X]
| 103 [X]  103
v 104      104 [X]

这会有效,但有一些后果:

  • 它不可扩展(您无法轻松地将另一个接收器添加到分区)
  • 如果一个接收器卡住/死亡,第二个接收器无法处理它的工作
  • 抵消不同消费者群体的管理非常困难(特别是如果生产者不在您的控制之下)