消息队列的执行效率问题

GhostCoder
  • 320
  • 最近在学习消息队列想问关于效率的问题,一帮同一时间如果来 100 个请求那么,可以说这些请求里的代码任务某种角度来说算是一起在执行(实际上当然不是)
  • 但是在队列中如果就一个消费者那么每次只能执行一个任务,如果要达到上文中的效果那是不是只能增加消费者呢?
  • 首先我想问我的理解是否正确,如果正确那这样岂不是效率反而低了,那要如何解决呢
回复
阅读 1.5k
3 个回答
然后去远足
  • 33.5k
✓ 已被采纳

你理解的基本是对。

但问题在于,“一个消费者那么每次只能执行一个任务”,并不见得就比 “这些请求里的代码任务某种角度来说算是一起在执行” 要慢,甚至很多场景下前者反倒是更快的。消息队列在此时起到的是“削峰填谷”的作用。

关于这点的原因先不细讲,我可以先拿一个游戏的例子举例子。

不知道题主玩没玩过星际争霸或帝国时代这两个游戏,这两个游戏在初代中都有一个很影响玩家体验 —— 大部队寻路问题。

具体表现为,如果你框选了很多个单位,把他们移动到另一处,如果在移动路径中出现一处比较狭窄的地形(比如山谷),经常会出现所有单位都在入口挤作一团,半天也过不去一个兵。但如果你是一个一个选中这些单位,分别让他们依次通过这处狭窄地形,从整体上来看最后通过的时间反倒要少于前面那样整体的操作。

希望这个例子会对你理解上面的问题有一定启发。


至于要不要增加消费者,要具体问题具体分析,看瓶颈到底是不是在消费者不足上。比如如果你是数据库并发能力不足了、CPU 内存都已经打到百分百了,你再增加消费者,只会让系统进一步崩溃。

首先得搞清楚使用队列的目的,一般目的有两个:

1、先来先得 比如在库存有限的店铺中,有很多人来下单,那队列就可以做到先下单先得的效果;

2、削峰 比如高速 ETC 收费站,在上下班高峰期并发极高,这个时候如果请求同步执行,那么会造成大量请求无法快速完成而导致崩溃,这个时候可以先行将请求的关键数据放入队列,之后慢慢处理。

但是如果你的 消费者总体消费能力 长时间低于 生产者生产能力,那就是系统需要扩容了,也就是 消费者 需要扩容。

首先,MQ的作用之一就是用来削峰限流,避免服务承载过大的流量。如果想加大处理效率,是可以增加消费者,提升处理消费能力。

宣传栏