XXL-JOB: Hỗ trợ đa ngôn ngữ và khả năng mở rộng

XXL-JOB là một nền tảng lập lịch tác vụ phân tán, được thiết kế với mục tiêu phát triển nhanh chóng, dễ học, nhẹ và dễ mở rộng. Dự án đã được mã nguồn mở và được tích hợp vào nhiều sản phẩm trực tuyến của các công ty khác nhau. Địa chỉ dự án: https://gitcode.com/xuxueli/xxl-job

XXL-JOB là một framework lập lịch tác vụ phân tán, cung cấp hỗ trợ đa ngôn ngữ và khả năng mở rộng cao thông qua OpenAPI và GLUE mode. Bài viết này sẽ trình bày chi tiết về thiết kế giao diện cốt lõi, giải pháp hỗ trợ nhiều ngôn ngữ, cơ chế xử lý tác vụ script và cách triển khai trình xử lý tác vụ tùy chỉnh, thể hiện cách RESTful API và tải script động đáp ứng các yêu cầu kinh doanh đa dạng.

Thiết kế và triển khai OpenAPI

XXL-JOB cung cấp hỗ trợ đa ngôn ngữ thông qua OpenAPI, cho phép các hệ thống bên thứ ba tương tác với trung tâm điều phối hoặc trình thực thi thông qua giao diện RESTful. Phần này sẽ đi sâu vào chi tiết thiết kế và triển khai OpenAPI, bao gồm giao diện cốt lõi, quy trình gọi và hỗ trợ mở rộng.

Thiết kế giao diện cốt lõi

OpenAPI của XXL-JOB được chia thành hai loại chính: API trung tâm điều phối và API trình thực thi. API trung tâm điều phối được triển khai bởi JobApiController, trong khi API trình thực thi được cung cấp bởi giao diện AdminBiz và lớp triển khai AdminBizClient.

1. API trung tâm điều phối (JobApiController)

JobApiController là điểm vào API cốt lõi của trung tâm điều phối, cung cấp các chức năng như kích hoạt tác vụ và truy vấn tác vụ. Dưới đây là các giao diện cốt lõi của nó:

@RestController
@RequestMapping("/api")
public class JobApiController {
    @Autowired
    private XxlJobService xxlJobService;

    @PostMapping("/trigger")
    public ReturnT<String> triggerJob(@RequestParam("jobId") int jobId,
                                     @RequestParam(value = "executorParam", required = false) String executorParam) {
        return xxlJobService.triggerJob(jobId, executorParam);
    }

    @GetMapping("/log")
    public ReturnT<XxlJobLog> getJobLog(@RequestParam("logId") long logId) {
        return xxlJobService.getJobLog(logId);
    }
}
2. API trình thực thi (AdminBiz)

AdminBiz là giao diện cốt lõi của trình thực thi, định nghĩa các chức năng như callback tác vụ và kiểm tra heartbeat. Lớp triển khai AdminBizClient đóng gói logic gọi HTTP:

public interface AdminBiz {
    ReturnT<String> callback(List<HandleCallbackParam> callbackParamList);
    ReturnT<String> registry(RegistryParam registryParam);
}

public class AdminBizClient implements AdminBiz {
    private String addressUrl;
    private String accessToken;
    private int timeout;

    @Override
    public ReturnT<String> callback(List<HandleCallbackParam> callbackParamList) {
        return XxlJobRemotingUtil.postBody(addressUrl + "api/callback", accessToken, timeout, callbackParamList, String.class);
    }
}

Ví dụ quy trình gọi

Dưới đây là quy trình gọi hoàn chỉnh để kích hoạt một tác vụ:

Hỗ trợ mở rộng

Thiết kế OpenAPI của XXL-JOB có các đặc tính mở rộng sau:

  1. Ngôn ngữ không phụ thuộc: Dựa trên giao thức HTTP, có thể gọi bằng bất kỳ ngôn ngữ nào.
  2. Tham số tùy chỉnh: Hỗ trợ truyền tham số tác vụ động.
  3. Cơ chế xác thực: Đảm bảo an toàn giao diện thông qua accessToken.
Ví dụ: Gọi API trung tâm điều phối bằng Python
import requests

