RabbitMQ常见疑难问题

一.消息队列消息堆积如何处理?redis

当消息产生的速度长时间远远大于消费的速度的时候,就会产生消息的堆积。缓存

消息堆积的影响:
  • 1.新消息可能没法进入MQ。
  • 2.旧消息没法丢失。
  • 3.等待消费的时间过长,超出业务的容忍范围。
产生堆积可能的因素:
  • 1.生产者大量发布消息
  • 2.消费者消费失败,没有ack自动应答。
  • 3.消费者可能出现性能瓶颈。
  • 4.消费服务挂掉。
解决思路:
  • 1.排查消费者运行效率、性能问题。
  • 2.消费者多线程处理。
  • 3.增长更多的消费者。
处理过程:

新生产的消息转移到新的队列,增长新的服务器部署新的消费者来消费。
原来的消息队列的消息能够继续慢慢消费。服务器

2、消息丢失怎么办?网络

消息流通过程 —>生产者—>队列—>消费者多线程

1.生产者环节丢失消息

场景:生产者在投递消息过程当中,突遇断网可能丢失消息。ide

解决方案:生产者在消息投递环节开启消息确认机制(事物或者comfirm),发送失败时候重试。性能

2.队列中丢失消息

场景:队列服务宕机、重启,消息丢失。线程

解决方案:投递消息的时候,交换机、队列、消息都设置为持久化durable=true队列

3.消费者中丢失消息

场景:消费者启用了自动应答,消费者服务挂掉。内存

解决方案:通道设置每次只处理一条消息,关闭消费者自动应答,消费完成手动应答。

3、有序消费

情形1:多条不幂等消息如消息一、消息二、消息3,采用worker模式投递,因为worker模式的消费者是竞争者关系,拿到的消息顺序是有问题的。

解决方案:将消息一、消息二、消息3分别投递进不一样队列,每一个队列对应一个消费者

情形2:消费者开启了多线程

解决方案:消息队列分配消息后,建立多个内存队列,每一个线程消费者去消费内存队列里面的消息

4、消息重复消费

出现缘由:消费者消息消息的时候,MQ没有收到消息的ack应答。

场景:
  • 1.消费者消费消息后没有ack。
  • 2.消费者在消费消息后,ack时网络异常。
解决步骤:
  1. 消费者消费后,记录经过缓存记录消息的消费标识,消息id如redis的setnx
  2. 若是消费成功且ack成功,则删除记录的消息标记。
  3. 若是ack失败,消息下次被消费消息时候,先去查询消息的消费标识,已经消费则直接ack,未消费则继续消费。
概念:

消息幂等性:消息不管怎么执行都是一样结果。非幂等性案例:扣款、扣库存、添加数据。

相关文章
相关标签/搜索