当系统中出现“生产”和“消费”的速度不一致或存在不稳定性因素的时候,就需要使用消息队列作为抽象层来弥合双方的差异。“消息”是在两台计算机间传送的数据单位,它可以很简单,例如只包含文本字符串;它也可以很复杂,例如包含嵌入对象。消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器。下面以Pulsar为例进行说明。
1、异步调用
假设有一个系统调用链路为 A 调用 B 耗时 20ms,B 调用 C 耗时 20ms,而 C 调用 D 需要 2s,整个调用过程需要耗时 2040ms。但实际上 A 调用 B,B 调用 C 只需要 40ms,而 D 系统的引入直接导致系统性能下降约 50 倍。此时我们可以考虑引入消息队列,将 D 系统的调用抽离出来,做一个异步调用:系统 A 到系统 B 再到系统 C 后就直接结束,系统 C 将消息发送到消息队列中,系统 D 从消息队列里获取消息进行消费,这样我们系统的性能就提高了接近 50 倍。
2、系统解耦
各个业务系统只处理自己的业务逻辑,并发送消息到消息队列。下游业务系统直接订阅消息队列的队列或主题获取事件。消息队列可用于单体应用被拆解为微服务后不同微服务间的通信。系统解耦的好处是不同系统的迭代不再相互依赖,能有效缩短数据链路长度,提高数据处理效率。
3、削峰填谷
大型活动带来较高流量时,如果没有提前做好相应保护很容易导致系统超负荷甚至崩溃,而限制太过则会导致请求大量失败而影响用户体验。消息队列服务拥有高性能的消息处理能力,可以承受流量脉冲而不被击垮,在确保系统可用性的同时,通过快速有效的请求响应技术提升用户体验。其海量消息堆积能力确保下游业务在安全水位内平滑稳定的运行,避免流量高峰的冲击。
4、广播通知
如果系统里一个状态的改变,需要通知多个相关系统,则可通过消息订阅的方式推送给各个订阅者系统。比如数据库值的改变,需要通知所有的缓存系统更新,可以把数据库值改变的消息发送给消息队列,然后各缓存订阅相关主题,收到消息后更新自己的缓存。
5、分布式缓存
在大数据场景中,日志分析往往需要处理大量日志,不可能存储在一台物理机上。消息队列可提供一个集群,用来存储海量消息,进一步供实时分析系统分析日志。
6、消息通讯
消息队列一般都内置了高效的通信机制,因此也可以用在纯粹的消息通讯场景中。比如实现点对点消息队列,或者聊天室等。