记一次线上问题 → 偶尔的热情真的难顶呀!
2024/1/8 14:02:50
本文主要是介绍记一次线上问题 → 偶尔的热情真的难顶呀!,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
开心一刻
昨晚和媳妇坐在沙发上刷视频
我用手肘轻轻推了推媳妇:你看这渣男,玩完女的都不娶人家
媳妇:哎哟我天,哎呀妈,我这也没好哪去呀
我疑惑的看向媳妇:啥意思啊
媳妇看向自己的手机:啥意思啊,特么有些人,娶完了也不玩呀
背景介绍
我负责的系统需要同步上游系统的数据
同步机制分两步
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、圈子不同,不要强融
好好的消息发送,为什么非要写到事务中?
事务尽量缩小
这篇关于记一次线上问题 → 偶尔的热情真的难顶呀!的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-07转型传统行业避坑指南!
- 2025-01-07百万架构师第九课:源码分析:Spring 源码分析:Spring5源码分析-预习资料|JavaGuide
- 2025-01-07为你的程序精选的4个优质支付API
- 2025-01-06责任分配矩阵在项目管理中的作用:结合工具提升团队生产力
- 2025-01-06板栗看板:优化项目管理的实用策略,助你轻松完成任务
- 2025-01-06电商小白怎么选取合适的工具?一站式工具指南来啦
- 2025-01-06企业如何避免春节期间的项目断层?四大方法教给你!
- 2025-01-06初创团队如何在动态环境下利用看板工具快速迭代
- 2025-01-06企业内部管理如何实现高效?四大策略教会你
- 2025-01-06给 Postgres 写一个向量插件 - 向量类型