一、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模式,不用特殊配置,