XxlJob深度性能优化实践

这篇具有很好参考价值的文章主要介绍了XxlJob深度性能优化实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景

天画项目的数据工厂目前在与xxl-job对接自动化数据生成任务,另外我司也在使用该组件做业务,所以想深入了解下XxlJob。在跟进了社区的github等仓库issue发现开发迭代停滞了一段时间,思来想去准备开个下游分支做一些性能优化和特性开发等,于是fork了下源码,将其作为天画社区关于任务调度的组件来使用。
我花了几天阅读源码,同时做了一些简单的调试,发现了一些问题之后着手进行优化,本文将从XxlJob的原理出发深入其性能瓶颈,并提出一些解决方案。相关优化的代码已经上传至gitee.

二、调度流程解读

在进行性能和安全改造之前,需要对xxljob的调度执行原理要非常了解,所以这里我们先简单看一下xxljob的调度流程和线程模型。

2.1 调度流程

  1. 服务端启动流程

XxlJob深度性能优化实践,技术分享,轻蜗牛租房技术&业务架构系列,分布式理论&实践,性能优化,Xxljob

  1. 客户端启动流程

XxlJob深度性能优化实践,技术分享,轻蜗牛租房技术&业务架构系列,分布式理论&实践,性能优化,Xxljob

  1. 客户端与服务端交互流程

XxlJob深度性能优化实践,技术分享,轻蜗牛租房技术&业务架构系列,分布式理论&实践,性能优化,Xxljob

2.2 调度线程模型

通过上面的流程图我们可以梳理出如下服务端和客户端用到的线程和线程池,具体作用通过名称即可了解。
服务端:

  1. 触发器线程池(fastTriggerPool,slowTriggerPool)
  2. 注册&停止注册线程池(registryOrRemoveThreadPool)
  3. 注册监听线程(registryMonitorThread)
  4. 任务失败监听线程(monitorThread)
  5. 任务完成回调线程池(callbackThreadPool)
  6. 任务完成回调监听线程(monitorThread)
  7. 统计日志线程(logrThread)
  8. 调度线程(scheduleThread)
  9. 时间轮线程(ringThread)

客户端:

  1. http 交互监听线程(thread)
  2. 注册器线程(registryThread)
  3. 任务线程(JobThread)
  4. 任务回调日志线程(triggerCallbackThread)
  5. 回调日志重试线程(triggerRetryCallbackThread)

2.3 客户端API

这里需要说明的是,在一定程度上客户端(也就是执行器,以下统称为客户端)也会作为服务端接受调度中心(即xxl job server 服务端)的回调,所以这里是一个比较令人迷惑的地方。
这里列出服务端调用客户端的API
127.0.0.1:9999/beat
127.0.0.1:9999/idleBeat
127.0.0.1:9999/run
127.0.0.1:9999/kill
127.0.0.1:9999/log

2.4 服务端API

这里列出客户端调用服务端的API
127.0.0.1:8080/api/callback
127.0.0.1:8080/api/registry
127.0.0.1:8080/api/registryRemove

三、潜在问题

在反复看了xxljob 开源社区gitee/github上的issue之后,我对下面的几个问题比较关注,所以在业余时间中专门调试并且进行了一定的复现,这里简单回顾一下xxljob在高并发调度过程中可能产生的问题。

3.1 重复调度

重复调度的问题其实是偶发问题,问题的现象或者特征就是一个任务在一次调度中重复执行了两次,同时产生了 两条xxljob log,发生时间相同。

3.2 安全问题

xxljob控制台查询客户端日志的时候会返回accessToken,github上的issue讨论已经提供了复现步骤,这里目前作者已经提供升级,但是本文的重点不止于此,因为另外的安全问题就是accessToken在客户端与服务端之间的交互是明文传输的,另外也是服务端与所有客户端共用的,一旦泄露其实会比较危险。

3.3 并发调度变慢

