Phân Tích Mã Nguồn Khởi Động Worker Service của DolphinScheduler 3.1.9
Trong các doanh nghiệp hiện đại dựa trên dữ liệu, hệ thống lập lịch công việc là "hệ thần kinh trung ương" của các quy trình dữ liệu. Từ các tác vụ ETL đến đào tạo máy học, từ tạo báo cáo đến giám sát thời gian thực, hầu hết mọi quy trình kinh doanh quan trọng đều phụ thuộc vào một động cơ lập lịch ổn định, hiệu quả và có thể mở rộng.
Tôi tin rằng Apache DolphinScheduler 3.1.9 là một phiên bản ổn định và được sử dụng rộng rãi. Do đó, bài viết này sẽ phân tích mã nguồn cốt lõi của nó, khám phá thiết kế kiến trúc, phân chia module và các cơ chế thực hiện chính để giúp các lập trình viên hiểu cách mà Master và Worker "hoạt động" và tạo nền tảng cho việc phát triển thứ cấp hoặc tối ưu hóa hiệu suất.
Chúng tôi đã phân tích mã nguồn quy trình khởi động máy chủ Master của Apache DolphinScheduler 3.1.9, mà bạn có thể tham khảo nếu quan tâm. Bài viết này là phần thứ hai trong loạt bài phân tích mã nguồn của Apache DolphinScheduler 3.1.9: Giải thích mã nguồn quy trình khởi động máy chủ Worker và thiết kế quy trình liên quan. Các sơ đồ luồng được cung cấp ở cuối để tham khảo.
1. Tổng Quan Về Khởi Động Máy Chủ Worker
1.1 Điểm vào mã: org.apache.dolphinscheduler.server.worker.WorkerServer#run
java
public void run() {
// 1. khởi động rpc
this.workerRpcServer.start();
// Bỏ qua, vì khởi tạo workerRpcServer đã bao gồm khởi tạo workerRpcClient
this.workerRpcClient.start();
// 2. Khởi tạo plugin nhiệm vụ
this.taskPluginManager.loadPlugin();
this.workerRegistryClient.setRegistryStoppable(this);
// 3. Đăng ký worker
this.workerRegistryClient.start();
// 4. Luồng quản lý worker, liên tục lấy nhiệm vụ từ waitSubmitQueue và nộp chúng vào pool luồng
this.workerManagerThread.start();
// 5. Luồng thử nghiệm gửi lại thông điệp, chịu trách nhiệm lấy và gửi dịch vụ qua RPC
this.messageRetryRunner.start();
}
1.2 Khởi Động RPC:
- Mô tả: Đăng ký các bộ xử lý cho các lệnh liên quan như yêu cầu nhiệm vụ, yêu cầu dừng nhiệm vụ, v.v.
- Điểm vào mã:
org.apache.dolphinscheduler.server.worker.rpc.WorkerRpcServer#start
java
public void start() {
LOGGER.info("Máy chủ rpc Worker đang khởi động");
NettyServerConfig serverConfig = new NettyServerConfig();
serverConfig.setListenPort(workerConfig.getListenPort());
this.nettyRemotingServer = new NettyRemotingServer(serverConfig);
// Nhận và phân phối yêu cầu nhiệm vụ, đưa nhiệm vụ vào waitSubmitQueue để xử lý sau
this.nettyRemotingServer.registerProcessor(CommandType.TASK_DISPATCH_REQUEST, taskDispatchProcessor);
...
this.nettyRemotingServer.start();
LOGGER.info("Máy chủ rpc Worker đã khởi động");
}
1.3 Khởi Tạo Plugin Nhiệm Vụ:
- Mô tả: Khởi tạo các mẫu nhiệm vụ liên quan, chẳng hạn như tạo nhiệm vụ, phân tích tham số và truy xuất thông tin tài nguyên.
1.4 Đăng Ký Worker:
- Mô tả: Đăng ký thông tin worker với một trung tâm đăng ký (Zookeeper trong ví dụ này) và lắng nghe các thay đổi trạng thái kết nối.
- Điểm vào mã:
org.apache.dolphinscheduler.server.worker.registry.WorkerRegistryClient#start
java
public void start() {
try {
// Đăng ký thông tin worker với trung tâm đăng ký
registry();
// Lắng nghe các thay đổi trạng thái kết nối
registryClient.addConnectionStateListener(new WorkerConnectionStateListener(workerConfig, registryClient, workerConnectStrategy));
} catch (Exception ex) {
throw new RegistryException("Lỗi khởi động client đăng ký worker", ex);
}
}
1.5 Luồng Quản Lý Worker:
- Mô tả: Liên tục lấy nhiệm vụ từ
waitSubmitQueuevà nộp chúng vào pool luồng để xử lý. - Điểm vào mã:
org.apache.dolphinscheduler.server.worker.runner.WorkerManagerThread#run
java
public void run() {
Thread.currentThread().setName("Worker-Execute-Manager-Thread");
while (!ServerLifeCycleManager.isStopped()) {
try {
if (!ServerLifeCycleManager.isRunning()) {
Thread.sleep(Constants.SLEEP_TIME_MILLIS);
}
// Nếu tài nguyên pool luồng đủ, xử lý nhiệm vụ
final WorkerDelayTaskExecuteRunnable workerDelayTaskExecuteRunnable = waitSubmitQueue.take();
workerExecService.submit(workerDelayTaskExecuteRunnable);
...
} catch (Exception e) {
logger.error("Một gián đoạn bất ngờ đã xảy ra", e);
}
}
}
1.6 Luồng Thử Nghiệm Gửi Lại Thông Điệp:
- Mô tả: Nếu worker không nhận được xác nhận (ack) cho yêu cầu nhiệm vụ từ master, luồng này sẽ thử gửi lại thông điệp theo chu kỳ, thường là mỗi 5 phút.
2. Sơ Đồ Luồng Liên Quan
Tài liệu chính thức cung cấp nhiều sơ đồ luồng khác nhau, chẳng hạn như cơ chế chịu lỗi và sơ đồ thực hiện khóa phân tán. Để biết thêm chi tiết, hãy truy cập Thiết kế Kiến trúc và Tài liệu Thiết kế.
Bài viết này bổ sung các sơ đồ luồng phân phối nhiệm vụ và dừng nhiệm vụ, và chỉ mô tả quy trình khởi động và tắt của instance. Nó không bao gồm các kịch bản phục hồi chịu lỗi, cũng như không đề cập đến các kịch bản khóa hoặc đồng thời liên quan.
2.1 Luồng Phân Phối Nhiệm Vụ:
2.2 Luồng Dừng Nhiệm Vụ:
Kết Luận
Đây là sự hiểu biết ban đầu về các tính năng và kiến trúc của Apache DolphinScheduler 3.1.9 dựa trên việc học tập và thực hành cá nhân. Có thể có những hiểu lầm hoặc thiếu sót trong bài viết, vì vậy rất mong nhận được phản hồi. Nếu bạn quan tâm đến mã nguồn, bạn có thể đi sâu hơn vào chiến lược lập lịch nhiệm vụ hoặc phát triển các ứng dụng thứ cấp dựa trên các kịch bản kinh doanh của mình.
FAQ
1. Apache DolphinScheduler là gì?
Apache DolphinScheduler là một hệ thống lập lịch công việc mạnh mẽ giúp quản lý và tự động hóa các quy trình dữ liệu.
2. Tại sao nên sử dụng phiên bản 3.1.9?
Phiên bản 3.1.9 được cho là ổn định và có nhiều tính năng hỗ trợ cho việc lập lịch công việc hiệu quả.
3. Làm thế nào để tối ưu hóa hiệu suất của DolphinScheduler?
Các phương pháp như tối ưu hóa truy vấn cơ sở dữ liệu và tối ưu hóa các tác vụ có thể giúp nâng cao hiệu suất tổng thể của hệ thống.