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

相关文章

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