def trigger_job(job_id, executor_param=None):
    url = "http://xxl-job-admin/api/trigger"
    params = {"jobId": job_id, "executorParam": executor_param}
    response = requests.post(url, params=params)
    return response.json()

print(trigger_job(1, "test_param"))

Tóm tắt

Thiết kế OpenAPI của XXL-JOB đơn giản và hiệu quả, thực hiện tách biệt trung tâm điều phối và trình thực thi thông qua giao diện RESTful, mang lại sự tiện lợi lớn cho tích hợp đa ngôn ngữ.

Giải pháp hỗ trợ đa ngôn ngữ

Với tư cách là một framework lập lịch tác vụ phân tán, khả năng hỗ trợ đa ngôn ngữ là một trong những khả năng mở rộng cốt lõi của XXL-JOB. Thông qua thiết kế API RESTful và đa ngôn ngữ, XXL-JOB có thể tích hợp liền mạch nhiều trình thực thi tác vụ bằng các ngôn ngữ lập trình khác nhau, đáp ứng nhu cầu của các ngăn xếp công nghệ khác nhau. Dưới đây là các giải pháp hỗ trợ đa ngôn ngữ cụ thể:

1. Thiết kế API RESTful

Trung tâm điều phối và trình thực thi của XXL-JOB giao tiếp thông qua API RESTful, thiết kế này cho phép bất kỳ ngôn ngữ nào hỗ trợ yêu cầu HTTP có thể dễ dàng tích hợp. Dưới đây là ví dụ về các giao diện API quan trọng:

// Giao diện kích hoạt tác vụ
POST /api/trigger
Content-Type: application/json
{
    "jobId": 1,
    "executorHandler": "demoJobHandler",
    "executorParams": "param1=value1&param2=value2",
    "glueType": "BEAN"
}

2. Triển khai client đa ngôn ngữ

XXL-JOB cung cấp các triển khai client bằng nhiều ngôn ngữ, nhà phát triển có thể chọn thư viện client phù hợp theo nhu cầu. Dưới đây là các loại client được hỗ trợ:

Ngôn ngữ Địa chỉ thư viện client Đặc điểm
Java Nội bộ xxl-job-core Hỗ trợ gốc, đầy đủ chức năng nhất
Python Thư viện bên thứ ba xxl-job-python-client Nhẹ, phù hợp với tác vụ script
Go Thư viện bên thứ ba xxl-job-go-client Hiệu suất cao, phù hợp với场景 microservice
Node.js Thư viện bên thứ ba xxl-job-node-client Hỗ trợ bất đồng bộ, phù hợp với tích hợp frontend

3. Ví dụ tác vụ đa ngôn ngữ

Dưới đây là ví dụ về trình thực thi tác vụ Python, thể hiện cách kích hoạt tác vụ thông qua API RESTful:

import requests

def trigger_job(job_id, handler, params):
    url = "http://xxl-job-admin:8080/api/trigger"
    data = {
        "jobId": job_id,
        "executorHandler": handler,
        "executorParams": params,
        "glueType": "BEAN"
    }
    response = requests.post(url, json=data)
    return response.json()

# Gọi ví dụ
result = trigger_job(1, "pythonJobHandler", "param1=test")
print(result)

4. Hỗ trợ tác vụ script đa ngôn ngữ

XXL-JOB hỗ trợ chạy tác vụ dưới dạng script, nhà phát triển có thể tải lên trực tiếp mã script, không cần biên dịch để thực thi. Dưới đây là các loại script được hỗ trợ:

Loại script Đuôi file Cách thực thi
Shell .sh Thực thi qua hệ thống Shell
Python .py Thực thi qua trình thông dịch Python
Node.js .js Thực thi qua Node.js
PHP .php Thực thi qua trình thông dịch PHP

5. Hỗ trợ quốc tế hóa

Trung tâm điều phối của XXL-JOB hỗ trợ giao diện đa ngôn ngữ, mặc định cung cấp hai ngôn ngữ tiếng Trung và tiếng Anh. Nhà phát triển có thể chuyển đổi ngôn ngữ thông qua tệp cấu hình:

// Đặt ngôn ngữ là tiếng Anh
xxl.job.i18n=EN

