MQ 介绍
- MQ:Message Queue,消息队列。生产者生产消息存放到队列里,消费者监听队列内容,伺机消费消息
2. 优点:MQ 中消息的生产和消费是异步的,生产者与消费者无侵入、低耦合
3. 常见的 MQ 框架
1 | markdown复制代码# ActiveMQ |
RabbitMQ 介绍
- RabbitMQ 官网:www.rabbitmq.com/
2. RabbitMQ 的优点
1 | markdown复制代码- 使用 Erlang 语言开发,Erlang 是性能强劲的 Socket 编程语言 |
- RabbitMQ 相关概念
1 | markdown复制代码# AMQP 协议 |
* Windows 通过官网下载 RabbitMQ 安装包,配合 Erlang 环境启动
* Linux 通过包管理器安装 RabbitMQ
* Linux 通过 [Dcoker](https://hub.docker.com/_/rabbitmq) 拉取 RabbitMQ 镜像并启动
- 管理 RabbitMQ
RabbitMQ 提供了一个 Web 管理页面,默认在 15672 端口,登录后可以管理 RabbitMQ 的服务的相关配置
如添加一个虚拟主机
如添加一个用户,可以设置用户对虚拟主机的访问权限
RabbitMQ 使用
下列代码的 RabbitMQ 版本为 3.8.23
创建通道
1 | java复制代码 // 获取 MQ 连接对象的工厂对象 |
创建队列
1 | java复制代码channel.queueDeclare("demoQueue", false, false, false, null); |
工作队列模型
- 工作队列模型
使用一个消息队列,有一个或多个消费者,各消费者获取不同的消息进行消费
2. 发布消息
1 | java复制代码channel.basicPublish("", "demoQueue", null, "demo queue".getBytes()); |
交换机名称为空字符时,使用默认交换机
每一个队列会自动将队列同名的 Routing Key 绑定到默认交换机上
channel 和 connection 使用完成后需要关闭
3. 消费消息
1 | java复制代码// 绑定和生产者相同的队列 |
- 消息分配
在工作队列模型中,多个消费者默认平均分配消息
如果使用手动确认,且设置每个通道同时只消费一个消息,只有确认后才能消费下一个消息
这种方式消息分配数量和处理速度有关,即能者多劳
手动确认消息
1 | java复制代码// 设置通道同时只能消费一个消息 |
发布订阅模型
- 广播模型
每个消费者都有自己的队列,每个队列都要绑定到交换机,生产者将消息发送到交换机,由交换机进行分配
2. 发布消息
1 | java复制代码// 声明交换机 |
- 消费消息
1 | java复制代码// 声明交换机 |
发布订阅模型中生产者只要声明交换机即可,消费者声明临时队列并绑定到交换机,Routing Key 全部使用空字符串,一旦交换机接收到消息,就转发到每一个绑定的队列
路由主题模型
- 路由主题模型
在发布订阅模型中,全部消费者都可以获取相同的消息
在路由主题模型中,交换机不再将消息转发到每一个队列,而且根据路由和主题进行匹配
2. 发布消息
1 | java复制代码// 声明交换机 |
- 消费消息
1 | java复制代码 // 声明交换机,direct 类型 |
channel.queueBind 可以多次调用,以绑定多个 Routing Key
4. 动态路由
动态路由可以在 Routing Key 中使用通配符,#
代表任意字符串,*
代表一个单词
生产者发布消息
1 | java复制代码// 声明交换机 |
消费者绑定队列
1 | java复制代码// 声明交换机,topic 类型 |
三大模型总结:
工作队列模型:无交换机单队列,争消息
发布订阅模型:有交换机空路由,同消息
路由主题模型:有交换机有路由,按路由
集成 SpringBoot
- 引入依赖
1 | xml复制代码<dependency> |
- 配置 application.yaml
1 | java复制代码spring: |
配置完成后,RabbitTemplate 就可用了。RabbitTemplate 封装了一系列 RabbitMQ 的操作
3. 工作队列模型
发布消息
1 | java复制代码@SpringBootTest |
消费消息
1 | java复制代码@Component |
在 Spring AMQP 中,工作队列模型是公平消费的,可以通过配置预处理个数和手动确认来实现能者多劳
4. 发布订阅模型
发布消息
1 | java复制代码@SpringBootTest |
消费消息
1 | java复制代码@Component |
- 路由主题模型
发布消息
1 | java复制代码@SpringBootTest |
消费消息
1 | java复制代码@Component |
RabbitMQ 集群
- 基础步骤
准备 RabbitMQ 服务,部署两台或以上 RabbitMQ 服务
配置.erlang.cookie
文件,.erlang.cookie
是加入服务集群的密钥,在集群服务中保持一致
在从节点上执行加入集群命令
1 | shell复制代码rabbitmqctl join_cluster --ram rabbit@<主机名称> |
在任意节点上设置镜像队列
1 | shell复制代码rabbitmqctl set_policy <策略名称> "<队列名称>" '{"ha-mode":"<镜像模式>"}' |
- Docker RabbitMQ 集群
拉取 RabbitMQ 镜像
1 | shell复制代码docker pull rabbitmq:3.8.23-management |
准备rabbitmq.conf
配置文件,配置默认账户、默认虚拟主机等
1 | shell复制代码loopback_users.guest = false |
启动三个 RabbitMQ 容器,挂载相同的.erlang.cookie
文件
1 | shell复制代码# 1 |
加入集群
1 | shell复制代码# 进入容器 |
配置策略,指定虚拟主机为 clusterMQ
1 | shell复制代码rabbitmqctl set_policy --vhost clusterMQ demoPolicy "^" '{"ha-mode":"all"}' |
本文转载自: 掘金