likes
comments
collection
share

记一次线上问题,拿到的不是最新数据 → 偶尔的热情真的难顶呀!

作者站长头像
站长
· 阅读数 10

开心一刻

昨晚和媳妇坐在沙发上刷视频 我用手肘轻轻推了推媳妇:你看这渣男,玩完女的都不娶人家 媳妇:哎哟我天,哎呀妈,我这也没好哪去呀 我疑惑的看向媳妇:啥意思啊 媳妇看向自己的手机:啥意思啊,特么有些人,娶完了也不玩呀

记一次线上问题,拿到的不是最新数据 → 偶尔的热情真的难顶呀!

背景介绍

我负责的系统需要同步上游系统的数据 同步机制分两步 1、上游系统数据变动了,会下发消息,通知下游系统:我这边数据更新了,你们爱咋办咋办啊

记一次线上问题,拿到的不是最新数据 → 偶尔的热情真的难顶呀!

2、下游系统收到消息后,会调上游系统提供的数据查询接口:请给我最新的数据

记一次线上问题,拿到的不是最新数据 → 偶尔的热情真的难顶呀!

你情我愿,没有强买强卖,简直就是天作之合!

问题复现

我先模拟下两个系统,免得你们说我:光说不练假把式

环境准备

消息组件:RabbitMQ 3.9.11 数据库:MySQL 8.0.30 上游系统:spring-boot-front,源码地址:spring-boot-front 下游系统:spring-boot-after,源码地址:spring-boot-after 假设目前一致状态是:

记一次线上问题,拿到的不是最新数据 → 偶尔的热情真的难顶呀!

front端将张三密码调整成zhangsan1

记一次线上问题,拿到的不是最新数据 → 偶尔的热情真的难顶呀!

我们来看下效果

记一次线上问题,拿到的不是最新数据 → 偶尔的热情真的难顶呀!

after很快就成功同步了张三的密码zhangsan1 一切有条不紊的进行着,平静的就像你的女神回复你的消息一样,简直是轮回!

突然的热情

当你以为一切尘埃落定,开始放下过往,准备面向未来的时候 你的女神发来了一个消息 此刻的你无比纠结,是继续舔还是果断断? 我们来模拟下她突然的消息 调整下front的代码

记一次线上问题,拿到的不是最新数据 → 偶尔的热情真的难顶呀!

在发消息之后睡眠100毫秒 将李四的密码调整成lisi111

记一次线上问题,拿到的不是最新数据 → 偶尔的热情真的难顶呀!

李四的密码竟然没同步成功! 打开女神的消息一看,特喵的竟然不是关心,是借钱!

记一次线上问题,拿到的不是最新数据 → 偶尔的热情真的难顶呀!

问题修复

已经有女神折磨你们了,我就不折磨你们了 front的这段代码

记一次线上问题,拿到的不是最新数据 → 偶尔的热情真的难顶呀!

是有问题的!

记一次线上问题,拿到的不是最新数据 → 偶尔的热情真的难顶呀!

我给你们分析下 front事务未提交,消息就发给下游了 after收到消息后,查询front接口的时候, front的事务若还未提交, front又当如何应对? 还能怎么应对,只能给旧数据了呗,是不是懂了?

记一次线上问题,拿到的不是最新数据 → 偶尔的热情真的难顶呀!

既然找到原因了,就很好处理了 把所有她的联系方式都删了,问题就完美解决了 我好像偏题了,回到主题,问题同样很好处理 把消息发送从事务中拎出来就好了,也就是等事务提交后,再发消息 或者直接把要同步的数据以消息的方式直接同步给下游系统,下游系统拿到消息直接更新数据,而不用再调用上游系统的接口来查询数据(但要考虑消息体的大小) 通篇看下来是不是很精彩,此处应该有掌声

记一次线上问题,拿到的不是最新数据 → 偶尔的热情真的难顶呀!

总结

1、日志很重要,很重要,很重要!     楼主这次排查这个问题还是很快的,因为日志打印的比较全,根据日志很快就能定位到接口查到的是旧数据     这就好比借钱:一定保留转账记录,现金的话要打借条 2、圈子不同,不要强融     好好的消息发送,为什么非要写到事务中?     事务尽量缩小