6. Thiết kế mở rộng

Hỗ trợ đa ngôn ngữ của XXL-JOB không chỉ giới hạn ở các thư viện client hiện có, nhà phát triển còn có thể mở rộng theo các cách sau:

  1. Client tùy chỉnh: Triển khai client mới dựa trên tài liệu API RESTful.
  2. Cơ chế plugin: Mở rộng hỗ trợ loại script mới thông qua GlueFactory.
  3. Tích hợp OpenAPI: Gọi trực tiếp API OpenAPI của trung tâm điều phối để thực hiện lập lịch tác vụ.

7. Đề xuất tối ưu hóa hiệu suất

Trong các场景 đa ngôn ngữ, tối ưu hóa hiệu suất đặc biệt quan trọng:

  • Quản lý pool kết nối: Cấu hình pool kết nối cho client gọi thường xuyên.
  • Gọi bất đồng bộ: Sử dụng client HTTP bất đồng bộ để giảm độ trễ kích hoạt tác vụ.
  • Tinh giản log: Tránh xuất quá nhiều log trong script tác vụ để giảm overhead truyền mạng.

Thông qua các giải pháp trên, XXL-JOB có thể linh hoạt hỗ trợ nhiều ngôn ngữ lập trình, đáp ứng nhu cầu lập lịch tác vụ trong các场景 kinh doanh phức tạp.

GLUE mode và tác vụ script

XXL-JOB cung cấp hỗ trợ GLUE mode mạnh mẽ, cho phép nhà phát triển viết và phát hành logic mã tác vụ trực tuyến thông qua Web IDE, không cần quy trình triển khai phức tạp. Chế độ này đặc biệt phù hợp với các场景 cần lặp lại nhanh và điều chỉnh động. Dưới đây là giới thiệu chi tiết về GLUE mode và hỗ trợ tác vụ script.

Tổng quan GLUE mode

Ý tưởng cốt lõi của GLUE mode là tách biệt logic mã tác vụ khỏi nền tảng lập lịch, thực hiện quản lý linh hoạt tác vụ thông qua tải và thực thi mã động. XXL-JOB hỗ trợ nhiều loại script GLUE task, bao gồm nhưng không giới hạn:

  • Script Shell
  • Script Python
  • Script NodeJS
  • Script PHP
  • Script PowerShell
Liệt kê loại GLUE

XXL-JOB định nghĩa các loại script được hỗ trợ và các thuộc tính liên quan thông qua lớp liệt kê GlueTypeEnum. Dưới đây là định nghĩa cốt lõi:

public enum GlueTypeEnum {
    BEAN("Bean", false, null, null),
    GLUE_SHELL("Shell", true, "bash", ".sh"),
    GLUE_PYTHON("Python", true, "python", ".py"),
    GLUE_NODEJS("NodeJS", true, "node", ".js"),
    GLUE_PHP("PHP", true, "php", ".php"),
    GLUE_POWERSHELL("PowerShell", true, "powershell", ".ps1");

    private final String desc;
    private final boolean isScript;
    private final String cmd;
    private final String suffix;

    private GlueTypeEnum(String desc, boolean isScript, String cmd, String suffix) {
        this.desc = desc;
        this.isScript = isScript;
        this.cmd = cmd;
        this.suffix = suffix;
    }

    public static GlueTypeEnum match(String name) {
        for (GlueTypeEnum item : GlueTypeEnum.values()) {
            if (item.name().equals(name)) {
                return item;
            }
        }
        return null;
    }
}
Giải thích thuộc tính quan trọng
Thuộc tính Giải thích
desc Mô tả loại script, ví dụ "Shell" hoặc "Python".
isScript Đánh dấu xem có phải là loại script hay không.
cmd Công cụ dòng lệnh cần thiết để thực thi script, ví dụ bash hoặc python.
suffix Đuôi file script, ví dụ .sh hoặc .py.

Lớp factory GLUE

GlueFactory là lớp cốt lõi tải và thực thi tác vụ GLUE động, các phương thức quan trọng của nó như sau:

public class GlueFactory {
    public static GlueFactory getInstance() {
        return new GlueFactory();
    }

    public static void refreshInstance(int type) {
        // Logic làm mới instance
    }

    public IJobHandler loadNewInstance(String codeSource) {
        // Logic tải và khởi tạo instance mới
    }

    public void injectService(Object instance) {
        // Logic inject dịch vụ
    }
}
Giải thích phương thức
  1. loadNewInstance Tải và khởi tạo instance GLUE mới, trả về một instance IJobHandler.
  2. injectService Inject dịch vụ phụ thuộc vào instance GLUE, ví dụ kết nối cơ sở dữ liệu hoặc client API bên ngoài.

Quy trình phát triển tác vụ script

  1. Tạo tác vụ script Trong giao diện quản lý XXL-JOB, chọn chế độ "GLUE" và chỉ định loại script (ví dụ Shell hoặc Python).
  2. Viết script Viết logic script trực tuyến thông qua Web IDE, hỗ trợ nổi bật cú pháp và xem trước thời gian thực.
  3. Phát hành động Sau khi lưu script, XXL-JOB sẽ tự động biên dịch và phát hành, không cần triển khai thủ công.
  4. Thực thi và giám sát Sau khi kích hoạt tác vụ, có thể xem kết quả thực thi và đầu ra thông qua log.

Ví dụ: Tác vụ script Shell

Dưới đây là ví dụ về tác vụ script Shell đơn giản, dùng để xuất thời gian hệ thống theo lịch trình:

#!/bin/bash
echo "Thời gian hiện tại: $(date)"

Ưu điểm và ứng dụng

  • Lặp lại nhanh: Cập nhật logic tác vụ mà không cần khởi động lại dịch vụ.
  • Hỗ trợ đa ngôn ngữ: Bao phủ các ngôn ngữ script chính, đáp ứng nhu cầu đa dạng.
  • Đơn giản hóa triển khai: Tiết kiệm các bước triển khai tác vụ truyền thống phức tạp.

Thông qua GLUE mode, XXL-JOB cung cấp tính linh hoạt và tiện lợi tối đa cho nhà phát triển, là lựa chọn lý tưởng cho quản lý tác vụ động.

Trình xử lý tác vụ tùy chỉnh

XXL-JOB cung cấp chức năng trình xử lý tác vụ tùy chỉnh mạnh mẽ, cho phép nhà phát triển mở rộng logic xử lý tác vụ linh hoạt theo yêu cầu kinh doanh. Bằng cách triển khai giao diện IJobHandler hoặc kế thừa các lớp con, nhà phát triển có thể định nghĩa trình xử lý tác vụ của riêng mình và đăng ký vào hệ thống lập lịch. Dưới đây là phân tích chi tiết về trình xử lý tác vụ tùy chỉnh.

1. Giao diện cốt lõi IJobHandler

IJobHandler là lớp cơ sở của tất cả các trình xử lý tác vụ, định nghĩa các phương thức vòng đời cơ bản của xử lý tác vụ. Dưới đây là các phương thức cốt lõi:

public abstract class IJobHandler {
    // Điểm vào thực thi tác vụ
    public abstract void execute() throws Exception;

    // Phương thức khởi tạo tác vụ
    public void init() {
        // Triển khai mặc định rỗng
    }

    // Phương thức hủy tác vụ
    public void destroy() {
        // Triển khai mặc định rỗng
    }
}
Giải thích phương thức:
  1. execute Logic cốt lõi thực thi tác vụ, nhà phát triển cần triển khai logic kinh doanh cụ thể ở đây.
  2. init Gọi khi khởi tạo tác vụ, có thể dùng để tải tài nguyên hoặc thao tác khởi tạo.
  3. destroy Gọi khi hủy tác vụ, có thể dùng để giải phóng tài nguyên hoặc dọn dẹp.

2. Trình xử lý tác vụ nội bộ

XXL-JOB cung cấp nhiều trình xử lý tác vụ nội bộ, nhà phát triển có thể sử dụng trực tiếp hoặc tham khảo triển khai:

2.1 ScriptJobHandler

Dùng để thực thi tác vụ script (ví dụ Shell, Python). Logic cốt lõi như sau:

public class ScriptJobHandler extends IJobHandler {
    @Override
    public void execute() throws Exception {
        // Logic thực thi script
    }
}
2.2 MethodJobHandler

Dùng để gọi phương thức bằng reflection. Logic cốt lõi như sau:

public class MethodJobHandler extends IJobHandler {
    @Override
    public void execute() throws Exception {
        // Logic gọi phương thức mục tiêu bằng reflection
    }
}
2.3 GlueJobHandler

Dùng để tải và thực thi mã GLUE động. Logic cốt lõi như sau:

public class GlueJobHandler extends IJobHandler {
    private IJobHandler jobHandler;

    @Override
    public void execute() throws Exception {
        jobHandler.execute();
    }
}

3. Triển khai trình xử lý tác vụ tùy chỉnh

Nhà phát triển có thể thực hiện trình xử lý tác vụ tùy chỉnh theo các bước sau:

3.1 Kế thừa IJobHandler
public class MyCustomJobHandler extends IJobHandler {
    @Override
    public void execute() throws Exception {
        // Logic kinh doanh tùy chỉnh
        System.out.println("Tác vụ tùy chỉnh đã thực thi!");
    }

    @Override
    public void init() {
        // Khởi tạo tài nguyên
        System.out.println("Tác vụ tùy chỉnh đã khởi tạo.");
    }

    @Override
    public void destroy() {
        // Giải phóng tài nguyên
        System.out.println("Tác vụ tùy chỉnh đã hủy.");
    }
}
3.2 Đăng ký trình xử lý tác vụ

Trong cấu hình tác vụ, chỉ định tên lớp trình xử lý tác vụ (ví dụ MyCustomJobHandler) làm JobHandler của tác vụ.

4. Vòng đời trình xử lý tác vụ

Trình xử lý tác vụ của XXL-JOB tuân theo vòng đời sau:

  1. Khởi tạo: Gọi phương thức init khi tác vụ được lập lịch lần đầu.
  2. Thực thi: Gọi phương thức execute mỗi khi tác vụ được kích hoạt.
  3. Hủy: Gọi phương thức destroy khi tác vụ dừng hoặc hệ thống tắt.

5. Ví dụ: Tác vụ phân mảnh động

Dưới đây là ví dụ về tác vụ phân mảnh động:

public class ShardingJobHandler extends IJobHandler {
    @Override
    public void execute() throws Exception {
        // Lấy tham số phân mảnh
        int shardIndex = XxlJobHelper.getShardIndex();
        int shardTotal = XxlJobHelper.getShardTotal();

        // Logic phân mảnh
        System.out.println("Chỉ số phân mảnh: " + shardIndex + ",Tổng số phân mảnh: " + shardTotal);
    }
}

6. Tóm tắt

Bằng cách triển khai trình xử lý tác vụ tùy chỉnh, nhà phát triển có thể mở rộng linh hoạt khả năng xử lý tác vụ của XXL-JOB, đáp ứng các yêu cầu kinh doanh đa dạng. Dù là tác vụ script đơn giản hay tác vụ phân mảnh phân tán phức tạp, XXL-JOB đều cung cấp hỗ trợ mạnh mẽ.

Tóm tắt

XXL-JOB cung cấp khả năng lập lịch tác vụ đa ngôn ngữ mạnh mẽ thông qua thiết kế OpenAPI cẩn thận và GLUE mode linh hoạt. Kiến trúc mô-đun và các điểm mở rộng phong phú (như trình xử lý tác vụ tùy chỉnh, hỗ trợ script đa ngôn ngữ) giúp nó thích ứng với nhiều场景 phức tạp. Dù là ứng dụng doanh nghiệp hay kiến trúc microservice, XXL-JOB đều có thể cung cấp giải pháp lập lịch tác vụ hiệu quả và đáng tin cậy.

XXL-JOB là một nền tảng lập lịch tác vụ phân tán, được thiết kế với mục tiêu phát triển nhanh chóng, dễ học, nhẹ và dễ mở rộng. Dự án đã được mã nguồn mở và được tích hợp vào nhiều sản phẩm trực tuyến của các công ty khác nhau. Địa chỉ dự án: https://gitcode.com/xuxueli/xxl-job

Thẻ: xxl-job Task-Scheduling distributed-systems restful-api glue-mode

Đăng vào ngày 8 tháng 6 lúc 18:30