关于消息堆积问题的处理

1.消息来到队列产生堆积,我们可以通过惰性队列来处理。他是直接写入磁盘,存储上限高,性能也还行,但是肯定没有在内存中快。
2.还有就是提高消费的速度。 在单个消费者中通过线程池来提速,也可以添加多个消费者来提速。如果有顺序的问题,我们就通过hash定向分发来处理。

我们通过MQ来处理消息,怎么保证可靠。

消息从产生到消费,当我们用MQ来处理时,中间其实是有很多段过程的。
首先消息从生产者来到交换机交换机来到队列队列来到消费者消费者再消费,每一步我们都要保证消息的不丢失。
来到交换机,我们可以通过异步回调,开启ConfirmCallback 来检查。如果成功就返回ack,如果失败就返回nack。
交换机到队列的时候,通过ReturnCallback来检查。
然后由队列到消费者的时候,由消费者来确认,默认是阅后即焚。我们可以配置三种确认模式。但一般我们都是采用自动模式。正常消费返回ack都还好,如果出现异常或者消费失败,我们就可以通过本地重试来处理。不让消息一直重回队列,循环消费抛异常,而是有一个最大重试次数。 超过次数后默认是会被丢弃的,如果我们的消息比较重要,或者说是一些敏感数据,那么我们可以通过RepublishMessageRecoverer投递消息到指定的交换机和队列中,最后人工处理。

说到投递到指定交换机,在MQ里面有死信交换机来专门接收一些处理失败的数据
比如:

  • 消费者使用basic.reject或 basic.nack声明消费失败,并且消息的requeue参数设置为false
  • 消息是一个过期消息,超时无人消费
  • 要投递的队列消息满了,无法投递

但是有一些消息本来就是需要延迟处理,比如下单后30分钟未支付,取消订单,回滚库存。 发布定时会议等待。
这个时候我们就通过TTL死信交换机结合来处理。