RabbitMQ
同步调用
双方交互都是实时的,可以立即返回结果
问题
- 拓展性差:每次有新的需求,代码经常变动,不符合开闭原则
- 性能下降:调用者需要等待服务提供者分别执行后才返回结果,服务提供者很多情况下会影响最终业务响应时间
- 级联失败:其中某一个服务提供者出现错误,回滚整个业务(用户已经扣完款之后因为短信发送失败,从而整体回滚。这样是不对的)
异步调用
双方交互不是实时的,可以同时执行多个操作
异步调用方式基于消息通知的方式,一般包含三个角色
- 消息发送者:投递消息的人,原调用方
- 消息Broker:管理,暂存,转发消息
- 消息接收者:接受和处理消息的人,原服务提供方
优势
- 耦合度高
- 性能更好
- 业务拓展性抢
- 故障隔离,避免级联失败
问题
- 完全依赖Broker的可靠性,安全性和性能
- 架构复杂,后期维护和调试麻烦
技术选型
安装部署
dockerfile
docker run \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=root \
-v mq-plugins:/plugins \
--name mq \
--hostname mq \
-p 15672:15672 \
-p 5672:5672 \
-d \
rabbitmq:3.8-management
默认登录地址 https://ip:15672
基本概念
- publisher :⽣产者,也就是发送消息的⼀⽅
- consumer :消费者,也就是消费消息的⼀⽅
- queue :队列,存储消息。⽣产者投递的消息会暂存在消息队列中,等待消费者处理
- exchange :交换机,负责消息路由。⽣产者发送的消息由交换机决定投递到哪个队列。
- virtual host :虚拟主机,起到数据隔离的作⽤。每个虚拟主机相互独⽴,有各⾃的exchange、queue
- virtual host :虚拟主机,起到数据隔离的作⽤。每个虚拟主机相互独⽴,有各⾃的exchange、queue