Quora's Distributed Cron Architecture

Bài tóm tắt Quora 2013 2. Tăng trưởng Độ khó: Cơ bản

Quora · 2013 · 2. Tăng trưởng · Độ khó: Cơ bản — bài gốc

Site chặn crawler; wiki đọc toàn văn qua trình duyệt, ghi chú bằng lời của wiki. Năm là ước lượng.

Bối cảnh

  • Thời đầu, mỗi tần suất (mỗi phút, 5 phút, giờ, ngày, tuần) có một script chạy tuần tự mọi job của tần suất đó, tất cả trên một máy.
  • Theo Quora, cách này không tin cậy cũng không scale: đẩy máy quá sức thì job lỗi; nhiều job chung một process Python thì ảnh hưởng nhau khó đoán; chạy tuần tự nên không chia tải tự động được, và job chạy sau bị trễ giờ bắt đầu khi job trước lâu hơn.
  • Vá tạm: chia tần suất cho nhiều máy (job mỗi phút chạy phút chẵn ở máy này, phút lẻ ở máy kia, để mất một máy vẫn chạy ít nhất 2 phút/lần), dời job nặng hoặc không quan trọng sang máy riêng. Nhưng vẫn phải scale bằng tay, và một job có thể chạy hai nơi cùng lúc, phải thêm khoá kiểu "đã chạy rồi" trên mỗi máy.

Thay đổi chính

  • Bảng job trong một database trung tâm: mỗi job có thời điểm bắt đầu và kết thúc lần cuối, máy và process đang chạy. Worker "giữ chỗ" job bằng cách cập nhật nguyên tử thời điểm bắt đầu; job chỉ giữ được nếu lần bắt đầu cuối trước đầu chu kỳ hiện tại và không đang chạy. Luật được viết thành một câu SQL, để DB chọn job. Khoảng 145 job khi viết bài.
  • Worker là một script nhỏ chạy mỗi phút, giữ job rồi fork process con để chạy; master nạp sẵn module và dữ liệu chỉ đọc nên con dùng chung bộ nhớ. Con báo kết quả (thành công, lỗi, thời gian) rồi thoát.
  • Tự lành: job chết mà không kịp ghi thời điểm kết thúc (ví dụ hết RAM bị kill) thì master đặt lại trạng thái để job chạy lại ở nơi khác. Bảng chỉ chứa dữ liệu tạm; định nghĩa job nằm trong code và tự đồng bộ vào bảng, nên DB hỏng thì dựng lại bằng một lời gọi hàm.
  • Đánh đổi: phụ thuộc vào DB trung tâm (chi phí lập lịch nhỏ so với việc cron làm trên DB production); chưa có lập lịch theo phụ thuộc giữa job như Chronos.
  • Kết quả: tin cậy (máy chết thì máy khác nhận), an toàn (job cô lập trong process riêng), đều giờ (mọi job một tần suất bắt đầu cùng lúc), scale bằng cách thêm máy cài package worker.

Bài học cho SWE

  • Cron trên một máy là điểm hỏng đơn và là trần năng lực; chuyển sang worker đối xứng giữ chỗ job trong một kho chung (Nền tảng nội bộ cho service (đường ray chung)).
  • Dùng cập nhật nguyên tử trong DB làm khoá cho "mỗi chu kỳ chạy đúng một lần" thay vì khoá cục bộ trên máy.
  • Tự lành cần biết khi nào một job "mồ côi" và đặt lại trạng thái; trạng thái tạm nên dựng lại được từ nguồn sự thật trong code (Tự động hoá vận hành và auto-remediation).

Liên quan