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

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

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

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

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

12773 次点击
所在节点    Java
95 条回复
xcstream
2020-12-01 23:46:15 +08:00
削峰填谷
AX5N
2020-12-02 00:02:17 +08:00
经常能见这种奇怪而又基础的问题,你们是没学过操作系统这门课吗。
akira
2020-12-02 01:42:27 +08:00
缓冲呀
neptuno
2020-12-02 09:36:23 +08:00
@Joker123456789 "直接调用下游服务,让下游服务去处理啊? 下游服务也可以负载均衡,动态扩容啊",例如支付成功回调,如果没有消息队列,你要调用仓库发货,调用订单接口,调用各种接口,多个系统就强耦合了。有了消息队列,你只要发送支付成功消息,各个系统收到消息后自己处理相应的逻辑即可
zarte
2020-12-02 09:52:44 +08:00
个人觉得主要是削峰填谷,长时间爆满就告警。解耦这要看水平,没啥经验的就不要硬上了大大的坑,对你或者负责实际开发的人。
TheWalkingDead
2020-12-02 10:00:39 +08:00
这就是为什么现在很多中小公司不想招应届生的原因了。
zxCoder
2020-12-02 10:10:27 +08:00
缓冲吧
holycrazy
2020-12-02 10:23:21 +08:00
主要是一个解耦和调度的问题。有了消息队列,相当于有了一个缓冲区,完事好商量,还能做好不同消费者之间的调度问题,这样代码只要写好业务逻辑就行了。
ming7435
2020-12-02 10:36:55 +08:00
@a719031256 这就是在扯淡了,稍微上点规模的系统都会使用消息队列好吧,起码我经历过的电商平台、支付平台、运营商系统都在规模使用,绝不仅仅面试使用
litujin1123
2020-12-02 10:37:55 +08:00
问这个问题,估计没被坑过,和用过队列吧?
refkent
2020-12-02 10:39:21 +08:00
4 点:
( 1 ) 程序、模块之间的耦合性大大降低;
( 2 )消息、事件、请求的顺序性和数据可恢复性
( 4 )异步通信能力
( 5 ) 缓冲能力,也就是抗压能力
summersnow521
2020-12-02 10:45:13 +08:00
还以为一楼直接:削峰平谷、异步处理、解耦,然后引的大家点赞就结束了,没想到下面一堆答案🐕
SwainWong93
2020-12-02 10:50:31 +08:00
想起上学的时候,写个计算器,问老师为啥要分 MVC ?
dvaknheo
2020-12-02 11:08:59 +08:00
小应用,用 mysql 做消息队列够了,需要用其他高级方案么
securityCoding
2020-12-02 11:14:17 +08:00
@walsh 互联网很多冒出来的理论很多都是计算机体系底层早就开始实践了的。
比如缓存-》 cpu cache,linux 的管道-》流式计算
iConnect
2020-12-02 11:19:09 +08:00
不需要很玄虚的理解,就是和食堂排队买饭一样。

一下课全翁上去买饭,乱城一锅粥,可想而知。
a719031256
2020-12-02 11:31:25 +08:00
@ming7435 我上一个项目就有用这个,7 个子系统的分布式项目,但我发现不用这个消息队列更好,现在客户那边让我们这边优化,还好我调到另一个项目去了,不然现在掉头发的就是我了
xyooyx
2020-12-02 12:58:28 +08:00
削峰是一个很重要的,让下游的需求平均化
sockpuppet9527
2020-12-02 13:00:19 +08:00
我想了目前我用到的两个场景:
1. 当你有 DMA 控制器的时候。
2. 当你有 AVX512 的时候。
msg7086
2020-12-02 13:06:28 +08:00
> 为什么不直接让生产者调用消费者?

其实直接调用的话,消费者处理不过来的时候,也会进消息队列。
这个消息队列就是操作系统的套接字队列。

比如你访问一个网站,有时候网站压力大,你就会等好几秒才看到内容,这个等待的过程也是消息队列。
你上传一个大文件,可网络就这么快,再快了也传不出去,最后只能卡在网卡的口子上慢慢发送,这个口子是发送缓冲区,也相当于是消息队列。

在你认为不需要消息队列的地方,其实都有消息队列。只不过他们不像那么大一个消息队列服务那样博眼球,而是都在背后默默工作。他们都是变相的队列。

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

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

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

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

© 2021 V2EX