突然想到一个问题,消息队列的意义是什么?

2020-12-01 14:25:40 +08:00
 Joker123456789

消息队列 发明的初衷 是 降低下游的压力,让下游的服务按照自己的能力去消费。

但是这引发了另一个问题,如果下游服务的消费能力小于上游服务的生产能力,那么必然会造成消息积压,而且随着时间的累计会越积越多。

为了解决这个问题,不得不增加消费能力,但是又出现了一个问题,如果消费能力上去了,可以让队列里不积压消息了,那就说明消费能力不比生产能力差了,既然如此,为什么不直接让生产者调用消费者?

12061 次点击
所在节点    Java
95 条回复
jimmyismagic
2020-12-01 14:49:15 +08:00
消息队列能够增加吞吐量,就像程序员搬砖一样,如果每个人都从头搬到尾,效率低,而如果每个人接力,那么效率就快得多,而且不会来回堵塞道路,毕竟路的宽度是有限的
linxl
2020-12-01 14:52:48 +08:00
最近在下载视频, 如果不用消息队列, 那我买不起那么好的服务器
nnqijiu
2020-12-01 14:57:59 +08:00
本质就是作一个缓冲区
imn1
2020-12-01 15:20:09 +08:00
@nnqijiu +1

两点:
1. 核心处理能力总是有限的,就算很强,也是有限
2. 队列不一定是一维的,可以根据处理能力,把多个待处理任务放在队列同一个位置,这样也能高效发挥核心处理的能力

很多时候队列一维,只是受限于压入时只能逐个压入,可以做个“队列“的”队列”,把多个单一任务组成一组再压入队列
opengps
2020-12-01 15:24:34 +08:00
关键词:解耦

实现解耦时候,上下游各自开发各自的,只要用相同的规则去读 /写队列即可
snowwalf
2020-12-01 15:26:47 +08:00
削峰填谷,省钱
BigBunny
2020-12-01 15:37:40 +08:00
削峰,异步,解耦
walsh
2020-12-01 15:58:05 +08:00
不就是流水线机制吗,互联网喜欢重新发明新词
ggabc
2020-12-01 15:59:41 +08:00
其实,不用也不是不行,小系统不用他反而更简化
namelosw
2020-12-01 16:02:12 +08:00
> 但是这引发了另一个问题,如果下游服务的消费能力小于上游服务的生产能力,那么必然会造成消息积压,而且随着时间的累计会越积越多。

仅当削封填谷奏效的时候才行, 不过实际上绝大部分场景都很奏效. 积压的问题是下游的总计算能力先天就不足.

比如你的机器单位时间能做的计算是 10000, 处理一个 HTTP 请求的需要的计算是 1, 生成一个 report 需要的计算是 1000, 某些请求只是返回页面, 偶尔一些请求会生成 report.

假如生成 report 时候有一些高峰, 一旦需要生成 100 个 report 系统可能就会被拖死. 有 Queue 你可以规定同一时间比如只能生成 5 个 report. 现实世界中, 很多系统中如没有 Queue 的话, 几乎每个月都会发生这种点背的情况, 有 Queue 的话就直接避免了.
kuaner
2020-12-01 16:09:27 +08:00
让杂乱无序的事情,变得有序
robinlovemaggie
2020-12-01 16:17:32 +08:00
想象一下摇·号于政·府的意义~
useben
2020-12-01 16:21:16 +08:00
解耦 异步 削峰 缓冲 协作开发
czzt1
2020-12-01 16:28:28 +08:00
削峰填谷
yolee599
2020-12-01 17:01:56 +08:00
一个是让你一天吃完十天量的饭,剩下的九天不吃;另一个是一天只吃一天的量,每天都吃。哪个比较好?
yangzzcc
2020-12-01 17:06:04 +08:00
不外乎几个作用, 解耦, 流量削峰, 异步...
HalloCQ
2020-12-01 17:09:40 +08:00
解耦、异步、削峰,消息队列的三大作用。面试不问的吗
northisland
2020-12-01 17:14:20 +08:00
解耦 异步 削峰

+

多语言协作。
northisland
2020-12-01 17:15:17 +08:00
@walsh 贫乏的汉语
julyclyde
2020-12-01 17:32:27 +08:00
1 削峰
2 耗时长的任务,把交付任务和取得结果两个步骤分离
3 解耦合

削峰场景下,越积越多时可以扩容 consumer 或者缩减 producer
解耦合场景下,队列可以作为一个性能测量点。前后两个部分可以分别进行测试调试

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

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

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

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

© 2021 V2EX