1.幂等性 MQ消息重复消费问题: 消费者在消费 MQ 中的消息时,MQ 已把消息发送给消费者,消费者在给 MQ 返回 ack 时网络中断,故 MQ 未收到确认信息,该条消息会重新发给其他的消费者,或者在网络重连后再次发送给该消费者,但实际上该消费者已成功消费了该条消息,造成消费者消费了重复的消息 解决思路:生成一个全局唯一 id,每次消费消息时用该 id 先判断该消息是否已消费过利用查询语句进行判断这个id是否存在数据库中,劣势就是在高并发时如果是单个数据库就会有写入性能瓶颈(不推荐) 业界主流的幂等性有两种 *** 作:a. 唯一ID利用数据库主键去重(不推荐), b.利用redis的原子性去实现 Redis原子性实现幂等:利用 redis 的 setnx 命令,天然具有幂等性,从而实现不重复消费 2.优先级队列 消费者需要等待消息已经发送到队列中才去消费,因为这样才有机会对消息进行排序 (1)队列设置最大优先级 Mapparams = 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 args = new HashMap (); args.put("x-queue-mode", "lazy"); channel.queueDeclare("myqueue", false, false, false, args);
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)