XxJob定时任务问题回顾记录

2024-06-12 23:38

本文主要是介绍XxJob定时任务问题回顾记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        Java web开发的日常工作中,大概率会有定时任务的场景,如果这种需求不多的情况下可以用Spring自带的Scheduled定时任务注解:

       如果这种需求较多,写在项目中可能比较混乱,不易管理和迭代,这时可以考虑用XxJob,将任务拆解出来独立成一个服务。XxJob是一个定时任务开源平台,能和Spring程序整合,首先有一个XxJob中心,注册中心登录上去是XxJob可视化面板,可以看到运行报表、任务管理、运行日志,运行日志中可以看到运行的状态,有成功、失败、进行中,服务启动时通过RPC调用向注册中心注册获取执行器地址,并注册任务,任务通过多态调用。 

 向注册中心注册获取执行器地址:

注册任务:

 日志:

       我的环境:服务器centos,容器docker,cpus:2,内存:4G,在docker上跑了10个服务,其它服务运行内存3G,我的4G。

       我的问题:部分服务运行时OOM。

第一阶段

        开始我负责的模块建了六十多个任务,8月初以来,任务一直不稳定,记得有一个周六早上要演示,带来了较多问题,前一天任务运行情况还好。一开始的问题主要是有失败、进行中的,那个时候参与的另一个模块的任务的几个任务也是进行中:

分析问题

       得益于XxJob可视化面板,可以看到失败的日志,基本是代码问题,跨月少表,代码缺陷,就改代码,内存不足就加了内存,从之前的2G加到4G,工作任务的是加到了3G,另外重新安排任务运行时间,期间多次调整过任务时间。

第二阶段

       到了9月中旬,需求基本研发完毕,代码趋于稳定,之前一些不好的写法也已经摒弃(比如一组不变的数据在循环中多次查询,改成在循环外一次查询准备好、部分有价值的统计先算好到一张表,后面用),多亏其他同事帮忙,任务从原来六十多个到二十多个左右,也便于管理,之前自己对公司的统计工具理解不到位,导致任务繁多实现不合理,改造之后,基本都是最可用的任务。问题仍然存在,基本都是进行中的问题。

分析问题

        观察了一段时间后,某一天早上突然发现进行中是因为执行器IP变了,当时彷佛发现了新大陆,以为找到了问题,就问同事,同事说执行器IP变了是因为服务重启了,重新注册后获得新的IP(但是宣哥说发版重建容器IP才会变,嗯,先这样吧),原因是OOM。

       再观察,发现进行中的任务是真的让人迷惑,没有规律,这就很奇怪,如果是代码问题,问题情况应该也是稳定的。主要有以下几点:

1.不是某一个/些固定的任务跑起来会进行中,这次是这个,下次可能是另外一个,之前没出现过的,也有可能出现。

2.不是每天跑任务都会有进行中,今天有,明天可能没有。

3.其他一个服务也有进行中的任务。

寻找问题

       本地运行那些出现过进行中的任务,观察内存占用,不到1G(我本地分配了2G运行内存)。

