RabbitMQ
面向修改关闭,面向拓展开放
优势:耦合度低,拓展性强;异步调用,性能好;故障隔离,下游服务不影响上有服务;缓存消息,流量削峰填谷
劣势:异步执行,时效性低;不确定下游是否执行成功。
SpringAMQP
配置
AMQP依赖
配置文件yml
入门案例
向队列发送消息
使用RabbitTemplate来发送消息
在类上添加@Component注解来标注,同时使用@RabbitListener注解在方法上来接收队列中的消息
Workqueue
解决消息堆积问题
交换机
Fanout:Fanout交换机会将消息广播到每一个跟其绑定的queue。
创建交换机并且与队列绑定
使用交换机转发消息
Direct将接收到的消息按照路由规则发送到指定的queue,因此成为定向路由
Topic交换机:与direct交换机类似,可以指定多个单词,并且以"."分割
消息转换器
配置JSON消息转换器
MQ高级
可靠性
生产者可靠性、MQ可靠性、消费者可靠性
发送者可靠性
生产者重连
生产者确认
生产者消息确认会提高可靠性,但是也会带来性能开销,影响MQ的性能,一般不开启。
MQ的可靠性
MQ消息是存储在内存中的,当MQ宕机,MQ中的消息将会丢失。
数据持久化
MQ存储在内存中的,当内存中存放满时,会持久化到磁盘中,持久到磁盘时会阻塞,其他所有的消息将会阻塞。
SpringAMQP默认发送持久化队列。
LazyQueue 惰性队列
消费者
消费者确认机制
如果消息被消费者成功处理,则给MQ返回ACK,从队列中删除消息
如果消息处理失败,MQ则需要重新投递消息。
消息处理失败机制
业务幂等性
幂等性:同一个业务执行一次和多次对业务影响是一致的。
延时消息
生产者发送消息 指定一个时间,消费者不会立刻收到消息,而是在指定时间之后收到消息。
死信交换机
发送定时消息,消息过期成为死信消息
延迟消息插件
取消超时订单
RabbitMQ如何保证消息不丢失
1、生产者确认机制,publisher confirm机制来避免消息发送到MQ过程丢失,消息成功发送到MQ会返回一个ACK确认,失败重发。
2、消息持久化,消息默认存储在内存中,宕机后消息丢失。交换机持久化、队列持久化和消息持久化(AMQP默认时持久化的)
3、消费者确认机制为auto,消费者成功处理消息没有异常会返回一个ACK确认。
4、消费者重试机制,如果失败会再次发送,如果超过次数都失败会添加到一个专门异常交换机
RabbitMQ消息重复消费
RabbitMQ死信队列(延迟队列=死信交换机+TTL 或者 延迟队列插件)
用处:超时取消、限时优惠、定时发布
死信:1、消费者声明消息消费失败;2、消息过期没有被消费;3、消息队列已满。
如果对了配置了死信交换机那么队列中的死信会投递到死信交换机
消息堆积怎么及解决
1、增加消费者,提高消费速度
2、在消费者使用线程池,加快消息消费速度
3、使用惰性队列,扩大队列容积
惰性队列