请问一下,多节点消费 kafka 如何做到串行消费

2024-08-27 22:46:30 +08:00
 NoKey
就是有个场景,有个任务要处理,任务必须串行执行
为了保证任务下发后不丢失
打算借助 kafka 的持久化,把任务丢到 kafka 中
后台服务有多个节点,也就是多个节点在消费 kafka
怎么样才能做到串行消费 kafka 的消息呢?
就是说,多个节点排队消费,第一个节点拿到消息后,如果没处理完,其他节点不能继续消费
搞了好久都没实现
又不想用数据库存储然后定时读取的方式(这种方式肯定没问题)
想通过这个功能,学会 kakfa 的使用
请假一下各位大佬,基于 kafka 能不能实现这个想法呢?谢谢
3494 次点击
所在节点    Kafka
31 条回复
Trim21
2024-08-27 22:48:56 +08:00
只用一个节点消费?
kechx
2024-08-27 22:51:04 +08:00
进队列前对任务进行一个 hash ,有时序性的扔在一起
7911364440
2024-08-27 22:51:43 +08:00
给任务加个字增 id ,每个消费服务执行任务前校验一下顺序
crysislinux
2024-08-27 22:55:34 +08:00
kafka 一个分区不就是顺序执行的么。你还想要啥
MeiJiayun
2024-08-27 23:02:18 +08:00
指定 key ,key 相同会推送到相同分区,同一分区的消息有顺序
dddd1919
2024-08-27 23:08:55 +08:00
给串行的每个节点定义一个 topic 和 topic 的串行顺序,每个节点执行器执行完成后把消息推送到下一个 topic
kur0d3s
2024-08-28 08:56:01 +08:00
要求单实例顺序执行了, 那消费者多实例的意义是啥...
Wh1t3zZ
2024-08-28 09:04:05 +08:00
"多个节点排队消费,第一个节点拿到消息后,如果没处理完,其他节点不能继续消费"

没看懂多个节点消费的意义是什么
NoKey
2024-08-28 09:08:01 +08:00
@Wh1t3zZ 因为服务自己是多节点部署的,启动起来,kafka 就订阅消费了。。。
NoKey
2024-08-28 09:09:30 +08:00
@crysislinux 消费节点是多个,我测试的,即便多个消费者在一个消费者组,第一个消费者拿到消息处理的过程中,第二条消息到来,也会被消费,这个时候,第一条消息和第二条消息就是并行在处理了
NoKey
2024-08-28 09:10:51 +08:00
@Trim21 主要是服务是多节点部署,启动起来自然开始订阅消费
zt5b79527
2024-08-28 09:14:00 +08:00
单个实例去消费不就完了,如果必须是多个实例,就去抢分布式锁,拿到锁的才能去消费
frank1256
2024-08-28 09:18:27 +08:00
多节点抢锁,抢不到锁的 commit offset 要回退的,因为你第二个节点虽然拿不到锁,但已经消费到数据了
crysislinux
2024-08-28 09:24:02 +08:00
@NoKey 消费者组和分区不是一个概念吧,你搞错了。
echoZero
2024-08-28 09:35:08 +08:00
放同一个分区。之所有会出现多条消息并行处理,因为是批量拉取消费消息,这个是你的消费逻辑问题,看一下是不是消费逻辑并发处理拉取的消息了
zdt3476
2024-08-28 09:50:31 +08:00
你给这个 topic 只分配一个 partition 就好了,这样多消费者就不起作用了
awalkingman
2024-08-28 10:00:48 +08:00
@zt5b79527 正解
MoYi123
2024-08-28 10:14:46 +08:00
kafka 在这起什么作用? rpc 调用就会导致任务丢失了?
Marinaaaa
2024-08-28 10:33:00 +08:00
1. topic 单分区 ,多消费者, 这样再多消费者也就只有一个在工作。

2. 多分区,多消费者,任务投递的指定 key ,这样同样 key 的任务在同一个分区,也是被顺序消费的。

3. 分布式锁 , 抢到锁的去消费
NoKey
2024-08-28 10:54:23 +08:00
@Marinaaaa 我现在用的是第二种,指定生成者往指定分区发消息,消费者就算只有一个,也有问题:我在消费方法中加了 sleep 来模拟处理数据耗时,第一条消息还在 sleep 的时候,第二条消息到来,也会进入处理阶段,也就是消费者相当于多线程的,不断的在消费。不知道这种情况如何处理

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1068284

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX