【问题标题】:Kafka: How can the Producer send only to a certain Consumer/GroupIdKafka:生产者如何只发送给某个消费者/GroupId
【发布时间】:2018-01-04 07:36:34
【问题描述】:

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

【问题讨论】:

  • Kafka 生产者发送到给定主题。消费者从特定主题中拉取。卡夫卡不会向消费者“广播”。您能否更详细地解释您所看到的具体行为?
  • 正如我之前提到的,我们假设只有一个主题。我有一个原因,我不想在运行时使用 Kafka-Client 创建一个新主题。这就是为什么我只使用一个主题。

标签: apache-kafka


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    1. 创建“分区数=消费者数”
    2. 使用密钥发布消息或将消息发布到特定分区 和消费一样。

    这样你就可以实现你正在寻找的东西

    【讨论】:

      【解决方案3】:

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

      如果您想过滤一个主题以生成一个仅打开某些消息的主题以便只使用这些消息,您可以使用Kafka StreamsKSQL 来执行此操作。

      【讨论】:

        【解决方案4】:
        • Kafka 生产者不会向任何 Kafka 消费者发送任何消息。
        • Kafka 生产者将消息发布到特定主题。
        • 每个单独的 Kafka Consumer 进程都属于一个特定的 groupid,并在特定的主题中注册。

        然后消费者可以开始使用来自该特定主题的数据,这样如果您希望消费者进程只从一个主题获取数据,那么只需将其注册到一个主题。

        查看in this example 消费者如何在 2 个主题中注册:

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

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

        【讨论】:

          猜你喜欢
          • 2018-12-18
          • 1970-01-01
          • 1970-01-01
          • 2017-11-03
          • 2015-03-25
          • 2019-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多