线上问题排查-定时任务状态未复位

news/2024/9/20 9:04:14/文章来源:https://www.cnblogs.com/Go-Solo/p/18404971

项目业务

用户授权登录后,负责把本 app 的运动同步到第三方,分别对接了 A、B、C、D 等第三方,各个平台的推送方式不太一样,有一些是主动查询,有一些是主动推送

场景

周五线上 Redis 报了内存不足,代码排查后发现用户数据占用了很大一部分,并且只存储不查询也不设置过期事件也没有内存淘汰策略,不知道写这个代码的人怎么想的,所以就设置了淘汰策略并把存储的逻辑删掉了,发包到线上;

发完包后,有用户反馈数据一直没同步

解决

这里处理比较简单,由于之前打了日志,问题比较直观,不需要工具排查,每次执行都进入 try 的 else 分支,很明显 redis 的 key 状态没有复位,并且没有其他机制(比如过期删除、超时复位逻辑)保证,导致无法同步

由于没有查询到 key 在其他位置的使用,并且任务中不存在死循环、死锁、等待等问题,大概率是定时任务执行的过程中,进程直接被杀死导致的

代码如下

    @Scheduled(initialDelay = 1000, fixedDelay = 6000)public void task2() {log.info("执行开始:");try {Object gd_job = this.redisTemplate.opsForValue().get("gd_job");if (null != gd_job && gd_job.equals("N")) {this.redisTemplate.opsForValue().set("gd_job", "Y");// 业务this.redisTemplate.opsForValue().set("gd_job", "N");log.info("执行结束:");} else {log.info("其他任务进行中此次终止:");}} catch (final Exception e) {e.printStackTrace();log.info("异常:", e);this.redisTemplate.opsForValue().set("gd_job", "N");}}

解决方式

  1. 加上淘汰时间就好了
  2. 没有其他逻辑,try catch 直接删掉,异常直接框架处理,异常后 key 不删除对代码影响也不大,后续正确后,依然可以同步前面没同步的
  3. 魔法值什么的抽取一下,等小优化

其他,优化思路

当时看这个业务的时候,这个代码也是有点屎山,死活看不懂流程是怎么跑的,在代码中没有看到对应的逻辑,后面才发现用了 MySQL触发器。。。

顺便梳理一下从登录、数据同步、上报给第三方的流程,也当作吐槽的续集 小公司后端架构、代码、流程吐槽

架构图如下:

首先,该项目涉及到四个进程,分别是 app(hn)、第三方授权、redis、MySQL、其他运动平台,前四个都是部署在一个服务器中。

  1. 当用户通过 app(hn)通过手机号注册时,创建账号,绑定用户信息,落库至 hn_uas
  2. 绑定用户信息后,MySQL 触发器调用,往 oauth 库创建账号(直接复制 uid、phone、password),是的,通过 MySQL 触发器的方式直接为其他项目创建账户,难怪死活查不到,数据修改的逻辑不收敛到代码里,难找的要死,高度耦合,表分库但是逻辑不分库,以及懒得再吐槽了,同类的还有很多
  3. 用户创建完成后,去第三方平台绑定 app(hn)信息,这里的绑定逻辑走的是第三方授权项目,由于第二步已经帮助创建账号了,所以跨系统登录是没问题的。登录完成后,往 redis 放置 key1 数据,key 中包含了 uid
  4. 用户使用 app 上传数据,落库至 hn_active,如果能从 redis 中查询到 key1 数据,额外存储到 A_sport_data 中。由于 第三方项目的 uid 是从 app(hn) 复制而来,所以 key1 是可以查询到的
  5. 当数据成功存储进 A_sport_data 后,同样的触发器调用,将数据复制到 oauth的 A_sport_data
  6. 第三方授权项目有一个定时器,定时扫描未同步的 A_sport_data ,进行数据上报,修改状态位

问题很明显,各个模块好像分离,但是又不分离,无用数据多次拷贝,明明是同一个账号缺又是单独的账号系统,两个项目可以合并成一个,app 业务和数据上报使用不同的前缀,用一个网关进行校验转发。就可以去除触发器,另外都是在一台机器上,也没啥业务量压力,分库也显得没有必要了,已经说烂的事情

这是一段防爬代码块,我不介意文章被爬取,但请注明出处
console.log("作者主页:https://www.cnblogs.com/Go-Solo");
console.log("原文地址:https://www.cnblogs.com/Go-Solo/p/18404971");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/794606.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java基础 -线程(基础)的 笔记

581,多线程机制 因为需要敌人的坦克可以自由移动并发射子弹,我们的坦克可以移动并发射子弹,这些要用到线程的知识。根据JConsole监控线程执行情况,发现,主线程执行完了,子线程还没有执行完,并不能表示当前进程死亡了,只有当所有的子线程执行完了,主进程才会结束。真正…

Leangoo领歌:一站式敏捷缺陷管理平台,助力产品迭代

在敏捷开发环境下,缺陷管理的效率直接影响到项目的质量和交付周期。对于追求高效、透明和灵活的敏捷团队来说,Leangoo领歌无疑是一个不可或缺的工具。​在开发过程中,缺陷(BUG)管理一直是项目管理中的一个关键环节。及时发现并修复BUG,不仅能够提高产品质量,还能有效提升…

手写数字识别总结

项目介绍:每张图片都是28*28的像素1,使用全连接层 图像拆分成一维像素阵列作为输入值,输入到神经网络中。打包多个图像输入称为一个batch2,输出数据需要做归一化,使数据概率在0-1之间3,一个batch_size设置为15,共训练两次 通过调节a和b,使训练值与真实值的误差减小,形…

h5新特性

新增语义化标签header:整个页面或部分区域的头部footer:整个页面,或者部分区域的底部nav:导航article:文章、帖子、杂志、博客、评论等section:页面中的某段文字或者文章中的某段文字aside:侧边栏main:文档的主要内容,(WHATWG没有语义,IE不支持)hgroup:包裹连续的标题,如文章…

Python存储与读写二进制文件

本文介绍了一种在Python中将Numpy数组转存为一个紧凑的二进制格式的文件,及其使用内存映射的形式进行读取的方案。一个二进制的数据流,不仅可以更加方便页形式的内存映射,相比于传统的Numpy单精度浮点数数组还有一个可哈希的特性。总体来说是一个对于高性能计算十分友好的存…

IIS标识介绍

原文链接:https://blog.csdn.net/weixin_30607659/article/details/95294969 应用程序池的标识是运行应用程序池的工作进程所使用的服务帐户名称。默认情况下,应用程序池以 Network Service 用户帐户运行,该帐户拥有低级别的用户权限。您可以将应用程序池配置为以 Windows S…

SQL SERVER -- JSON处理

-- JSON 字符串转 行记录 Declare @JsonStr Nvarchar(Max)=[{"State":0,"Name":"语文","ReMark":"了解国学信息","RepDtl":[{"ID":1,"Age":11},{"ID":2,"Age":12},{&quo…

添加字体(以课堂“谁能许我扶桑花期字体“为例)

1.进入https://font.chinaz.com/此网址,在搜索栏搜索“谁能许我扶桑花期字体”,点击下载 2.下载后为font1618.rar压缩文件,将文件放于桌面并进行解压 3.解压后的文件夹中包括三个文件,如图将【谁能许我扶桑花期】.ttf文件进行复制 4.打开“我的电脑(计算机)”,在地址栏输入…

2-4Java重写与重载

Java 重写与重载 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。 重写方法不能抛出新的检查异…

django 路由相关

路由系统 1 常见操作 通俗的语言来表示:URL -> 函数对应关系2 路由源码分析 2.1 路由定义的本质from django.urls import path, re_path from apps.www import viewsfrom django.urls import URLPattern from django.urls.resolvers import RoutePatternurlpatterns = […

django环境相关

1.项目相关新项目开发时,可能遇到使用其他的版本。 虚拟环境老项目打开项目 虚拟环境1.1 关于新项目 1.系统解释器+命令行【学习】 C:/python38- python.exe- Scripts- pip.exe- pip3.8.exe- django-admin.exe- Lib- re.py- site-pakages- djangoC:/python39- python.exe- Scr…