首页 > 其他分享 >线上问题排查-定时任务状态未复位

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

时间:2024-09-09 18:37:19浏览次数:7  
标签:log 复位 app 排查 job gd hn 线上 第三方

项目业务

用户授权登录后,负责把本 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");

标签:log,复位,app,排查,job,gd,hn,线上,第三方
From: https://www.cnblogs.com/Go-Solo/p/18404971

相关文章

  • Springboot计算机毕业设计线上线下的篮球培训系统02tab(程序+源码+数据库+调试部署+开
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表学员,教练,篮球课程,线上教学,学习记录,签到打卡,学员点评,班级开题报告内容一、研究背景及意义1.1研究背景随着体育运动的普及与全民健身意识的提升,篮球作为......
  • Springboot计算机毕业设计线上跳蚤市场平台iy7e7(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,商家,商品分类,商品信息,公告信息开题报告内容一、研究背景与意义随着互联网技术的飞速发展,电子商务已经成为人们生活中不可或缺的一部分。特别是在高校环......
  • 25届计算机专业选题推荐-基于python的线上拍卖会管理系统【python-爬虫-大数据定制】
    ......
  • Java计算机毕业设计线上学习系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和互联网的普及,教育领域正经历着前所未有的变革。传统面对面教学模式虽有其不可替代的优势,但在灵活性、覆盖范围及个性化学习......
  • springboot个性化大学生线上聊天交友系统
    基于springboot+vue实现的个性化大学生线上聊天交友系统 (源码+L文+ppt)4-017           4系统设计  4.1软件功能模块设计  个性化大学生线上聊天交友分为两个模块,分别是管理员功能模块和用户功能模块。主要功能模块包括:首页、用户、省、市、爱好、......
  • pod之间访问不通怎么排查
    当Kubernetes集群中的Pod之间无法相互访问时,可以通过以下步骤进行排查:1.检查Pod状态使用以下命令查看Pod的状态,确认所有相关Pod都在运行状态:kubectlgetpods-n<namespace>2.检查网络策略如果集群中使用了网络策略(NetworkPolicies),需要确保相关的网络策略允许Pod之间的......
  • evo-e.dll下载陷阱多?evo-e.dll常见错误排查与安全下载指南
    在下载和使用evo-e.dll这类动态链接库文件时,用户确实需要格外注意,因为网络上存在许多潜在的陷阱,如恶意软件伪装、下载来源不可靠等。以下是一份关于evo-e.dll常见错误排查与安全下载的详细指南:一、evo-e.dll常见错误排查文件缺失或损坏:当应用程序提示找不到evo-e.dll文......
  • 基于微信小程序的白云轩餐厅线上点餐小程序的设计与实现-计算机毕业设计源码+LW文档
    摘 要随着科技的不断发展,移动互联网已经深入到人们生活的方方面面。在餐饮业中,线上点餐系统的出现改变了传统的点餐模式,为顾客提供了更加便捷、高效的就餐体验。同时,对于餐厅而言,线上点餐系统能够提高工作效率、降低成本、增加营收。因此,开发一款基于微信小程序的白云轩餐厅线上......
  • 蓝天救援线上管理系统建设
    蓝天救援队管理系统作为一个综合性的信息管理平台,旨在提高救援队的工作效率和服务质量。该系统通常包含多个功能模块,以满足蓝天救援队在日常管理、任务分配、救援行动及后续总结等方面的需求。志愿者信息管理:志愿者报名与审核:允许志愿者在线报名,并经过系统审核后成为正式成......
  • linux网络丢包怎么排查
    在Linux系统中,网络丢包可能由多种因素引起,包括网络设备故障、配置问题、流量拥堵等。以下是排查网络丢包的一些步骤和工具:1.检查网络接口使用ifconfig或ip命令查看网络接口的状态:ifconfig#或者ipaddrshow注意:检查是否有错误(errors)或丢包(droppedpackets)信息。......