突然想到一个问题,消息队列的意义是什么?
消息队列 发明的初衷 是 降低下游的压力,让下游的服务按照自己的能力去消费。
但是这引发了另一个问题,如果下游服务的消费能力小于上游服务的生产能力,那么必然会造成消息积压,而且随着时间的累计会越积越多。
为了解决这个问题,不得不增加消费能力,但是又出现了一个问题,如果消费能力上去了,可以让队列里不积压消息了,那就说明消费能力不比生产能力差了,既然如此,为什么不直接让生产者调用消费者?
消息队列 发明的初衷 是 降低下游的压力,让下游的服务按照自己的能力去消费。
但是这引发了另一个问题,如果下游服务的消费能力小于上游服务的生产能力,那么必然会造成消息积压,而且随着时间的累计会越积越多。
为了解决这个问题,不得不增加消费能力,但是又出现了一个问题,如果消费能力上去了,可以让队列里不积压消息了,那就说明消费能力不比生产能力差了,既然如此,为什么不直接让生产者调用消费者?
另一方面,云服务器可以动态扩容,按需付费。
懂了,谢谢大佬们
两点:
1. 核心处理能力总是有限的,就算很强,也是有限
2. 队列不一定是一维的,可以根据处理能力,把多个待处理任务放在队列同一个位置,这样也能高效发挥核心处理的能力
很多时候队列一维,只是受限于压入时只能逐个压入,可以做个“队列“的”队列”,把多个单一任务组成一组再压入队列
实现解耦时候,上下游各自开发各自的,只要用相同的规则去读 /写队列即可
仅当削封填谷奏效的时候才行, 不过实际上绝大部分场景都很奏效. 积压的问题是下游的总计算能力先天就不足.
比如你的机器单位时间能做的计算是 10000, 处理一个 HTTP 请求的需要的计算是 1, 生成一个 report 需要的计算是 1000, 某些请求只是返回页面, 偶尔一些请求会生成 report.
假如生成 report 时候有一些高峰, 一旦需要生成 100 个 report 系统可能就会被拖死. 有 Queue 你可以规定同一时间比如只能生成 5 个 report. 现实世界中, 很多系统中如没有 Queue 的话, 几乎每个月都会发生这种点背的情况, 有 Queue 的话就直接避免了.
+
多语言协作。
削峰场景下,越积越多时可以扩容 consumer 或者缩减 producer
解耦合场景下,队列可以作为一个性能测量点。前后两个部分可以分别进行测试调试
我个人认为所有不是为了削峰平谷用消息队列的一概是炫技,反正 3-5 年后这一块不一定还是自己维护。只要帅就够了。
上游多的时候,好的系统可以弹性伸缩,消费者自动增加。当然也不能无上限,上限是数据库的瓶颈。这个时候在一定阈值的时候会触发告警让 ops 或者研发上线关注堵塞情况。根据情况处理。而不会我本来写入只能 100 歌。突然来一万个导致写功能完全崩溃。这是很多场景下不能接受的。有同学会杠,那我直接调用也可以弹性伸缩啊。对,是可以,但是不一定来得及。怕你们是没有被突然 10-20 倍压力在 5 分钟内灌进来过…这不算什么。100 倍都有可能。弹性伸缩?你试试 10 秒内起 10 个 java 系的微服务或者 5 分钟内 100 台机器上千个微服务。而且马上全功率提供服务。所以没有支付系统是直接调用的。都是消息队列。结耦有毛线关系…就是怕挂了。
反过来,上游少,下游多。这是资源浪费,这是 ops 的活,和你没关系…
一下课全翁上去买饭,乱城一锅粥,可想而知。
其实直接调用的话,消费者处理不过来的时候,也会进消息队列。
这个消息队列就是操作系统的套接字队列。
比如你访问一个网站,有时候网站压力大,你就会等好几秒才看到内容,这个等待的过程也是消息队列。
你上传一个大文件,可网络就这么快,再快了也传不出去,最后只能卡在网卡的口子上慢慢发送,这个口子是发送缓冲区,也相当于是消息队列。
在你认为不需要消息队列的地方,其实都有消息队列。只不过他们不像那么大一个消息队列服务那样博眼球,而是都在背后默默工作。他们都是变相的队列。
如果没有消息队列
1 rpc 无论走 grpc 还是 http 自己需要做通信模型
2 如果需要请求确保达到(不幂等消息),需要做确达机制
3 性能要求高,需要实现负载均衡和集群
4 实现常用的广播,按主题、前缀广播
5 目的地(消费者)掉线或者来不及相应,需要缓存堆积到队列
上述功能都是常见的需求,满足这些需求的通用组件叫“消息队列”而已
不用消息队列你就得自己实现上面这些乱七八糟的功能,
大部分情况下自己写的玩意就是劣质低功能版的消息队列
各种消息队列以及对应的使用模型无非都是更加适合某种情况而已
rabbitmq 这种就是特别看中消息确达
kafka 就是特别注重性能
不要专注的名字和名词解释上,写多业务就知道各种东西都是用来满足业务需求的
能问出这个问题说明业务写得少或者想太少
cpu 为什么不直接调用硬盘?硬盘太慢怎么半加个缓存 ,缓存就叫内存
内存还是太慢 加个 cpu 缓存, 一级缓存还不够,再来二级 三级
硬盘还是太慢?记得当年的 ssd 缓存硬盘不? 用阵列卡还有阵列卡缓存
对应到“所谓的生产者消费者”不是一个道理么?
各种大型系统不也是不行就加一层缓存不够再加一层么
消息队列就是这加的一层而已
大型系统中间商肯定是必须存在的
你看现实里消费者也不是直接去工厂拿货呀,买显卡还会被耍猴呀
但是程序中,消费端是不停的在消费的。 完全两个概念。
我感觉你只看了一眼标题就回答了,没看我的详细描述。 我的问题是基于详细描述的那个前提的
虽然阿姨打饭得速度没变,但整体效率似乎区别很大。
同样得,十字路口,没有红绿灯不用排队等得话,想想啥效果。