记一次线上问题,拿到的不是最新数据 → 偶尔的热情真的难顶呀!
开心一刻
昨晚和媳妇坐在沙发上刷视频 我用手肘轻轻推了推媳妇:你看这渣男,玩完女的都不娶人家 媳妇:哎哟我天,哎呀妈,我这也没好哪去呀 我疑惑的看向媳妇:啥意思啊 媳妇看向自己的手机:啥意思啊,特么有些人,娶完了也不玩呀
背景介绍
我负责的系统需要同步上游系统的数据 同步机制分两步 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、圈子不同,不要强融 好好的消息发送,为什么非要写到事务中? 事务尽量缩小