MQ全称 Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。
传统的分布式系统有两种通信方式:
消息队列也可以作为一种第三方工具介入分布式系统之间的通信。
MQ的优势和劣势
MQ的优势主要有三种:
MQ的劣势主要也有三种:
4. 系统可用性降低:系统引入的外部依赖越多,系统稳定性越差。一旦 MQ 宕机,就会对业务造成影响。
5. 系统复杂度提高:MQ 的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过 MQ 进行异步调用。如何保证消息没有被重复消费?怎么处理消息丢失情况?那么保证消息传递的顺序性?
6. 一致性问题:A 系统处理完业务,通过 MQ 给B、C、D三个系统发消息数据,如果 B 系统、C 系统处理成功,D 系统处理失败。如何保证消息数据处理的一致性?
RabbitMQ是消息队列的一种,采用Erlang语言开发,下面是Rabbit的基础架构图:

RabbitMQ相关概念介绍
Broker:接收和分发消息的应用,RabbitMQ Server就是 Message Broker。
Connection:连接,应用服务与Server的连接。
Channel:信道,客户端可建立多个Channel,每个Channel代表一个会话任务。
Message:消息,由MessageProperties和body构成,MessageProperties可对消息的优先级、过期时间等参数进行设置,其中参数correlation_id一般作为消息主键。
Exchange:交换机,用于转发消息,消息将根据routeKey被交换机转发给对应的绑定队列。
Queue:队列,消息最终被送到这里等待消费者取走,参数中的Auto-delete意为当前队列的最后一个消息被取出后是否自动删除。
Binding:绑定exchange和queue之间的虚拟连接,二者通过routingkey进行绑定。
Routingkey:路由规则,交换机可以用它来确定消息被路由到哪里。
Virtual host:类似于网络中的 namespace 概念,用于进行逻辑隔离,一个虚拟主机中可以有多个Exchange和Queue,同一个虚拟主机中不能有名称一样的Exchange和Queue。
RabbitMQ最简单的一种安装方式就是将它安装在Docker中:
首先创建一个目录用于与容器中的rabbitmq配置文件形成映射:
mkdir /opt/module/rabbitmq/data -p
接着在docker中运行rabbitmq镜像:
# 5672是rabbitmq 默认TCP监听端口,到时候程序连接的也是这个端口
# 15672是rabbitmq提供的ui管理界面的端口
# 25672是rabbitmq集群之间通信的端口
# 如果docker跑在云服务器上,记得在安全组中开放5672和15672端口
docker run -d --hostname rabbit-svr --name rabbit -p 5672:5672 -p 15672:15672 -p 25672:25672 -v /opt/module/rabbitmq/data:/var/lib/rabbitmq rabbitmq:management
然后就可以在浏览器中访问rabbitmq的ui控制界面了,默认账号和密码都是guest:

我们可以在控制台中创建相应的exchange、queue等等操作:
