关于mq:中间件MQ如何保证消息的可靠性

分布式事务的一种计划:音讯可靠性 + 最终一致性, 那么

如何保障音讯的可靠性?

1. 音讯失落(最重要)

音讯失落:如何保障音讯不失落?

1.1. 网络起因发不出-> 记录日志+定时工作解决

比方网络起因公布进来:怎么弄? catch异样从新while(true)发几次?NoNoNo! 如果是网络起因, 很可能发不进来,

正确做法:

  1. 数据库建一个mq_message的表, 每发一条mq音讯都记录到库;
  2. 定时工作扫, 状态是 “未发送胜利” 的记录, 从新发送;

1.2 Broker长久化失败->生产者发送确认+失败重发

咱们的音讯都要设置长久化保留, 咱们胜利将音讯发送到mq的Broker,然而broker须要将音讯长久化, 而后能力进入到queue里, 这个两头mq挂了, 怎么保障音讯不失落?

Producer–>(Broker(Exchange)–>(Queue))–>Consumer

咱们应用生产者发送者的确认机制: 只有发送到broker, broker长久化实现音讯到达送给队列当前, broker才会给发送者确认;这样就能保障发送胜利

1.3 Consumer生产失落->敞开主动确认, 应用手动ACK

MQ生产时宕机或生产失败?敞开生产时主动确认, 应用 手动manual ACK, 生产完确认!

2. 音讯反复

2.1 音讯反复的2种情景:

比方消费者生产音讯, 收到了两遍

  1. consumer生产失败, 手动basicReject回绝了, 这种是容许的;
  2. consumer生产实现,手动ACK之前忽然宕机, 此时没给broker确认音讯生产实现;这样, 就有可能会再发给其余的消费者,造成音讯反复;

    生产胜利,ack宕机,音讯由 unack变为ready, 而后broker会从新发送

主旨: 设计生产时, 做到 幂等生产

2.2 幂等生产

2.2.1 生产做状态判断

业务设置状态, 生产时做状态判断, 解决过就疏忽

2.2.2 防重表:惟一标识

防重表:发送的每一个音讯都有惟一标识, 解决过就疏忽

3. 音讯积压

音讯积压会带来MQ性能的降落, 所以肯定要解决音讯积压的问题

3.1 音讯积压的3种起因

3.1.1 消费者宕机

3.1.2 消费者自身生产能力有余

3.1.3 发送者流量太大

3.2 解决音讯积压的计划

3.2.1 限度业务流量+限度发送流量(上策)

3.2.2 上线更多的消费者, 加大生产规模

3.2.2.3 若生产逻辑简单,能够设置:先纯生产-记录数据库-离线解决

能够解决mq压力, 转移mq压力

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理