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:
- 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.
- Tham số tùy chỉnh: Hỗ trợ truyền tham số tác vụ động.
- 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¶m2=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:
- Client tùy chỉnh: Triển khai client mới dựa trên tài liệu API RESTful.
- Cơ chế plugin: Mở rộng hỗ trợ loại script mới thông qua
GlueFactory. - 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
loadNewInstanceTải và khởi tạo instance GLUE mới, trả về một instanceIJobHandler.injectServiceInject 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
- 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).
- 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.
- 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.
- 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:
executeLogic 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.initGọ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.destroyGọ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:
- Khởi tạo: Gọi phương thức
initkhi tác vụ được lập lịch lần đầu. - Thực thi: Gọi phương thức
executemỗi khi tác vụ được kích hoạt. - Hủy: Gọi phương thức
destroykhi 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