前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >记一次线上问题 → 偶尔的热情真的难顶呀!

记一次线上问题 → 偶尔的热情真的难顶呀!

作者头像
青石路
发布2024-01-09 14:00:24
960
发布2024-01-09 14:00:24
举报
文章被收录于专栏:开发技术开发技术

背景介绍

  我负责的系统需要同步上游系统的数据

  同步机制分两步

  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、圈子不同,不要强融

    好好的消息发送,为什么非要写到事务中?

    事务尽量缩小

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景介绍
  • 问题复现
    •   环境准备
      •   突然的热情
      • 问题修复
      • 总结
      相关产品与服务
      云数据库 MySQL
      腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档