- 最近在学习消息队列想问关于效率的问题,一帮同一时间如果来
100
个请求那么,可以说这些请求里的代码任务某种角度来说算是一起在执行(实际上当然不是) - 但是在队列中如果就一个消费者那么每次只能执行一个任务,如果要达到上文中的效果那是不是只能增加消费者呢?
- 首先我想问我的理解是否正确,如果正确那这样岂不是效率反而低了,那要如何解决呢
100
个请求那么,可以说这些请求里的代码任务某种角度来说算是一起在执行(实际上当然不是)首先得搞清楚使用队列的目的,一般目的有两个:
1、先来先得
比如在库存有限的店铺中,有很多人来下单,那队列就可以做到先下单先得的效果;
2、削峰
比如高速 ETC
收费站,在上下班高峰期并发极高,这个时候如果请求同步执行,那么会造成大量请求无法快速完成而导致崩溃,这个时候可以先行将请求的关键数据放入队列,之后慢慢处理。
但是如果你的 消费者
的 总体消费能力
长时间低于 生产者
的 生产能力
,那就是系统需要扩容了,也就是 消费者
需要扩容。
1 回答1.3k 阅读✓ 已解决
1 回答1.1k 阅读
你理解的基本是对。
但问题在于,“一个消费者那么每次只能执行一个任务”,并不见得就比 “这些请求里的代码任务某种角度来说算是一起在执行” 要慢,甚至很多场景下前者反倒是更快的。消息队列在此时起到的是“削峰填谷”的作用。
关于这点的原因先不细讲,我可以先拿一个游戏的例子举例子。
不知道题主玩没玩过星际争霸或帝国时代这两个游戏,这两个游戏在初代中都有一个很影响玩家体验 —— 大部队寻路问题。
具体表现为,如果你框选了很多个单位,把他们移动到另一处,如果在移动路径中出现一处比较狭窄的地形(比如山谷),经常会出现所有单位都在入口挤作一团,半天也过不去一个兵。但如果你是一个一个选中这些单位,分别让他们依次通过这处狭窄地形,从整体上来看最后通过的时间反倒要少于前面那样整体的操作。
希望这个例子会对你理解上面的问题有一定启发。
至于要不要增加消费者,要具体问题具体分析,看瓶颈到底是不是在消费者不足上。比如如果你是数据库并发能力不足了、CPU 内存都已经打到百分百了,你再增加消费者,只会让系统进一步崩溃。