方案图111111

消息可靠性投递11111

保障100%消息投递成功方案: sender 发送消息后,等待 broker 返回确认,超时未收到返回时通知 (用定时任务扫描状态未成功,且超过时间跨度的消息),则通知 sender 再次发送。
(这步解决了消息发送时丢失的问题,但是产生了重复发送的问题:消息确实发送成功了,但是丢失了返回确认通知,要解决这个问题需要在消费端服务进行幂等)
设计方案
1
1
消息100%投递成功方案
可靠性投递方案,保证消息投送,需要消费端做幂等
先将业务数据、消息日志入库
发送消息到MQ Broker
Broker返回确认消息给监听
消费者拿到结果,修改消息日志状态,1已消费
定时任务拉取消息
如果状态一直是0待投递,则重投
如果重投3次,则日志状态改为2,投递失败
保障消息100%投递成功设计方案
保障消息可靠投递
消息投靠方案设计
消息投递成功设计方案:
保障100%消息投递成功设计方案
1:消息记录表。2,发送消息。3.MQ回应生产者。4.生产者把消息记录表状态修改。5.分布式定时任务监听消息状态,得到状态是0的就重发,1的就知道是成功了,大于3的就设置为2,那么就知道是失败了,然后可以做一些确定失败了的逻辑。
【消息可靠性投递主要出现在生产者一端,去重发,而重复发送的消息,主要靠消费者那边做幂等来解决。】
关于实际工作中如何使用ack,还是要去看一下
消息可靠性投递方案
可靠性投递
Message send 100% successful graph
保证100%消息投递成功设计方案
消息投递方案
消息记录表中消息的状态:0消息发送中,1发送成功,2发送失败
把业务数据、消息记录分别插入相应的数据表
发送消息
监听消息确认(收到确认,消息状态从0改为1)
定时任务:定时获取消息状态为0的消息,重新发送
重新发送三次后如果还是发送不了,状态改为2,人工发送
保障消息100%投递成功
BIZ DB 业务的数据
MSG DB 发送消息的日志
第一步 发送消息之前,先落地业务数据库和消息数据库
第二步 发送消息 发送给mq broker(mq服务上)
第三步 mq broker收到消息会给 生产端一个应答
如果没有 收到消息 我们采用定时任务
定时拉取状态等于0的消息。
定时任务重发
保证100%消息投递成功设计方案
1、分7步骤
2、如果没收到confirm,则尝试再次发送,定时任务定时扫描,做最大尝试次数,如果还是没confirm,则置为失败;
3、有个问题,如果我投递成功了,尝试几次,但是一直没收到confirm,但是broker确实是存在的,这怎么办?数据不一致了
保障100%消息投递成功设计方案步骤:
Step 1: 首先把消息信息(业务数据)存储到数据库中,紧接着,我们再把这个消息记录也存储到一张消息记录表里(或者另外一个同源数据库的消息记录表)。
Step 2:发送异步消息到MQ Broker节点(采用confirm方式发送,会有异步的返回结果)。
Step 3、4:生产者端接受MQ Broker节点返回的Confirm确认消息结果,然后进行更新消息记录表里的消息状态。比如默认Status = 0 当收到消息确认成功后,更新为1即可!
Step 5:但是在消息确认这个过程中可能由于网络闪断、MQ Broker端异常等原因导致回送消息失败或者异常(即step2发送消息成功了,但step3失败)。这个时候就需要发送方(生产者)对消息进行可靠性投递了,保障消息不丢失,保障100%的投递成功!(有一种极限情况是闪断,Broker返回的成功确认消息,但是生产端由于网络闪断没收到,这个时候重新投递可能会造成消息重复,需要消费端去做幂等处理)所以我们需要有一个定时任务,(比如每5分钟拉取一下处于中间状态的消息,当然这个消息可以设置一个超时时间,比如超过1分钟 Status = 0 ,也就说明了1分钟这个时间窗口内,我们的消息没有被确认,那么会被定时任务拉取出来)。
Step 6:接下来我们把中间状态的消息进行重新投递 retry send,继续发送消息到MQ ,当然也可能有多种原因导致发送失败。
Step 7:我们可以采用设置最大努力尝试次数,比如投递了3次,还是失败,那么我们可以将最终状态设置为Status = 2 ,最后 交由人工解决处理此类问题(或者把消息转储到失败表中)。
注意:此方案只保证100%投递成功,不保证是否出现多投的情况,需要消费者做幂等。
可靠性投递方案
100%消息投递成功设计
注意:只考虑发送方100%投递,当多次投递成功需要接收方做“幂等”处理。