分布式定时任务系列6:XXL-job触发日志过大引发的CPU告警

传送门

分布式定时任务系列1:XXL-job安装

分布式定时任务系列2:XXL-job使用

分布式定时任务系列3:任务执行引擎设计

分布式定时任务系列4:任务执行引擎设计续

分布式定时任务系列5:XXL-job中blockingQueue的应用

Java并发编程实战1:java中的阻塞队列

问题出现

前几天上班的时候,收到运维的告警通知,安装XXL-job的服务器CPU飙高告警,让看一下。

查了下xxl-job-admin的日志文件,目录在logback.xml:

发现在告警时间点之前报了一个db事物超时的错误。

通过讯问得知,有人手动清理过任务,即将无效的 任务手动删除了:在xxl-job控制台创建了几个任务,后来业务变更,把代码里面的任务删除了,但是控制台任务没有删除,所以做任务清理。以前面的例子来进行说明

场景说明

开发第一个jobHandler
java 复制代码
@Component
public class JobHandler {
 
    @XxlJob("first_job")
    public void firstJob() {
        System.out.println("========================= first job========================= ");
    }
}

若以上配置成功,则可以在控制台看到注册的客户端机器

新建任务
测试任务

经过以上设置,在平台手动触发一次任务,并且可以查看执行日志

删除代码中的任务

执行一段时间后,代码中删除first_job,但是控制台任务不删除,执行一段时间后现删除。

但是这个正常的变更操作为什么会引起db出错呢?因为很有可能由于业务变动,先将代码中对应的任务删除的,而后再来清理XXL-job控制台的任务。

问题重现

要解决这个问题,首先还是要定位到原因。

结合报错日志,翻看了一下源码,发现从XXL-job控制台删除任务的逻辑:

  1. 界面删除选中的任务,发起URL请求:xxl-job-admin/jobinfo/remove
  2. 后端接口,开始同步处理,代码如下
  3. 跟踪代码,会发现问题代码出在清理任务对应的触发日志那个步骤

而这个Dao方法本身也平平无奇:

XML 复制代码
	<delete id="delete" >
		delete from xxl_job_log
		WHERE job_id = #{jobId}
	</delete>

那么到底是为什么这行sql会报错呢?

原因说穿了也很简单,因为这个任务对应的任务数据量太大了:

  • xxl_job_log表,在经过系统接近半年运行,这张表已经存储超过了1kw+数据量,这对mysql来说单表的数据量算比较大了,甚至会造成从界面查询调度日志都成问题
  • 单个任务删除时,在删除任务对应的调度日志时,数据量也是10w+(甚至可能更多,取决于配置的触发频率),执行这个sql的时候,对db来说不仅IO消耗大,且成了一个长事物,久久不能结束最后事物超时+CPU飙高

​​​问题解决

对于调试日志太大的问题,官网已经给出了解决方案

手动清理

可以通过看源码,看出它是根据界面选择的清理策略,发起一个http同步请求,做循环删除,也是比较粗暴:

自动清理

原理就是启动异步线程,执行删除,具体可以看下源码。

相关推荐
励志秃头码代码1 小时前
面试笔记 8.5
java·面试·职场和发展
阿诚学java1 小时前
数据结构与算法-15高级数据结构_树论(堆树)
java·数据结构
极客先躯2 小时前
一个是生产打包的时候, 一个是本地测试启动的时候,maven如何配置?
java·maven·动态配置
一只懒鱼a2 小时前
SpringBoot 集成原生 Servlet、Filter、Listener
java·spring boot·后端·spring
未来的JAVA高级开发工程师2 小时前
使用SpringAOP实现公共字段填充
java·开发语言·后端·spring·mybatis
W.KN2 小时前
常见API(二)
java·笔记
roykingw3 小时前
程序员短视频上瘾综合症
java·程序人生·面试
乐乐吃不饱3 小时前
java之WIFI信号模块
java·开发语言
数懒女士3 小时前
Java中等题-括号生成(力扣)
java·算法·leetcode
HumoChen993 小时前
项目中引入RedisTemplate和Redisson时RedisTemplate无法使用zset问题(栈溢出stackOverflow)深入源码分析解决
java·spring boot·mybatis·redisson·redistemplate