MQ (Message queue) 消息队列

132 阅读3分钟

1. 同步通信与异步通信

1.1 同步通信

类似于视频通话功能,在执行视频通话的时候,双方的动作、语言等均会第一时间共享;

 在JAVA微服务项目,会存在同步调用的情况: 例如商品支付服务:在执行商品支付服务成功后,由支付服务发起通知-调用购物服务清空购物车、调用订单服务创建订单或更新订单状态,在调用服务正常执行完成后,返回一个通知告诉支付服务,支付服务通知短信服务通知客户。

上述这个例子,如果购物服务或者订单服务在执行过程中,支付服务是一直在等待的,这样造成了资源的浪费;其次如果两个服务其中一个执行异常的话,整个资源链就会一直停滞,耦合度太高;

1.1.1 同步通信优缺点

优点:时效性快,能第一时间获取服务反馈。

缺点:

1.耦合度过高
2.性能较差,数据吞吐量低
3.存在资源浪费的情况
4.有级联失败的情况-在服务同步调用下,如果被调服务出现异常,则服务调用者进程会一直停滞。

1.2 异步通信(Broker 事件代理--消息中间件)

类似于平时的聊天软件;例如两人聊天,A给B发消息,B因为有事无法第一时间回复,A可以去做别的事情,B看到消息回复给A,B去做别的事情,A看到消息也回复给B,A去做别的事情........如此就是异步通信,双方不需要保持一致性,只管发通知,不需要知道对方是否收到。

1.2.1 异步通信优缺点

优点:

1.耦合度低
2.性能较好,数据吞吐量高
3.消除了级联失败的影响
4.流量削峰-类似于流量整流

缺点:

1.过度依赖于Broker事件代理
2.当服务之间的调用被事件代理Broker取代后,无法跟踪业务,业务的流程不完整,整体的架构复杂;

2.1 Message Queue (Broker事件代理-java项目中应用的消息中间件)

2.1.1 常用MQ介绍

2.png

3.1 MQ 基本使用

3.1.1 基于Spring项目应用-Spring AMQP (Adavanced Message Queuing Protocol 业务协议,底层主要基于spring-rabbit实现)

** RabbitMQ 软件安装**

3.1.1.1依赖导入

3.png

3.1.1.2 application.yml文件设置

4.png

3.1.1.3 基于RabbitMQ 简单发送接收模型代码

6.png 5.png

3.1.2 WorkQueue模型(Exchange 交换机的引入)

在Java微服务的项目中,一个服务有可能需要调用多个服务,如果要SimpleQueue模型,代码太冗余,就引入了Exchange交换机-将通知转发给与交换机相互绑定的queue;ExChange 的应用需要加入一个配置类,配置类中包含了交换机、队列和绑定的声明,在spring项目启动的时候需要通过spring容器进行管理。 3.1.2.1 Exchange 交换机类型 1.Fanout Exchange 基本配置类 ExChange 的应用需要加入一个配置类,配置类中包含了交换机、队列和绑定的声明,在spring项目启动的时候需要通过spring容器进行管理,群发通知。 7.png 2.Direct Exchange Direct Exchange 直接在@RabbitListener注解中配置交换机、队列和绑定的声明,这种类型的交换机只能给通知的key值跟绑定的Key值相同的Queue发通知。 8.png 3.Topic Exchange 可以使用通配符#(0个/多个单词)/*(表示一个单词),只会将通知发给key匹配的queue中。

11.png

4.1 RabbitMq 消息序列化 RabbitMq 消息默认是基于JDK自带SimpleMessageConverter序列化的,这个序列化对于String类型等数据的可读性和存储大小还好,但是对于对象、Collecton这种变量类型,序列化后可读性差,消耗内存过大,因此需要重新定义一个序列化器 12.png