改代码

       通过观察本地监控,发现Map对象最多,查表也是放到Map,再是对Map的操作于是把用到Map的地方.get能换成.remove的地方换成.remove,遍历一个删一个。然后要查去年的地方把今年和去年也分开查了,改了下还是有进行中的任务。可以释放的地方改动点比较小。

       某一天晚上突然想到会不会是BigDecimal占用字节数太大,导致内存不足,我的所有表的字段基本都是BigDecimal,一共13个字段,一个表2万多数据,平均9张表,,然后网上(https://blog.csdn.net/yunqiinsight/article/details/80431831)找了一个方式,用instrumentation在jvm中监控,测了下BigDecimal占用四十多个字节:

        job中都是放在map中,又在job中测了下,换算了下也就5百M左右,和监控差不多。看日志,发现任务出现运行中的情况时服务确实有重启,但是没找到重启前的异常日志,虽然知道线上的日志位置,但是没权限进去。

还是没有找到问题

        最后实在没辙,想着只有我和另一个同事的两个服务是4G,其它的都是3G,要么改成3G试试。之前听运维同事说抽取服务的内存已经分配很多了,很消耗宿主机资源,就想会不会4G太多了,导致实际运行时给到的内存反而可能少,毕竟其它服务也都是3G了,其它一共9个服务,就27G了。

        改完看来运行正常了,当天中午改了后,下午手动点了下,晚上回去又手动点了下,都运行成功。任务是串行的。

总结:

       先从代码问题入手,自己先思考,再虚心求教。

       任务时间要注意,减少外部影响。

       任务改成用串行,减少内部影响。

       观察规律然后多次尝试。

这篇关于XxJob定时任务问题回顾记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1055667

相关文章

linux生产者,消费者问题

pthread_cond_wait() :用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

2024.6.24 IDEA中文乱码问题(服务器 控制台 TOMcat)实测已解决

1.问题产生原因: 1.文件编码不一致:如果文件的编码方式与IDEA设置的编码方式不一致,就会产生乱码。确保文件和IDEA使用相同的编码,通常是UTF-8。2.IDEA设置问题:检查IDEA的全局编码设置和项目编码设置是否正确。3.终端或控制台编码问题:如果你在终端或控制台看到乱码,可能是终端的编码设置问题。确保终端使用的是支持你的文件的编码方式。 2.解决方案: 1.File -> S

vcpkg安装opencv中的特殊问题记录(无法找到opencv_corexd.dll)

我是按照网上的vcpkg安装opencv方法进行的(比如这篇:从0开始在visual studio上安装opencv(超详细,针对小白)),但是中间出现了一些别人没有遇到的问题,虽然原因没有找到,但是本人给出一些暂时的解决办法: 问题1: 我在安装库命令行使用的是 .\vcpkg.exe install opencv 我的电脑是x64,vcpkg在这条命令后默认下载的也是opencv2:x6

问题-windows-VPN不正确关闭导致网页打不开

为什么会发生这类事情呢? 主要原因是关机之前vpn没有关掉导致的。 至于为什么没关掉vpn会导致网页打不开,我猜测是因为vpn建立的链接没被更改。 正确关掉vpn的时候,会把ip链接断掉,如果你不正确关掉,ip链接没有断掉,此时你vpn又是没启动的,没有域名解析,所以就打不开网站。 你可以在打不开网页的时候,把vpn打开,你会发现网络又可以登录了。 方法一 注意:方法一虽然方便,但是可能会有

记录AS混淆代码模板

开启混淆得先在build.gradle文件中把 minifyEnabled false改成true,以及shrinkResources true//去除无用的resource文件 这些是写在proguard-rules.pro文件内的 指定代码的压缩级别 -optimizationpasses 5 包明不混合大小写 -dontusemixedcaseclassnames 不去忽略非公共

vue同页面多路由懒加载-及可能存在问题的解决方式

先上图,再解释 图一是多路由页面,图二是路由文件。从图一可以看出每个router-view对应的name都不一样。从图二可以看出层路由对应的组件加载方式要跟图一中的name相对应,并且图二的路由层在跟图一对应的页面中要加上components层,多一个s结尾,里面的的方法名就是图一路由的name值,里面还可以照样用懒加载的方式。 页面上其他的路由在路由文件中也跟图二是一样的写法。 附送可能存在

vue+elementui--$message提示框被dialog遮罩层挡住问题解决

最近碰到一个先执行this.$message提示内容,然后接着弹出dialog带遮罩层弹框。那么问题来了,message提示框会默认被dialog遮罩层挡住,现在就是要解决这个问题。 由于都是弹框,问题肯定是出在z-index比重问题。由于用$message方式是写在js中而不是写在html中所以不是很好直接去改样式。 不过好在message组件中提供了customClass 属性,我们可以利用