作者:手机用户2502924641 | 来源:互联网 | 2023-09-10 16:10
一. 消息堆积
消息堆积一般来说就是消息发送的速率大于消息消费的速率造成的。
解决方案:
- 增加消费者以及后端其他服务组件的吞吐能力。
- 增加消费者的多线程处理
- 根据不同的业务实现不同的丢弃任务,选择不同的策略淘汰任务,例如FIFO/LRU等。
- 默认情况下,rabbitmq消费者为单线程串行消费,设置并发消费两个关键属性concurrentConsumers和prefetchCountoncurrentConsumers设置的是对每个listener在初始化的时候设置的并发消费者的个数,prefetchCount是每次一次性从broker里面取的待消费的消息的个数。
二. 消息丢失
- 持久化
- ACK手动确认
消息在生产者、消费队列、消费者中都有可能发生丢失。
- 在生产者中丢失
原因:生产者发送消息成功,但MQ没收到该消息,消息在从生产者传输到MQ的过程中丢失,一般由网络不稳定造成。
解决方案:发送方采用消息确认机制,当消息成功被MQ接收到后,会给生产者发送一个确认消息,表示接收成功。
-
在MQ中丢失
原因:消息发送到MQ后,消息还没被消费却在MQ中丢失了。比如MQ服务器宕机或者未进行持久化进行了重启。
解决方案:持久化交换机、队列、消息。确保MQ服务器重启时仍然能从磁盘恢复对应的交换机,队列和消息。然后我们把MQ做多台分布式集群,防止出现所有的MQ服务器挂掉。注意:交换机、队列、消息都要持久化。
- 在消费者中丢失
原因:默认消费者消费消息时,设置的是自动回复MQ,收到了消息。MQ会立刻删除自身保存的这条消息,如果消息已经在MQ中被删除,但消费者的业务处理出现异常或消费者服务宕机,那么就会导致该消息没有处理成功从而导致消息丢失。
解决方案:设置手动ACK。