RabbitMQ使用分析,高可用集群搭建,案例分享
一、RabbitMQ 基础理解RabbitMQ,是一个使用 erlang 编写的 AMQP(高级消息队列协议)的服务实现,简单来说,就是一个功能强大的消息队列服务 。

文章插图
概念理解:
- Producer: 消息发送者
- RabbitMQ:
- Vhost: 相当于分组,每个vhost下数据是隔离的
- Exchange: 路由器,接收消息,本根据RoutingKey分发消息
- headers:消息头类型 路由器,内部应用
- direct:精准匹配类型 路由器
- topic:主题匹配类型 路由器,支持正则 模糊匹配
- fanout:广播类型 路由器,RoutingKey无效
- RoutingKey: 路由规则
- Queue: 队列,用于存储消息(消息的目的地)
- Consumer: 消息消费者
一个好的消息队列当然需要消息持久化功能,服务宕机,未消费消息不丢失,RabbitMQ持久化分为Exchange、Queue、Message
Exchange 和 Queue 持久化 指持久化Exchange、Queue 元数据,持久化的是自身,服务宕机,Exchange 和 Queue 自身就没有了
Message 持久化 顾名思义 把每一条消息体持久化,服务宕机,消息不丢失
Durable 持久、Transient 临时,Queue新建类似

文章插图
分析理解:
便于更直观的理解,把 RabbitMQ 的消息流对比与Http Rest接口更家熟悉形象
www.xxx.com/webAppPath/trade/getOrder -> getOrder(message) GET
RabbitMQ Server:同比 域名 www.xxx.com,只有通过域名才能到达 Server
Vhost:同比 /webappPath,一个域名可能指向多个app
Exchange:同比 /trade,trade/* 下有多个method,但是需要先到达这个Class
RoutingKey:同比 /getOrder,只有完成的 URL 才是有效的,才能确定到具体的方法 Queue:同比 getOrder(message) 消息的最终目的地
Exchange Type: 同比 GET,但是Rest MethodType是整个URL的Type,而不是 Queue
以上只是为了更好理解,千万不要混淆
Producer / Consumer 就很好理解了,基于AMQP协议链接RabbitMQ Server,发送消息 / 接收消息
二、RabbitMQ 消息确认策略分析Confrim / Transaction 概念应用
RabbitMQ 提供了两种可靠性的确认策略 Confrim / Transaction,Producer Client仅分析Spring-Amqp,两种机制主要影响发送:
Confrim: 简单说就是直接传送消息 client > mq, 接收到 mq > ack, mq 在异步的完成 接下来的事情
Transaction: client 请求开启事务 > 发送message > client 提交事务,整个过程是同步的,mq必须完成消息持久化、消息同步等 。
spring-amqp 提供的发送客户端 默认是Confrim 异步Ack模式,不用特殊配置,Transaction 需要在默认的基础上增加 RabbitMQ事务管理器
【RabbitMQ使用分析,高可用集群搭建,案例分享】// 1.向Spring中注册RabbitMQ事务管理器
@Bean
public RabbitTransactionManager rabbitTransactionManager(ConnectionFactory connectionFactory) {
return new RabbitTransactionManager(connectionFactory);
}
...
// 2.设置通道为Transaction类型
rabbitTemplate.setChannelTransacted(true);
...
// 3.对应的方法添加@Transactional
@Transactional
public void send(String exchange, String routingKey, Object object) {
rabbitTemplate.convertAndSend(exchange, routingKey, object);
}
// 这是只是举例,具体写法和其他说明,请具体看代码注释有更详细的说明和写法component.RabbitSender
Confrim / Transaction 测试分析

文章插图
Consumer
消费的机制和发送差不多, 但流程变为 Consumer 处理消息,需要Ack MQ Server, Server 才会真正的删除消息,通常消费者不需要开启事务,当处理异常抛出,Ack无法发到Server到,消息就会回到队列中,继续重试,阻塞到直到消息被消费Ack掉,所说的消息阻塞
具体写法和其他说明,请具体看代码注释有更详细的说明和写法component.Receiver
三、RabbitMQ 配置RabbitMQ 安装
RabbitMQ是基于Erlang运行的,首先选择RabbitMQ版本,确定需要的Erlang版本,然后安装Erlang,自行百度、谷歌、RabbitMQ官网或者Erlang官网都会有相应的资源、教程(ps: Erlang 版本请严格按照所选RabbitMQ版本要求的Erlang范围安装,否则会有各种不治之症)
本文以 Erlang20.03,RabbitMQ 3.7为例,RabbitMQ为linux 通用包,不同安装方式版本配置文件路径有差异,通用包好处,可移植性、控制性好
包目录结构:

推荐阅读
- 一张图带你理解和实现RabbitMQ的延迟队列功能
- 摩羯座|摩羯座 2022年 职场运势分析
- 使用酸奶抹脸有什么好处
- 杯子沾满茶垢 长期使用不利健康
- 北京市交通委:不要使用任何品牌的共享电动车
- 巴萨开售定制款口罩,18欧元一只可重复使用40次
- 正山小种多少钱斤看着价格表分析
- iPhone系统省电设置
- 电脑怎么截图 截屏快捷键
- 红茶的功效与作用红茶的营养分析