一、技术维度:
1.api发送和接收
2.MQ的高可用性
3.MQ的集群和容错配置
4.MQ的持久化
5.延时发送/定时投递
6.签收机制
7.spring整合
8. ...
二、产生背景:
生活中的例子----学生请教老师问题:张三和老师聊着5-10分钟,李四在后面等着,后面又来了很多同学,等着等着...
后面的同学平白无故的等待,老师不能休息,系统负担重,耦合度高,一直等着...没听到答案就不走
后来,有了MQ,老师旁边坐了一个班长,老师让后面等待的同学把问题按照约定的消息格式把问题写好,按照前后顺序把问题交给班长(抵御洪峰流量,达到保护主业务的目的,消峰),大家不用在这里耗着,不用再找老师(没有调用老师,..解决了耦合调用的问题),早上问的问题,回去查资料(异步模型...)
技术上-----系统之间直接调用实际工程落地和存在的问题 :
微服务架构后,链式调用是我们在写程序时候的一般流程,为了完成一个整体功能会将其拆分成多个函数(子模块),比如A模块调用B模块,B模块调用C模块,C模块调用D模块,但是大型分布式应用中,系统之间的RPC交换繁杂,这些架构背后会面临着的问题:
系统之间接口耦合比较严重:
每新增一个下游功能,都要对上游的相关接口进行改造;举个例子:如果系统A要发送数据给系统B和系统C,发送给每个系统的数据可能有差异,因此系统A对要发送给每个系统的数据进行了组装,然后逐一发送;当代码上线后又新增了一个需求:把数据也发送给D,新上了一个D系统也要接受A系统的数据,此时就需要修改A系统,让他感知到D系统的存在,同时把数据处理好再给D。在这个过程你会看到,每接入一个下游系统,都要对系统A进行代码改造,开发联调的效率很低。其整体架构如下图:
面对大流量并发时,容易被冲垮:
每个接口模块的吞吐能力是有限的,这个上限能力如果是堤坝,当大流量(洪水)来临时,容易被冲垮。举个例子秒杀业务:上游系统发起下单购买操作,就是下单一个操作,很快就完成。然而,下游系统要完成秒杀业务后面的所有逻辑(读取订单,库存检查,库存冻结,余额检查,余额冻结,订单生产,余额扣减,库存减少,生成流水,余额解冻,库存解冻)。
等待同步存在性能问题:
RPC接口上基本都是同步调用,整体的服务性能遵循“木桶理论”,即整体系统的耗时取决于链路中最慢的那个接口。比如A调用B/C/D都是50ms,但此时B又调用了B1,花费2000ms,那么直接就拖累了整个服务性能。
根据上述的几个问题,在设计系统时可以明确要达到的目标:
1、要做到系统解耦,当新的模块接进来时,可以做到代码改动最小;能够解耦
2、设置流量缓冲池,可以让后端系统按照自身吞吐能力进行消费,不被冲垮;能削峰
3、强弱依赖梳理能将非关键调用链路的操作异步化并提升整体系统的吞吐能力;能够异步
三、MQ的主要作用:
1.消峰:抵御洪峰流量,保护了主业务。
2.异步:调用者无需等待
3.解耦:解决了系统之间耦合调用的问题。
四、MQ的定义
面向消息的中间件(message-oriented middleware)MOM能够很好的解决以上问题。是指利用高效可靠的消息传递机制与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型在分布式环境下提供应用解耦,弹性伸缩,冗余存储、流量削峰,异步通信,数据同步等功能。
大致的过程是这样的:发短信(到移动基站上)发送者把消息发送给消息服务器,消息服务器将消息存放在若干队列/主题topic[微信公众号,只要被订阅,对订阅过的用户发送消息]中,在合适的时候,消息服务器会将消息转发给接受者。在这个过程中,发送和接收是异步的,也就是发送无需等待,而且发送者和接受者的生命周期也没有必然的关系;尤其在发布pub/订阅sub模式下,也可以完成一对多的通信,即让一个消息有多个接受者。
五、MQ的特点
1.采用异步处理模式:
消息发送者可以发送一个消息而无须等待响应。消息发送者将消息发送到一条虚拟的通道(主题或者队列)上;
消息接收者则订阅或者监听该爱通道。一条消息可能最终转发给一个或者多个消息接收者,这些消息接收者都无需对消息发送者做出同步回应。整个过程都是异步的。
案例:
也就是说,一个系统跟另一个系统之间进行通信的时候,假如系统A希望发送一个消息给系统B,让他去处理。但是系统A不关注系统B到底怎么处理或者有没有处理好,所以系统A把消息发送给MQ,然后就不管这条消息的“死活了”,接着系统B从MQ里面消费出来处理即可。至于怎么处理,是否处理完毕,什么时候处理,都是系统B的事儿,与系统A无关。
2.应用系统之间解耦合:
发送者和接受者不必了解对方,只需要确认消息。
发送者和接受者不必同时在线。
3.整体架构: