type
status
date
slug
summary
tags
category
icon
password
Property
Jul 23, 2022 12:19 PM

背景解读

1. 定时任务

定时定点(指机器)执行的一些列任务,这列任务的生命周期位被唤醒到任务执行完毕。

2. Xxl-job(调度中心)

一个分布式的调度中心,数据集中保存在一个数据库中,可以实现集群部署且不会发生多次重复调度的问题。

3. Xxl-job(执行器)

通过调度中心通知到指定执行器,执行器再根据指令做出指定行为。

实现方案

1. 部署多个调度中心程序,形成调度中心集群,用一个负载均衡使同一个域名指向执行器集群。
2. 在服务器上部署执行器**程序**,指定调度中心时,使用负载地址或域名。执行器**程序**可在多台机器上多次部署;不同的执行器程序可使用同一个名称,相同名称的多个执行器将被视为一个执行器程序集群。
3. 在调度中心配置中心配置单位执行器,配置时需要指定使用的执行器服务。单个执行器程序可被多个单位执行器使用。
notion image

部署方案

1. 调度中心部署

调度中心通过镜像直接把部署

2. 执行器部署

对于执行器来说,也可以通过镜像方式部署,这种部署方式可以实现一台机器仅部署一个执行器程序即可。
在这种模式下,被执行的程序和执行器之间可以不用相互关注,只需要配置自身的环境即可。
  1. 条件
    1. 执行器的镜像编写,需要配置两个环境:`docker`,`Java`其中java环境是为了启动执行器;docker环境是为了和宿主机的docker程序通信。另外需要准备好一个可用的脚本用于给执行器执行的命令,当然也可以在执行其中编写,并不做强要求。
      在镜像做好后启动容器时,需要将宿主机的docker.socket文件映射到容器中,这样才可以做到容器中启动宿主机的容器。
  1. 启动逻辑
    1. 容器中脚本运行`docker run --rm -name radom app:tag cmd`,这条命令将被容器中的docker程序发送到docker.socket中,接着宿主机中的docker程序将会和容器通信,在宿主机中执行词条命令,这时在宿主机中会启动一个容器响应这条命令,并在程序完成后销毁自身。
      这种部署模式较为简便,仅需要在目标服务器中拉取一个执行器程序镜像和多个任务执行对象镜像即可。

3. 执行器注册

  1. 启动的执行器程序会向调度中心发送心跳,但没有在调度中心配置时,调度中心不会记录这个执行器。
  1. 在调度中心新建一个执行器,这里需要配置的对象有三个,执行器名称、执行器程序名称、执行器服务地址
    1. 执行器名称:由于调度中心对于执行器的区分是使用id进行的,因此可以同名。
    2. 执行器程序名称:没有执行服务器地址时,调度中心根据心跳判断目标执行器地址。
    3. 执行器服务地址:指定地址时,调度中心会向指定的执行器服务发送任务。
    4. 可将一台服务器的一个执行器服务注册为调度中心的多个执行器单位,在这些单位中建立的任务将会被赋予权限的账号访问,但负责执行的仍是同一个执行器。

4. 定时任务添加

Java-crontask

针对crontask的新任务添加
  1. 认真阅读crontask开发规范。
  1. 根据开发规范,制作xxl-job执行器执行脚本
  1. 结合开发规范和执行脚本,新增的任务按如下模板配置即可
    1. 任务配置面板
      1. notion image
    2. 任务执行脚本
复制上面的脚本,进更改包名即可

Java-crontab

对一些旧代码进行维护,使crontab中的任务可以在容器环境下执行,由xxl-job调度中心指挥执行器进行调度
困难点
  1. 旧代码结构较为复杂,经检查涉及到的文件夹大小甚至有38G之大,由于对其中的业务不熟悉,因此很难摘出无用的文件。
  1. 旧代码尽管只有Java代码,但承载了公司多个部门的定时任务,其他部门没有对任务脚本的控制权限,希望在xxl-job中能够控制
    解决方式
    1. 镜像制作和维护
      1. 维护一份仅有环境的镜像
    1. 镜像运行
      1. 将宿主机的程序和脚本映射到容器中
    1. 任务执行
      1. 新建脚本使其符合镜像中的环境,在xxl-job中配置执行时间等
         
    JavaServer-CheckListMysql数据导入问题