消息队列-保证消息的可靠性

1.消息丢失

1.1.1 场景

消息发送出去,由于网络问题没有抵达服务器。

1.1.2 解决
  • 做好容错方法 (try-catch),发送消息可能会网络失败,失败后要有重试机制,可记录到数据库,采用定期扫描重发的方式。

  • 做好日志记录,每个消息状态是否都被服务器收到都应该记录

  • 做好定期重发,如果消息没有发送成功,定期去数据库扫描未成功的消息进行重发

1.2.1 场景:

消息抵达 Broker,Broker 要将消息写入磁盘 (持久化) 才算成功。此时Broker尚未持久化完成,宕机。

1.2.2 解决:

publisher也必须加入确认回调机制,确认成功的消息,修改数据库消息状态。

1.3.1 场景:

自动ACK的状态下。消费者收到消息,但没来得及消息然后宕机。

1.3.2 解决:

一定开启手动ACK,消费成功才移除,失败或者没来得及处理就noAck并重新入队

2.消息重复

2.1.1 场景:

消息消费成功,事务已经提交,ack时,机器宕机。导致没有ack成功,Broker 的消息重新由 unack 变为 ready,并发送给其他消费者。

消息消费失败,由于重试机制,自动又将消息发送出去。

成功消费,ack时宕机,消息由unack变为ready,Broker又重新发送

解决:
  • 消费者的业务消费接口应该设计为幂等性的。比如扣库存有工作单的状态标志
  • 使用防重表 (redis/mysql),发送消息每一个都有业务的唯一标识,处理过就不用处理
  • RabbitMQ 的每一个消息都有 redelivered 字段,可以获取是否是被重新投递过来的,而不是第一次投递过来的

3.消息积压

3.1.1 场景:

消费者宕机积压

消费者消费能力不足积压

发送者发送流量太大

3.1.2 解决:
  • 上线更多的消费者,进行正常消费
  • 上线专门的队列消费服务,将消息先批量取出来,记录数据库,离线慢慢处理
  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
消息队列是一种常用的异步通信机制,它可以在不同的应用程序之间传递消息。为了保证消息队列可靠性,通常会采取以下几个方面的措施: 1. 持久化存储:消息队列通常会将消息持久化存储,以防止在系统故障或重启时消息丢失。消息可以存储在磁盘或者其他持久化存储介质中,确保即使系统异常关闭,消息也能够被恢复。 2. 确认机制:消息队列提供了消息确认机制,发送方在发送消息后会等待接收方的确认,只有在接收方确认接收到消息后,发送方才会将消息标记为已发送。如果接收方没有及时确认,发送方可以重发该消息以确保可靠性。 3. 重试机制:当消息发送失败或者接收方无法处理时,消息队列通常会提供重试机制。发送方可以根据一定策略进行重试,直到消息被成功处理或者达到最大重试次数。 4. 错误处理:消息队列通常会提供错误处理机制,当消息处理失败时,可以将错误信息记录下来并进行相应的处理。这样可以及时发现和解决问题,确保系统的可靠性。 5. 监控和报警:为了保证消息队列可靠性,通常需要进行监控和报警。通过监控系统的指标和日志,可以及时发现异常情况并采取相应的措施,确保系统的稳定运行。 综上所述,通过持久化存储、确认机制、重试机制、错误处理以及监控和报警等措施,消息队列可以实现较高的可靠性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酱学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值