RabbitMQ消息队列(八):消息堆积、消息丢失、 有序消费消息、重复消费

RabbitMQ消息队列(八):消息堆积、消息丢失、 有序消费消息、重复消费

1.消息堆积

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

消息堆积的影响

  • 可能导致新消息无法进入队列

  • 可能导致旧消息无法丢失

  • 消息等待消费的时间过长,超出了业务容忍范围。

产生堆积的情况

  • 生产者突然大量发布消息

  • 消费者消费失败

  • 消费者出现性能瓶颈。

  • 消费者挂掉

解决办法

  • 排查消费者的消费性能瓶颈

  • 增加消费者的多线程处理

  • 部署增加多个消费者

2. 消息丢失

在实际的生产环境中有可能出现一条消息因为一些原因丢失,导致消息没有消费成功,从而造成数据不一致等问题,造成严重的影响。

2.1 消息在生产者丢失

场景:消息生产者发送消息成功,但是 MQ 没有收到该消息,消息在从生产者传输到MQ 的过程中丢失,一般是由于网络不稳定的原因。

解决方案:采用 RabbitMQ 发送方消息确认机制,当消息成功被 MQ 接收到时,会给生产者发送一个确认消息,表示接收成功。RabbitMQ 发送方消息确认模式有以下三种:普通确认模式,批量确认模式,异步监听确认模式。

2.2 消息在 RabbitMQ 丢失

场景:消息成功发送到 MQ,消息还没被消费却在 MQ 中丢失,比如 MQ 服务器宕机或者重启会出现这种情况

解决方案:持久化交换机,队列,消息,确保 MQ 服务器重启时依然能从磁盘恢复对应的交换机,队列和消息。

2.3 消息在消费者丢失

场景:消息费者消费消息时,如果设置为自动回复 MQ,消息者端收到消息后会自动回复 MQ 服务器,MQ 则会删除该条消息,如果消息已经在 MQ 被删除但是消费者的业务处理出现异常或者消费者服务宕机,那么就会导致该消息没有处理成功从而导致该条消息丢失。

解决方案:设置为手动回复 MQ 服务器,当消费者出现异常或者服务宕机时,MQ 服务器不会删除该消息,而是会把消息重发给绑定该队列的消费者,如果该队列只绑定了一个消费者,那么该消息会一直保存在 MQ 服务器,直到消息者能正常消费为止。

3. 有序消费消息

场景1:当 RabbitMQ 采用 work Queue 模式,此时只会有一个 Queue 但是会有多个Consumer,同时多个 Consumer 直接是竞争关系,此时就会出现 MQ 消息乱序的问题。

解决方案:生产者根据交易traceId算出hash值,之后再对队列个数取余,相同id操作压到同一个队列,并且每一个队列保证只有一个消费者,依此来保证有序。

场景2:当 RabbitMQ 采用简单队列模式的时候,如果消费者采用多线程的方式来加速消息的处理,此时也会出现消息乱序的问题。

解决方案:消费者根据交易traceId算出hash值,同id在同一个队列,并且让同一个线程处理。

4. 重复消费

场景:为了防止消息在消费者端丢失,会采用手动回复 MQ 的方式来解决,同时也引出了一个问题,消费者处理消息成功,手动回复 MQ 时由于网络不稳定,连接断开,导致 MQ 没有收到消费者回复的消息,那么该条消息还会保存在 MQ 的消息队列,由于 MQ 的消息重发机制,会重新把该条消息发给和该队列绑定的消息者处理,这样就会导致消息重复消费

解决方案:在消费者端每次消费成功后将该条消息 id 保存到数据库,每次消费前查询该消息 id,如果该条消息 id 已经存在那么表示已经消费过就不再消费否则就消费。也可以使用redis等缓存消息id实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值