【问题标题】:what is best practice to consume messages from multiple kafka topics?使用来自多个 kafka 主题的消息的最佳做法是什么?
【发布时间】:2018-03-19 15:07:12
【问题描述】:

我需要消费来自不同 kafka 主题的消息,

  1. 我是否应该为每个主题创建不同的消费者实例,然后根据分区数启动一个新的处理线程。 或
  2. 我应该从一个消费者实例订阅所有主题,并且应该启动不同的处理线程

感谢和问候, 梅加

【问题讨论】:

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


    【解决方案1】:

    唯一的规则是你必须说明 Kafka 做了什么和不保证什么:

    • Kafka 仅保证单个主题/分区的消息顺序。编辑:这也意味着如果您的单个主题消费者出于某种原因切换分区,您可能会收到乱序的消​​息。
    • 当您使用单个消费者订阅多个主题时,该消费者会为每个请求的主题分配一个主题/分区对。
    • 这意味着任何一个主题的传入消息的顺序都是正确的,但您不能保证主题之间的顺序是按时间顺序排列的。
    • 您也不能保证在任何给定时间段内都会收到来自任何特定订阅主题的消息。

    我最近遇到了一个错误,因为我的应用程序通过一个消费者订阅了许多主题。每个主题都是每条消息一个图像的实时图像馈送。由于所有主题总是有新图像,每个 poll() 只返回第一个主题的图像以进行注册。

    如果处理所有消息很重要,您需要确定每个消费者可以比创建消息更快地处理来自其所有订阅主题的消息。如果不能,您要么需要更多的消费者在同一个组中提交读取,要么您必须接受某些消息可能永远不会被处理的事实。

    显然,一个消费者/主题是最简单的,但它确实增加了一些额外的消费者的开销。您必须根据自己的需要确定这是否重要。

    正确回答您的问题的唯一方法是评估您的应用程序的特定要求和功能,并在这些要求和能力范围内构建一些东西在 Kafka 的限制范围内。

    【讨论】:

      【解决方案2】:

      这实际上取决于您的应用程序的逻辑 - 它是否需要在一个地方同时查看所有消息。有时,就应用程序的业务逻辑而言,单个主题的消费可能更容易实现。

      【讨论】:

      • 这也取决于你需要的容错能力,即你想拥有什么样的消费群体。
      • 我有大量主题,即 2000,1. 可以为每个主题创建消费者实例 2. 如果我每个主题有单独的消费者组或单个主题中有多个主题,它将如何影响消费群体
      • 1.如果我没记错的话,每个主题有一个消费者实例可能会提高吞吐量,因为消费者和代理之间的通信开销会更少——重新平衡的开销也会更少,等等。但这可能会导致更复杂的应用程序设计——这可能是有道理的与一位消费者“对相似主题进行分组”。 2. 直到您希望对不同主题/组(不同数量的分区等)有不同的可伸缩性要求之前,这并不重要
      • 我同意主要问题是关于应用程序语义/逻辑。之后,它是关于性能。消费者越少越好。但是由于KafkaConsumer 不是线程保存,所以每个线程应该有一个消费者。
      猜你喜欢
      • 1970-01-01
      • 2022-07-28
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      相关资源
      最近更新 更多