写点什么

mq 消费幂等总结

用户头像
A
关注
发布于: 2021 年 01 月 22 日

针对 mq 新增场景:

1)首先查本地 db 书否已存在,存在则幂等

2)加 redis 乐观锁,加锁失败重试 mq,

3)理论上上边 2 步可以解决大部分数据重复新增的问题,但是针对并发情况下,乐观锁超时释放的情况,数据库需要加唯一索引(outId, outType)进行兜底


针对 mq 更新场景:

1、单个更新:与新增类似

2、批量更新:

1)每次处理单条主数据,每条失败都会重试全部

2)加 redis 乐观锁,加锁失败重试 mq,

3)针对新增的数据进行 db 幂等校验,幂等则结束此条数据处理(for 循环 continue)

4)针对更新的数据,通过加数据库 version 条件进行 db 更新

5)针对删除的数据进行处理,如果没有要删除的,则结束此条数据处理(for 循环 continue);

如果有要删除的,则需要进行 db 操作,一般的做法是变更 db 的状态为删除状态;


针对 mq 删除场景:

1、单个删除:与新增类似

2、批量更新:

1)首先查本地 db 是否仍存在,不存在则幂等

2)1、不加锁的情况:i.每次更新时因为带了 version 条件,所以并发情况下可能更新失效,因为已经 db 数据被删除,耗费一次 db 操作;

ii.失败的情况下,全量回滚 db 操作;

2、加锁的情况:1)锁批量消息范围太广,导致锁失效

2)锁单个消息:

i.先校验 db 的数据状态是否为已删除,删除则跳过;

ii.并发情况下,因为某个处理失败,可能出现 mq 重试的情况


发布于: 2021 年 01 月 22 日阅读数: 40
用户头像

A

关注

还未添加个人签名 2018.03.21 加入

还未添加个人简介

评论

发布
暂无评论
mq消费幂等总结