Part1是什么?为什么?
1、什么是消息队列
说到Java中的队列应该都不会陌生。其具有通过先进先出,或者双端进出的方式进行数据管理;通过阻塞以达到自动平衡负载的功能。
消息队列之所以以队列命名,起初也是因为其功能和操作,和java的本地队列有相似之处。所以,我们可以简单的认为消息队列就是为了满足分布式下各服务之间的数据传输、管理和消费的一种中间服务。
2、为什么要使用消息队列
问:你们的系统中为什么要引入消息队列?
我们总归需要知晓消息队列的使用价值,以及自己的业务场景下的实际痛点才能回答为什么要用消息队列这个问题,才能回答系统引入消息队列的价值所在。
系统间解耦
图片广告检索系统,需要感知广告贴的信息变动来更新自己的索引,但实际上检索系统和投放、物料、资产等系统间没有必要依靠接口对感知行为进行强关联,且接口的方式在维护和系统的压力方面不友好,那么,消息队列的作用就显的很重要了,各系统发布各自的消息,谁需要谁订阅,达到目的同时不会增加额外的系统调用压力。(注:builder的接口调用是为了获取最新的信息,此处可以通过压缩等方式进行优化)
因此,当系统间无实时数据交互要求,但还需要其业务信息时,可以用消息队列来达到系统间解耦的作用,只要发布方定义好消息队列格式,消费方的任何操作均可和发布方无关,减少了不必要的联调和发布冲突等影响。
服务异步化
最典型的一个例子,就是支付场景下的结果通知功能。
我们知道,一般情况下不管是app push 还是短信通知,都是比较耗时的操作。所以,没有必要因为这些非核心功能的耗时操作而影响了支付的核心操作,只要我们在支付操作完成之后,将支付结果发到短信中心指定的消息topic下,短信中心自然会接收到此消息并保证通知给用户。
因此使用消息队列,让非核心的操作异步化,提高整个业务链路的高效和稳定,是很有效的。
削峰填谷
这个功能使我们本篇关注的重点,面对特殊场景如秒杀、春晚红包等万亿级流量的脉冲式压力下,一种保护我们系统的服务免于崩溃的有效手段就是消息队列。
通过消息中心高性能的存储和处理能力,将超过系统处理能力的多余流量暂时存储起来,并在系统处理能力内平缓释放出来,达到削峰的