RabbitMQ 幂等性、消息优先级、惰性队列

本文探讨了消息队列中如何处理MQ消息重复消费的问题,提出通过全局唯一ID结合数据库或Redis实现幂等性。同时介绍了设置消息优先级的方法,确保消息按顺序消费。此外,还讲解了惰性队列的概念,这种队列在消费者消费消息时才加载到内存,以支持大量消息存储。
摘要由CSDN通过智能技术生成
1.幂等性
MQ消息重复消费问题:
消费者在消费 MQ 中的消息时,MQ 已把消息发送给消费者,消费者在给 MQ 返回 ack 时网络中断,故 MQ 未收到确认信息,该条消息会重新发给其他的消费者,或者在网络重连后再次发送给该消费者,但实际上该消费者已成功消费了该条消息,造成消费者消费了重复的消息
解决思路:生成一个全局唯一 id,每次消费消息时用该 id 先判断该消息是否已消费过利用查询语句进行判断这个id是否存在数据库中,劣势就是在高并发时如果是单个数据库就会有写入性能瓶颈(不推荐)

业界主流的幂等性有两种操作:a.
唯一ID利用数据库主键去重(不推荐), b.利用redis的原子性去实现

Redis原子性实现幂等:利用 redis 的 setnx 命令,天然具有幂等性,从而实现不重复消费

2.优先级队列
消费者需要等待消息已经发送到队列中才去消费,因为这样才有机会对消息进行排序
(1)队列设置最大优先级
Map<String, Object> params = new HashMap();
params.put("x-max-priority", 10);
channel.queueDeclare("hello", true, false, false, params);
(2)设置消息的优先级
AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().priority(5).build();

3.惰性队列
惰性队列会尽可能的将消息存入磁盘中,而在消费者消费到相应的消息时才会被加载到内存中它的一个重要的设计目标是能够支持更长的队列,即支持更多的消息存储
队列具备两种模式:default 和 lazy,默认的为 default 模式,lazy为惰性队列模式
(1)声明惰性队列
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-queue-mode", "lazy");
channel.queueDeclare("myqueue", false, false, false, args);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值