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

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

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

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

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

12775 次点击
所在节点    Java
95 条回复
yogogo
2020-12-02 13:20:18 +08:00
@a719031256 在支付系统里,队列实在是太好用了
laike9m
2020-12-02 14:00:53 +08:00
解耦,方便扩展
night98
2020-12-02 15:12:55 +08:00
很简单的例子,去火车站排队买票,在大部分时候都只会有一个人去买票,所以是够用的,等到节假日的时候,就有很多人了,这时候就只能排队等候买票,等这波过完了,还是可以正常直接买票的。
其次在业务中,很多时候新增功能就不再需要修改生产者代码了,按照你所说的生产者直接调用消费者,是需要修改生产者的代码的,而使用队列的话,就不需要修改生产者代码了,例如 rocketmq 可以新增一个消费类型
在实际业务中,例如支付业务,支付完成后发一个消息到业务方,现在新增需求,需要统计支付渠道和金额数据,这时候直接新增一个订阅消息的消费者就行了,不需要修改生产者的代码。
dV9zZM1wROuBT16X
2020-12-02 15:31:12 +08:00
解耦 /写缓冲,你说的情况太理想,实际情况一般都是突发大量写,其他情况都是小水流
mingl0280
2020-12-02 15:45:54 +08:00
消息队列适用于突发大规模生产的情况,此时下游来不及处理,那么消息队列可以保证消息不丢失。
例如我有个指纹传感器,下游处理程序的运行速度是 15fps,上游图像传感器没有手指的时候是 1fps,有手指可以瞬间跑到 60fps 但是只持续不到 1 秒,这个时候就可以用更便宜的 dsp 来处理数据……
wizardoz
2020-12-02 16:06:58 +08:00
蓄水池有什么用呢?直接从上游的水放到用水的地方不就行了
lolizeppelin
2020-12-02 16:22:02 +08:00
楼上说的那么多都是后话,甚至还有人说只有面试有用。

如果没有消息队列

1 rpc 无论走 grpc 还是 http 自己需要做通信模型
2 如果需要请求确保达到(不幂等消息),需要做确达机制
3 性能要求高,需要实现负载均衡和集群
4 实现常用的广播,按主题、前缀广播
5 目的地(消费者)掉线或者来不及相应,需要缓存堆积到队列

上述功能都是常见的需求,满足这些需求的通用组件叫“消息队列”而已
不用消息队列你就得自己实现上面这些乱七八糟的功能,
大部分情况下自己写的玩意就是劣质低功能版的消息队列


各种消息队列以及对应的使用模型无非都是更加适合某种情况而已
rabbitmq 这种就是特别看中消息确达
kafka 就是特别注重性能


不要专注的名字和名词解释上,写多业务就知道各种东西都是用来满足业务需求的
能问出这个问题说明业务写得少或者想太少
lolizeppelin
2020-12-02 16:38:12 +08:00
顺便补充下,其实所有思路都是一致的

cpu 为什么不直接调用硬盘?硬盘太慢怎么半加个缓存 ,缓存就叫内存

内存还是太慢 加个 cpu 缓存, 一级缓存还不够,再来二级 三级

硬盘还是太慢?记得当年的 ssd 缓存硬盘不? 用阵列卡还有阵列卡缓存


对应到“所谓的生产者消费者”不是一个道理么?
各种大型系统不也是不行就加一层缓存不够再加一层么

消息队列就是这加的一层而已
大型系统中间商肯定是必须存在的
你看现实里消费者也不是直接去工厂拿货呀,买显卡还会被耍猴呀
lzyliangzheyu
2020-12-02 17:47:08 +08:00
怕来不及处理丢数据。。。。晚处理总比不处理的好
Joker123456789
2020-12-03 09:46:10 +08:00
@wizardoz 本来就可以啊,有什么问题吗? 蓄水是因为下游 有时需要水,有时不需要水。 就是个仓库的作用。

但是程序中,消费端是不停的在消费的。 完全两个概念。

我感觉你只看了一眼标题就回答了,没看我的详细描述。 我的问题是基于详细描述的那个前提的
Aresxue
2020-12-03 10:29:40 +08:00
因为现实中流量是极其不均匀的,消息队列不是为了技术出现的,是为业务出现的
stevenkang
2020-12-03 11:16:01 +08:00
学校食堂打饭,排队和不排队得区别。

虽然阿姨打饭得速度没变,但整体效率似乎区别很大。

同样得,十字路口,没有红绿灯不用排队等得话,想想啥效果。
zycode277
2020-12-03 13:02:34 +08:00
削峰
onetheway
2020-12-03 17:04:38 +08:00
@lolizeppelin 老哥说的有道理的
MortyP
2020-12-03 19:27:32 +08:00
三峡大坝也是有用的

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

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

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

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

© 2021 V2EX