Executing Cron Scripts Reliably At Scale

Bài tóm tắt Slack 2023 3. Quy mô lớn Độ khó: Dễ

Slack · 2023 · 3. Quy mô lớn · Độ khó: Dễ — bài gốc

Bối cảnh

  • Cron chạy chức năng then chốt: nhắc việc đúng giờ, gửi email, dọn DB. Ban đầu là một máy chứa mọi script và một crontab; số script và dữ liệu tăng thì đổi máy to hơn. Một máy nên lỗi cấp phát, xoay vòng hay cấu hình là dừng cả dịch vụ.

Thay đổi chính

  • Dùng lại hệ có sẵn thay vì xây hết: ba thành phần:
    • Scheduled Job Conductor (Go, trên Bedrock, lớp bọc Kubernetes của Slack): thư viện cron của Go giữ nguyên định dạng chuỗi cron cũ để chuyển dễ. Nhiều pod nhưng chỉ một pod lập lịch nhờ Kubernetes leader election, các pod khác chờ thay; tránh để pod tắt vào đầu phút (lúc cron hay kích hoạt). Không cho nhiều node cùng lập lịch vì đồng bộ chúng phiền hơn lợi: đổi leader rất nhanh, và việc nặng đã chuyển đi.
    • Job Queue của Slack (khoảng 9 tỉ job/ngày; Kafka để bền, Redis để giữ metadata ngắn hạn, rồi worker): mỗi script là một job, đặt trên queue riêng nên chạy nhanh; gánh hết CPU và bộ nhớ.
    • Bảng Vitess thay flock: mỗi lần chạy là một dòng với trạng thái (enqueued, in progress, done); trước khi chạy kiểm không có bản đang chạy (index theo tên script), vì vài script chạy lâu hơn chu kỳ của nó. Bảng cũng làm nền cho trang web xem trạng thái và lỗi (script chạy tới một giờ).

Vì sao

  • Dựa vào hệ đã chịu tải lớn hơn nhiều giảm cả công xây lẫn công bảo trì.

Bài học cho SWE

  • Cron lớn lên thành hệ phân tán: tách lập lịch (nhẹ, một leader) khỏi thực thi (nặng, đẩy vào hàng đợi).
  • Khoá chống chạy chồng nên là trạng thái trong DB, vừa khoá vừa để quan sát.

Liên quan