概述
- MQ全称Message Queue,是在消息的传输过程中保存消息的容器,多用于分布式系统之间进行通信
优势:
1.应用解耦:
系统的耦合性越高,容错性就越低,可维护性就越低
使用MQ使得应用间解耦,提升容错性和可维护性
2.异步提速:提升用户体验和系统吞吐量
**3.削峰填谷:**提高系统稳定性
劣势:
1.系统的可用性降低:系统引入的外部依赖越多,系统的稳定性越差
2.系统复杂度提高
3.一致性问题
-
基本概念
- Broker:接受和分发消息的应用
- Virtual host:出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中
- Connection:publisher/consumer/和broker之间的TCP连接
- Channel:是在connection内部建立的逻辑连接,极大地减少了操作系统建立TCP connection的开销
- Exchange:message到达broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到queue中去
- Queue:消息最终被送到这里等待consumer取走
- Binding:exchange和queue之间的虚拟连接
-
六种工作模式
- 简单模式
- work queues
- 发布与订阅模式
- 路由模式
- 主题模式
- 远程调用模式
-
JMS
- 即java消息服务应用程序接口,是一个java平台中关于面向消息中间件的API
整合RabbitMQ
- spring
- 生产者
- 创建生产者工程
- 添加依赖
- 配置整合
- 编写代码发送消息
- 消费者
- 创建生产者工程
- 添加依赖
- 配置整合
- 编写消息监听器
- 生产者
- springboot
- 生产端
- 创建生产者springboot工程
- 引入start,依赖坐标
- 编写yml配置,基本信息配置
- 定义交换机,队列以及绑定关系的配置类
- 注入RabbitTemplate,调用方法,完成消息发送
- 消费端
- 创建消费者springboot工程
- 引入start,依赖坐标
- 编写yml配置,基本信息配置
- 定义监听类,使用@RabbitListener注解完成队列监听
- 生产端
高级特性
消息的可靠投递
-
在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ提供了两种方式用来控制消息的投递可靠性模式
- confirm 确认模式
- return 退回模式
-
消息投递路径
- producer—>rabbitmq broker—>exchange—>queue—>consumer
- 消息从 producer 到 exchange 则会返回一个 confirmCallback
- 消息从 exchange–>queue 投递失败则会返回一个 returnCallback 。 我们将利用这两个 callback 控制消息的可靠性投递
- producer—>rabbitmq broker—>exchange—>queue—>consumer
Consumer Ack
- ack指Acknowledge,确认。 表示消费端收到消息后的确认方式
- 自动确认:acknowledge=“none”:当消息一旦被Consumer接收到,则自动确认收到,并将相应 message 从 RabbitMQ 的 消息缓存中移除
- 手动确认:acknowledge=“manual”:要在业务处理成功后,调用channel.basicAck(),手动签收
- 根据异常情况确认:acknowledge=“auto”
消费端限流
- 在中配置prefetch属性设置消费端一次拉取多少消息
- 消费端的确认模式一定为手动确认,acknowledge="manual”
TTL
- Time To Live:存活时间
- 当消息到达存活时间后,还没有被消费,会被自动清除
- RabbitMQ可以对消息设置过期时间,也可以对整个队列设置过期时间:x-message-ttl
- 设置消息过期时间使用参数:expiration
死信队列
- Dead Letter Exchange(死信交换机),当消息成为Dead message后,可以 被重新发送到另一个交换机,这个交换机就是DLX
- 消息成为死信的三种情况:
- 队列消息长度到达限制
- 消费者拒接消费消息,basicNack/basicReject,并且不把消息重新放入原目标队列,requeue=false
- 原队列存在消息过期设置,消息到达超时时间未被消费
延迟队列
- 延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费
- 在RabbitMQ中并未提供延迟队列功能,但是可以使用:TTL+死信队列组合实现延迟队列的效果
日志与监控
- RabbitMQ默认日志存放路径: /var/log/rabbitmq/rabbit@xxx.log
- 日志包含了RabbitMQ的版本号、Erlang的版本号、RabbitMQ服务节点名称、cookie的hash值、 RabbitMQ配置文件地址、内存限制、磁盘限制、默认账户guest的创建以及权限配置等等
- rabbitmqctl管理和监控
消息追踪
- Firehose
- 将生产者投递给rabbitmq的消息,rabbitmq投递给消费者的消息按照指定的格式 发送到默认的exchange上
- 这个默认的exchange的名称为amq.rabbitmq.trace,它是一个topic类 型的exchange
- 发送到这个exchange上的消息的routing key为 publish.exchangename 和 deliver.queuename
- exchangename和queuename为实际exchange和queue的名称,分别 对应生产者投递到exchange的消息,和消费者从queue上获取的消息
- 打开 trace 会影响消息写入功能,适当打开后请关闭
- rabbitmqctl trace_on:开启Firehose命令
- rabbitmqctl trace_off:关闭Firehose命令
- rabbitmq_tracing
- rabbitmq_tracing和Firehose在实现上如出一辙,只不过rabbitmq_tracing的方式比Firehose多了一 层GUI的包装,更容易使用和管理
- 启用插件:rabbitmq-plugins enable rabbitmq_tracing