目录
1.利用SpringAMQP实现HelloWorld中的基础消息队列功能:
一、初识MQ
1、同步通讯和异步通讯
同步通讯:在和别人语音聊天时,别人不能再和你进行语音聊天。即只能可以和一个人进行语音聊天
异步通讯:例如微信聊天,你可以同时和多个联系人进行聊天。
2、同步调用存在的问题
1.耦合度高:每次加入新的需求,都要修改原来的代码
2.性能下降:调用者需要等待服务提供者响应,如果调用链过长则响应时间等于每次调用的时间之和。
3.资源浪费:调用链中的每个服务在等待响应过程中,不能释放请求占用的资源,高并发场景下会极度浪费系统资源
4.级联失败:如果服务提供者出现问题,所有调用方都会跟着出问题,如同多米诺骨牌一样,迅速导致整个微服务群故障
3、异步调用可以解决上述问题
异步调用常见实现就是事件驱动模式:
我们以购买商品为例,用户支付后需要调用订单服务完成订单状态修改,调用物流服务,从仓库分配响应的库存并准备发货。
在事件模式中,支付服务是事件发布者(publisher),在支付完成后只需要发布一个支付成功的事件(event),事件中带上订单id。
订单服务和物流服务是事件订阅者(Consumer),订阅支付成功的事件,监听到事件后完成自己业务即可。
为了解除事件发布者与订阅者之间的耦合,两者并不是直接通信,而是有一个中间人(Broker)。发布者发布事件到Broker,不关心谁来订阅事件。订阅者从Broker订阅事件,不关心谁发来的消息。
Broker 是一个像数据总线一样的东西,所有的服务要接收数据和发送数据都发到这个总线上,这个总线就像协议一样,让服务间的通讯变得标准和可控。
好处:
-
吞吐量提升:无需等待订阅者处理完成,响应更快速
-
故障隔离:服务没有直接调用,不存在级联失败问题
-
调用间没有阻塞,不会造成无效的资源占用
-
耦合度极低,每个服务都可以灵活插拔,可替换
-
流量削峰:不管发布事件的流量波动多大,都由Broker接收,订阅者可以按照自己的速度去处理事件
二、RabbitMQ快速入门
RabbitMQ是基于Erlang语言开发的开源消息通信中间件,官网地址:https://www.rabbitmq.com/
1.安装RabbitMQ
步骤参考资源中文件
MQ的基本结构:
RabbitMQ中的一些角色:
-
publisher:生产者
-
consumer:消费者
-
exchange个:交换机,负责消息路由
-
queue:队列,存储消息
-
virtualHost:虚拟主机,隔离不同租户的exchange、queue、消息的隔离
2.RabbitMQ消息模型
MQ的官方文档中给出了5个MQ的Demo示例,对应了几种不同的用法:
-
基本消息队列(BasicQueue)
-
工作消息队列(WorkQueue)
-
发布订阅(Publish、Subscribe),又根据交换机类型不同分为三种:
-
Fanout Exchange:广播
-
Direct Exchange:路由
-
Topic Exchange:主题
-