0
0
Lập trình
Admin Team
Admin Teamtechmely

Phân Tích Mã Nguồn Khởi Động Worker Service của DolphinScheduler 3.1.9

Đăng vào 2 ngày trước

• 5 phút đọc

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 Copy
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 Copy
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 Copy
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ừ waitSubmitQueue và 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 Copy
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úcTà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ụ:

Luồng Phân Phối Nhiệm Vụ

2.2 Luồng Dừng Nhiệm Vụ:

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.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào