Kafka:制作人如何只发送给某个Consumer / GroupId

时间:2018-01-04 07:36:35

标签: apache-kafka

自从我开始使用Kafka以来,我注意到Kafka正在向每个消费者或群组广播消息。 如何让生产者将消息发送给某个特定消费者? 我正在谈论一个主题系统 感谢

4 个答案:

答案 0 :(得分:2)

Kafka在消费消息方面的工作方式取决于主题和消费者群体的分区数量。 当消费者是监听同一主题的相同消费者群体的一部分时,每个消费者将从一个或多个分区接收消息,但不会收到与其他消费者相同的消息。例如:如果您在同一个使用者组中有一个包含4个分区(p1,p2,p3,p4)和3个使用者(c1,c2和c3)的主题,那么在分配分配后您可以:c1从p1和p2接收,来自p3的c2,来自p4的c3。如您所见,消费者不会收到相同的消息(即c3不接收来自p1和p2的消息作为c1)。 如果您将消费者分配给不同的消费者群体(所以c1到g1,c2到g2和c3到g3),听同一主题(有4个分区),他们将获得所有相同的消息(c1来自p1,p2,p3,p4和c2和c3相同)。因此,不同的消费者群体允许发布/订阅机制(广播消息)。 如果您希望生产者仅向特定客户发送消息,其中一种可能性是具有分区数量的主题=消费者数量,然后不使用消费者组,而是直接分配,以便消费者可以请求从特定分区获取消息(即c1只需要来自p1的消息)。在这种情况下,生产者需要向该分区发送消息,但是......默认分区器(循环)不会发生这种情况。您应该根据目标使用者编写自己的分区程序,以便将消息发送到正确的分区(因此,如果您知道消息“m”应该转到c1,那么您应该有一个能够从消息“m”获取信息的分区逻辑“,处理它并将p1作为目标,即c1侦听分区。另一个简单的解决方案可能是有一个主题 - 每个消费者一个分区。你可以用不同的方式做到这一点,但一般来说,没有任何工作,Kafka就没有做到这一点。

答案 1 :(得分:0)

每个消费者选择从给定主题中提取消息。如果您不希望使用者从给定主题接收消息,则只需将其配置为不从该主题中提取。

如果您要过滤主题以生成仅包含特定消息的主题,以便仅使用这些主题,则可以使用Kafka StreamsKSQL执行此操作。

答案 2 :(得分:0)

  • Kafka Producers不会向任何Kafka消费者发送任何消息。
  • Kafka Producers将消息发布到特定主题中。
  • 每个Kafka Consumer流程都属于特定的groupid,并在特定主题中注册。

然后,使用者可以开始使用该特定主题中的数据,这样,如果您希望使用者进程仅从一个主题获取数据,则将其注册到一个主题。

在2个主题中了解消费者in this example的注册方式:

consumer.subscribe(Arrays.asList("fast-messages", "summary-markers"));

请记住,如果您有2个独立的消费者进程使用相同的主题并且它们属于不同的组(groupId),那么它们将带来相同的数据,因为它们根本不会共享偏移量。

答案 3 :(得分:0)

  1. 创建“分区数=消费者数”
  2. 使用密钥发布消息或将消息发布到特定分区 并食用相同的食物。

这样您就可以实现您想要的