当前位置: 首页 > 知识库问答 >
问题:

使用来自多个 kafka 主题的消息的最佳做法是什么?

沈高峻
2023-03-14

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

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

谢啦

共有2个答案

壤驷阳冰
2023-03-14

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

林礼骞
2023-03-14

唯一的规则是,你必须解释Kafka做了什么,没有不保证:

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

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

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

显然,一个消费者/主题是最简单的,但是拥有额外的消费者会增加一些开销。你必须根据你的需求来决定这是否重要。

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

 类似资料:
  • 我正在开发一个使用的软件。我有一个用户订阅了多个主题,我想知道是否有一个订单接收来自这些主题的消息。我在我的电脑上尝试了一些组合,但我需要确定这一点。例 null [编辑]我想指定这两个主题各有一个分区,并且只有一个生产者和一个消费者。我需要首先阅读来自第一个主题的所有消息,然后阅读来自另一个主题的消息

  • 我正在开发一个模块,它使用来自Kafka主题的消息并发布到下游系统。在下游系统不可用的情况下,消费者不确认Kakfa消息。因此,当我的消费者收到消息时,当下游系统不可用时,kakfa的偏移量将不会被提交。但是如果我在下游系统启动后收到新消息,并且当我确认该消息时,最新的偏移量将被提交,并且消费者永远不会收到主题中没有偏移量提交的那些消息。

  • 我有一个Kafka集群(版本:0.10.1.0),有9个代理和10个分区。 我尝试使用camel kafka从java应用程序中获取消息。这是我的pom。xml 这只是我使用的与骆驼Kafka相关的依赖项。下面是骆驼Kafka消费者代码。 我正在使用文档中指定的KafkaURIhttps://camel.apache.org/components/latest/kafka-component.ht

  • 2016-07-05 03:59:25.042 O.A.S.D.Executor[INFO]正在处理-2元组的接收消息:源:__System:-1,流:__Tick,ID:{},[30] 2016-07-05 03:59:25.946 O.A.S.D.Executor[INFO]正在处理-2元组的接收消息:源:__System:-1,流:__Metrics_Tick,ID:{},[60] 我的测试

  • 好的,目标是:我有一个应该发送邮件的服务,如果失败,我的Kafka制作人将把这封邮件发送到Kafka主题。第二个程序每两分钟查看一次主题,应该只使用一条消息(最早的一条),然后重试发送,如果失败,程序应该将此消息返回主题。 我已经有了一个消费者,但问题是,它会消耗我直到现在还没有使用消费者的所有消息。但我希望他只吃最老的,他以前从未吃过。 这是我的实际消费者: “CustMessage”是我为测试

  • 有人能帮我弄清楚这件事吗。 谢了!