(重点)如何保证消息队列的顺序性?
或者:如何保证从消息队列里拿到的数据按顺序执行?
解决方案的关键是在消费者消费之前,将有相关性的数据按顺序写入同一个队列(queue或者是内存队列)
1、rabbitMQ 中,有个默认是数据1进入一个queue并且只会被一个消费者消费
场景:(1queue对多consumer)三个消息按顺序写进了1个queue,但是这个queue对应了三个consumer,最终插入DB的顺序错乱了,原本是增删改,可能最后变成了改增删
图例:
解决方法:拆分多个queue,每个queue对应一个consumer,有相关性的数据按顺序写入一个queue,consumer按顺序消费。consumer内部用内存队列做排队,然后分发给底层不同worker来处理。
2、kafka 默认是一个partition只能被一个消费者消费
场景:在最后消费的时候,由于追求吞吐量,采用了多线程处理消费,数据的顺序写库乱了
解决方案:第一步是将有相关性的数据顺序写入同一个partition中去,然后指定消费者消费的patition,第二步是在消费者内部,消费者采用多线程消费消息之前,将相同订单ID的数据,订单ID数据hash一下写入同一个内存队列(是有顺序的),然后交给线程去处理。
注:由于单线程一条消息要处理几十ms,一秒钟只能处理几十条,吞吐量太低了。
多线程压测最高是消费者是4核8G的机器 单机,32条线程,最高每秒处理上千条消息。
你接受吗
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通