XxlJob的调度在并发变高的时候从日志上可以看出调度会有一些延迟,出现这个问题的原因有以下几个方面:

  1. 一秒内调度量比较多,对客户端和服务端在一秒内会产生上千次调度
  2. 调度粒度是线程(JobThread)和单次粒度的,所以一秒内要处理2-3倍的数据库IO和网络IO
  3. 选用了busyover或者failover的调度策略,这两种需要在调度之前给对应的客户端发送心跳
  4. 日志处理,这里包括客户端的日志处理和服务端的日志处理,在并发比较高的情况下日志产生的量也比较大,

对调度业务会产生一定的资源占用。

3.4 线程模型的性能瓶颈

这个问题其实与3.3类似,从上面的调度流程图可以看到xxljob其实是对每个xxl_job_info在对应的客户端上构建一个JobThread,如果执行器对应的任务比较多且存在一秒内并发触发的话就可能导致客户端本身出现性能问题。

3.5 回调并发变慢

这个问题也是高并发调度下产生的问题,xxljob在日志处理上有两种方式:一种是在调度job方法内通过XxlJobHelper.log去记录产生的业务日志,这部分是存在于客户端的,另外一种则是调度日志,即对该job在当前调度结果的日志信息推送到服务端做记录或者统计,这部分数据存储在服务端的xxl_job_log表中。
在高并发调度的情况下,客户端的处理存在性能问题,一次回调推送的日志太少,客户端存在积压。

3.6 分页性能问题

在高并发或者大量任务的场景中xxlJob的管理控制台在任务管理和调度日志分页上存在性能问题,可能导致页面加载缓慢同时服务端进程崩溃,进而影响服务运行。

四、优化点

4.1 认证优化

在xxl job的源码中需要借助xxl.job.accessToken来完成客户端与服务端的认证,这个配置在客户端注册到服务端,以及客户端和服务端在相互调用过程中都会进行认证。由于配置是统一的,所以所有客户端都需要配置这个,另外认证过程中是accessToken是明文传输的,所以这种认证机制一定程度上是比较弱的。另外如果改动认证机制的话则客户端和服务端都要改,本次优化则花一定的精力来提升安全性。总结起来就是如下几点:

  1. 强制安全认证

客户端或者服务端不配置accessToken则启动失败

  1. 认证加密

客户端与服务端之间的交互均通过加密accessToken的方式

  1. 弱化accessToken在认证过程中的影响

对于每个客户端虽然都配置同样的accessToken,但是新生成的accessToken(原accessToken+appName)则是通过AES进行加密。
这里我们看一下进行强认证过程的时序图:

