简介
RabbitMQ 是一个用 Erlang 编写的高级消息队列协议和开源消息代理软件(亦称消息中间件)。RabbitMQ 支持多种消息队列协议,包括 AMQP、MQTT、STOMP 等。 RabbitMQ 的主要特点包括:
- 可靠性:RabbitMQ 提供了高可靠性的消息队列服务,可以保证消息的可靠传递。
- 可伸缩性:RabbitMQ 可以轻松地扩展到数千个节点,以满足高并发和大流量的需求。
- 高性能:RabbitMQ 采用了高效的内存数据结构和异步 I/O 模型,以实现高性能的消息处理。
- 灵活的路由:RabbitMQ 支持灵活的路由机制,可以根据消息的属性和内容进行路由。
- 多语言支持:RabbitMQ 提供了多种编程语言的客户端库,包括 Java、Python、Ruby、C#等。
RabbitMQ 被广泛应用于各种场景,包括分布式系统、微服务架构、物联网、实时数据处理等。
同步调用
以支付为例
同步优势:时效性强,等待到结果后才返回
同步问题:拓展性差、性能下降、级联失败问题
异步调用
异步调用方式其实就是基于消息通知的方式,一般包含三个角色:
- 消息发送者:投递消息的人,就是原来的调用方
- 消息代理:管理、暂存、转发消息,你可以把它理解成微信服务器
- 消息接收者:接收和处理消息的人,就是原来的服务提供方
支付服务不在同步调用业务关联度低的服务,而是发送消息通知到 Broker
异步优势:解除耦合,扩展性强、无需等待,性能好、故障隔离、缓存消息,流量削峰填谷
异步问题:不能立即得到调用结果,时效性差、不确定下游业务执行是否成功、业务安全依赖Broker可靠性
MQ 技术选型
MQ(MessageQueue),中文是消息队列,字面来看就是存放消息的队列。也就是异步调用中的 Broker
安装
RabbitMQ 是基于 Erlang 语言开发的开源消息通信中间件,官网地址
shell
docker pull rabbitmq:3.8-management
docker run \
-e RABBITMQ_DEFAULT_USER=dong \
-e RABBITMQ_DEFAULT_PASS=123456 \
-v mq-plugins:/plugins \
--name mq \
--hostname mq \
-p 15672:15672 \
-p 5672:5672 \
-d \
rabbitmq:3.8-management
可以看到在安装命令中有两个映射的端口:
- 15672:RabbitMQ提供的管理控制台的端口
- 5672:RabbitMQ的消息发送处理接口
安装完成后,我们访问 http://你的服务器IP:15672即可看到管理控制台。首次访问需要登录,默认的用户名和密码在配置文件中已经指定了。登录后即可看到管理控制台总览页面 其中包含几个概念
- publisher:生产者,也就是发送消息的一方
- consumer:消费者,也就是消费消息的一方
- queue:队列,存储消息。生产者投递的消息会暂存在消息队列中,等待消费者处理
- exchange:交换机,负责消息路由。生产者发送的消息由交换机决定投递到哪个队列
- virtual host:虚拟主机,起到数据隔离的作用。每个虚拟主机相互独立,有各自的exchange、queue
RabbitMQ 控制台使用
添加二个队列 hello.queue1、hello.queue2 点击选择一个交换机 交换机绑定队列 通过交换机模拟发送消息 可以看到队列收到消息和具体消息 总结:只有交换机和队列绑定了才可以发送到队列,只要和当前发送消息的交换机绑定的队列都能收到
数据隔离
我们可以在右上角看到可以选择不同的虚拟主机 新建一个用户 新建一个虚拟机