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

124 天前
 NoKey
就是有个场景,有个任务要处理,任务必须串行执行
为了保证任务下发后不丢失
打算借助 kafka 的持久化,把任务丢到 kafka 中
后台服务有多个节点,也就是多个节点在消费 kafka
怎么样才能做到串行消费 kafka 的消息呢?
就是说,多个节点排队消费,第一个节点拿到消息后,如果没处理完,其他节点不能继续消费
搞了好久都没实现
又不想用数据库存储然后定时读取的方式(这种方式肯定没问题)
想通过这个功能,学会 kakfa 的使用
请假一下各位大佬,基于 kafka 能不能实现这个想法呢?谢谢
2418 次点击
所在节点    Kafka
30 条回复
wwhontheway
124 天前
没看懂,你说的串行是什么? task 按顺序一个一个消费?
------------------------
就是说,多个节点排队消费,第一个节点拿到消息后,如果没处理完,其他节点不能继续消费
------------------------
这又是啥?这不是串行呀。这是 task lock 保证的
zhhmax
124 天前
@NoKey #20 你手动提交每条消息的 offset ,然后把消费的方法改成阻塞式,这样每次消费完再手动提交之后才会消费下一条消息。
NoKey
124 天前
@wwhontheway 就是想知道 springboot+kafka ,能不能做成一个简单的串行处理队列😁
wwhontheway
124 天前
@NoKey 那就是单实例呀,多实例串行,工作只有一个,其他实例闲着,何必多实例?
GeekGao
124 天前
创建一个专门用于处理这些串行任务的 Kafka 主题,然后:
使用单一消费者实例,属于自己的消费者组
使用 TransactionalId 来跟踪每个任务的进度
实现一个轮询机制,定期检查任务是否已经完成,如果完成则提交 offset 并删除该任务
可以考虑使用 Kafka Streams 或 KSQL 来简化实现这个业务
csys
124 天前
你手动指定分区或者使用相同的消息 key ,这样所有消息都会被发送到同一个分区,而一个分区只会被分配给一个消费者,相当于你只有一个订阅到此分区的消费实例在消费这些消息,其它消费者都在空跑
guojiawei0203
124 天前
没啥量直接单分区,多分区根据 key 去 hash
wysnxzm
124 天前
将任务分组保证同一组的任务被同一个消费者消费,该消费者保证自身所有任务串行执行
这样可以在多消费者的同时保证串行
vaynecv
124 天前
启动的时候指定某一个实例进行消费,其他示例忽略此消息
night98
123 天前
你是想 1 到 10 总共十条消息,无论如何都要保证按照 1 到 10 按顺序消费,不能出现 1 ,2 同时消费,然后再 3 ,4 同时消费的情况,是这个业务逻辑是吗?

spring kafka 限制单次消费拉取的数据量,然后就是楼上那些说的,一起弄一下就 ok 了

实际逻辑就是一次必须只能有一个人持有消息,持有后必须按顺序消费。

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

https://www.v2ex.com/t/1068284

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

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

© 2021 V2EX