XxlJob深度性能优化实践,技术分享,轻蜗牛租房技术&业务架构系列,分布式理论&实践,性能优化,Xxljob
下面我们看一下具体实现源码:
客户端:文章来源地址https://www.toymoban.com/news/detail-831834.html

 private String  initEmbedServer(String address, String ip, int port, String appname, String accessToken) throws Exception {

        // fill ip port
        port = port>0?port: NetUtil.findAvailablePort(9999);
        ip = (ip!=null&&ip.trim().length()>0)?ip: IpUtil.getIp();


        // generate address
        // registry-address:default use address to registry , otherwise use ip:port if address is null
        if (address==null || address.trim().length()==0) {
            String ip_port_address = IpUtil.getIpPort(ip, port);
            address = "http://{ip_port}/".replace("{ip_port}", ip_port_address);
        }

        // accessToken
        if (accessToken == null || accessToken.trim().length()==0) {
            throw new IllegalArgumentException("xxl-job accessToken need not  null. ");
            //logger.warn(">>>>>>>>>>> xxl-job accessToken is empty. To ensure system security, please set the accessToken.");
        }

        // start
        embedServer = new EmbedServer();
        //accessToken加密
        String accessCookie &#

到了这里,关于XxlJob深度性能优化实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flink:处理大规模复杂数据集的最佳实践深入探究Flink的数据处理和性能优化技术

    作者:禅与计算机程序设计艺术 随着互联网、移动互联网、物联网等新型网络技术的不断发展,企业对海量数据的处理日益依赖,而大数据分析、决策支持、风险控制等领域都需要海量的数据处理能力。如何高效、快速地处理海量数据、提升处理效率、降低成本,是当下处理

    2024年02月13日
    浏览(52)
  • Android复杂UI的性能优化实践 - PTQBookPageView 性能优化记录

    作者:彭泰强 要做性能优化,首先得知道性能怎么度量、怎么表示。因为性能是一个很抽象的词,我们必须把它量化、可视化。那么,因为是UI组件优化,我首先选用了 GPU呈现模式分析 这一工具。 在手机上的开发者模式里可以开启 GPU呈现(渲染)模式分析 这一工具,有的

    2024年02月14日
    浏览(45)
  • 最佳实践分享:SQL性能调优

    SQL性能调优是一个需要不断探索和实践的过程,旨在确保数据库查询的高效运行。本文将分享一些SQL性能调优的最佳实践,帮助您提升数据库性能,减少查询响应时间。 一、索引优化 索引是提高查询性能的关键。以下是一些关于索引优化的建议: 1.为经常用于查询条件的列

    2024年01月16日
    浏览(37)
  • 性能优化实践:一行代码性能提升几十倍?

    Part1 问题背景 在一般的互联网公司,大家都非常忙碌。活儿是永远干不完的。这时候,我建议先做重要的事情。试想:一个人永远都在做「紧急不重要」的事情,他的产出必然是非常低的。这就是为什么「重要不紧急」在第二象限,仅仅排在「重要且紧急」后面。 所以对于

    2024年04月28日
    浏览(37)
  • React组件性能优化实践

    React组件性能优化的核心是减少渲染真实DOM节点的频率,减少 Virtual DOM比对的频率。 在组件中为 window注册的全局事件,以及定时器,在组件卸载前要清理掉,防止组件卸载后继续执行影响应用性能。 需求:开启定时器,然后卸载组件,查看组件中的定时器是否还在运行。 什

    2024年02月14日
    浏览(38)
  • 客户端性能优化实践

    双十一大促时,客户客服那边反馈商品信息加载卡顿,在不断有订单咨询时,甚至出现了商品信息一直处于加载状态的情况,显然,在这种高峰期接待客户时,是没法进行正常的接待工作的。 起初,页面一直处于加载状态,初步认为是后端接口返回太慢导致,后经过后端日志

    2024年02月03日
    浏览(42)
  • Andriod开发性能优化实践

    内存优化 在Android开发中,有一些实践可以帮助进行内存优化,以减少应用程序的内存占用和提高性能。以下是一些常见的内存优化实践: 使用合适的数据结构和集合:选择合适的数据结构和集合来存储和操作数据,以减少内存占用。例如,使用SparseArray代替HashMap,使用Arr

    2024年02月15日
    浏览(42)
  • 线索系统性能优化实践

    在京东家居事业部,线索CRM系统扮演着至关重要的角色,它作为构建家居场景核心解决方案集的首要环节,肩负着获客和拓展业务的重要使命。然而,随着业务的不断扩张和市场需求的日益增长,系统原有的架构开始显露出诸多不适应之处,如架构设计不再清晰,代码存在过

    2024年01月25日
    浏览(48)
  • Web站点性能优化经验分享

            之前负责IT团队项目管理工作,手里有几套业务站点。其中一个站点被业务吐槽比较严重,主要涉及功能模块缺失、站点性能差会出现卡死的现象,同时也被旁边的项目团队埋怨调用我们的接口会比较慢,甚至超时的情况。         鉴于业务压力,准备对这个

    2024年02月03日
    浏览(47)
  • ES性能优化最佳实践- 检索性能提升30倍!

            Elasticsearch是被广泛使用的搜索引擎技术,它的应用领域远不止搜索引擎,还包括日志分析、实时数据监控、内容推荐、电子商务平台、企业级搜索解决方案以及许多其他领域。其强大的全文搜索、实时索引、分布式性能和丰富的插件生态系统使其成为了许多不同

    2024年02月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包