关于切流的数据一致性问题(核心数据需要保证强一致性)

关于切流的数据一致性问题(核心数据需要保证强一致性)

问题描述:

一般数据为了保证可用性,采用异步双写,但如果涉及核心数据(如资金、订单、库存)的迁移与同步、切流,课程中的异步双写是不是不太合适

尝试过的解决方式:

  1. 同步双写(100% 写老库 + 100% 写新库),更新操作,更新新库失败。异常是新库中数据不存在(说明数据暂未同步),吞掉异常;如果是其他异常,处理方式是让业务失败(回滚老表数据),还是异步队列补偿它

  2. 开启全量同步,跟课程方法一致

  3. 校验数据。同步双写可能存在时间差,出现数据不一致的情况,先存入集合中后续进行二次校验

  4. 全量同步完成后开始切读流量    

  5. 停止双写

  6. 该过程中只存在读流量分流,写流量一直是双库同时进行的

核心数据使用异步双写是否可行?我设计的这个方案是否可行?新表更新失败(数据不存在外的其他异常)该如何处理?请老师解答。

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
Danny_Idea 2026-05-15 22:57:53
这里的同步双写可以按场景分类 例如同库 不同库 不同类型db 如何根据事务保障,都可以思考下。

关于不存在数据更新这个,可以先放在mq堆积着 等全量同步完后按顺序消费即可。
Danny_Idea 2026-05-15 22:49:47
首先有个点需要确认下 什么场景适合用异步双写,异步双写真的可靠性那么差吗?

异步双写一般是结合mq去做的,通过保证mq的消息可靠性来保证数据持久化。一般来说mq丢消息的情况其实主要发生在消费端异常,很少是说broker端异常导致。基本上可靠性就是软件层可控的,所以这种方案也是可以做到核心数据的准确性同步。

如果硬要说异步双写有风险,除非是broker端出现异常,机器崩溃导致的了。如果你们的企业场景中这种概率极低,其实可以忽略。毕竟异步双写的实现难度较低,而且代码相对解耦。

  • 提问者 七訫 #1

    这个的最终一致性是可以保证,但是我担心的是时间问题。先写旧表再发mq,mq消费者消费mq同步,中间存在一段时间差。例如A账户资金是100元,单笔转账100元(旧表写,交易成功,mq消息发送),A账户立刻再次进行转账100元(新表写,由于网络抖动、消息堆积等原因,数据尚未同步,账户资金还是100元,交易成功)。这种场景需要强一致性,课程中的这种异步双写应该还需要一套复杂的机制去保障它吧。(我没有能力写出这样一套复杂的保障机制而且这样做成本消耗也比较大,所以主观地说完全不能使用)

    2026-05-17 09:48:47
  • Danny_Idea 回复 提问者 七訫 #2

    你这个属于是对数据一致性要求很高的场景了,不适合用异步做双写。只能走分布式事务保障了,当两边表都提交成功才返回,可以用tcc的模式去做。

    2026-05-20 13:16:56
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java+大数据+AI架构师实战营
  • 参与学习       106    人
  • 解答问题       128    个

专为1–5年开发者,打造极具竞争力的人才培养方案,快速突破技术/职业瓶颈 “三高”架构托底,海量数据吞吐,实时计算,AI驱动及智能化开发 大型 “社交+电商” 平台从0到1全程贯穿,高复杂架构落地

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师