这更多的是一个系统设计问题。
让我们假设我有一个微服务体系结构,我有X个服务B
实例(用于负载平衡对服务的HTTP请求)。但是,服务B
也是Kafka主题的消费者。如何避免将同一消息处理X次(X是服务B
的实例数)<如果处理是幂等的,至少一次就可以了。它不需要是一次
,但不能是X次
。
服务A可以是订单服务。它生成关于用户向订单主题下单的消息。
服务B可以是支付服务。它使用订单主题中的消息向用户收费。
支付订单可能是幂等操作。但是,如果我有10个支付服务实例,我不想浪费CPU和IO来做10次事情。
即使分区是答案,但如果我们有比分区更多的特定微服务实例,该怎么办?
根据问题,
即使您有多个服务实例,也不需要担心对同一消息的重新处理。因为Kafka在消费者偏移量上工作,所以如果您阅读了该消息,我们将提交该消息的偏移量,以便该消息不可用于该消费者(组)。
举个例子,,
订购服务发布有关订购主题的消息,支付服务订阅了该消息。我们有10个支付服务实例。在这种情况下,让我们考虑支付服务实例1所消耗的消息1 GET(如果不显式地定义它,它属于默认的用户组)。消费消息1后,支付服务实例1提交该消息的偏移量(在消费者组级别),并将其视为消息已成功处理。因此,支付服务实例2/任何其他实例将只拾取偏移为未提交的消息。
根据@Madhu的回答,这是为了更快地并行处理消息。如果你有10个支付服务实例,并且想要快速访问和处理消息,那么你可以在消费者组下添加更多的消费者(但是需要考虑订单主题的分区计数,因为如果订单主题有4个分区,我们定义了5个消费者,那么1个消费者总是处于空闲状态,除非任何其他消费者下降)。
Kafka消费集团
当您拥有一个服务的x
实例,并且您希望该服务只使用一次消息时,Kafka的消费群体概念会考虑这一点。
本质上,您需要为您的服务实例指定一个公共kafka使用者组ID,然后kafka将负责将主题的分区分配给服务的不同使用者实例,这样您的服务就不会两次使用任何消息。
您正在使用的Kafka消费者库中的Kafka消费者配置中会有消费者组ID的配置。您只需要确保为单个服务实例集分配了与该配置相同的使用者组ID值。
举例说明
如果您的服务有10个实例,您可以为所有10个实例指定一个通用的kafka消费者组ID,例如serviceB消费者组。当从具有10个分区的kafka主题开始消费时,kafka负责将该主题的分区分配给消费者组serviceBatierGroup
的所有实例。所以本质上,它会将每个分区分配给每个实例(当有10个服务实例和10个主题分区时)。如果有5个服务实例和10个kafka主题分区,Kafka将为每个实例分配2个分区供使用。
有关Kafka消费群体的一些参考资料:
这是关于的一般问题。在Azure中,当应用程序被放大时,如果订阅服务器被放大多次,Azure如何处理向该订阅服务器发送消息。图1显示了一个典型的情况,图2显示了我所说的场景: 默认情况下,Azure是否向所有实例发送相同的消息?或者Azure是否“聪明”到可以在实例之间负载平衡消息?如果没有,人们如何正常处理这种情况?我只想一个实例接收这个消息的情况下,它是缩放的。
我有一个java项目,我正试图扩大我的项目,所以想旋转单个微服务的3个实例。 但我有个问题 解释一下 当用户登录时,从用户界面,每10秒一个api请求(针对特定用户)进入后端,该请求给出了Spring批处理作业的状态(对于已登录的特定用户,正在运行或未运行)。这仅适用于1个实例。 但是当我有 3 个实例(实例 1、2 假设10秒的第一个请求到达实例1,并且登录用户的作业正在运行-它返回作业正在运行
火花2.1+Kafka0.10+火花流。 批处理持续时间为30s。 我有13个节点,2个代理,每个主题/分区每个执行器使用1个核心。 LocationStrategy更好。 当使用1个主题时,没有问题的执行器总是处理相同的主题/分区(测试到24个分区)。 当我添加另一个主题时,一些用于处理主题/分区的执行器从一个批切换到另一个批。 当一个执行器再次处理相同的主题/分区时(例如,在前一次处理之后的3
我们正在开发一个应用程序,我们想听Kafka中不止一个主题。所有主题都有一个分区。所有主题名称都有一个公共的前缀,例如“test-x”、“test-y”,所以我们可以对它使用spring。 我们希望编写一个java spring使用者,它使用模式监听所有主题。我们的想法是,我们可以运行同一个消费者(属于同一个组)的多个实例,Kafka将为不同的消费者分发来自不同主题的消息。 然而,这似乎并不奏效。
如何以可伸缩的方式编写连接多个Kafka主题的使用者? 我有一个主题用一个键发布事件,第二个主题用相同的键发布与第一个主题的子集相关的其他事件。我想编写一个订阅这两个主题的使用者,并为出现在这两个主题中的子集执行一些额外的操作。 理想情况下,我需要将主题绑定在一起,以便以相同的方式对它们进行分区,并同步地将分区分配给使用者。我怎么能这么做? 我知道Kafka Streams将主题连接在一起,这样键
我们有一个Kafka主题,有源源不断的数据。为了处理它,我们有一个无状态的Flink管道,它使用该主题并写入另一个主题。 我们是不是漏掉了什么?我们误会什么了吗?有没有更好的解决办法? 谢了!