A Lightweight Distributed Architecture to Handle Thousands of Library Releases at eBay

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

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

Bối cảnh

  • eBay còn hơn 3.000 thư viện cũ build bằng hệ build dựa trên Ant, không còn được hỗ trợ. Mã nguồn được chuyển sang Maven chuẩn; sau đó cần một hệ release định kỳ cho tất cả, phải nhẹ, mở rộng được, ổn định, nhanh.
  • Ràng buộc: một thư viện chỉ release được khi mọi dependency đã release. Jenkins là công cụ CI/CD chuẩn của eBay.

Thay đổi chính

  • Sắp theo dependency: một service trung tâm đọc pom.xml, dựng DAG phụ thuộc giữa các thư viện; các nút release được song song thì cùng mức ưu tiên, lá release trước, cha release sau, rồi đưa vào một hàng đợi.
  • Tinh chỉnh ưu tiên: trong các nút cùng mức, nút có nhiều cha hơn (nhiều thứ đang chờ nó) được release trước, để worker không phải ngồi chờ một nút "chặn đường" được bốc ngẫu nhiên sau cùng.
  • Push mode (cách đầu): service trung tâm lấy các nút cùng mức và kích một job Jenkins cho mỗi nút, trên nhiều server Jenkins. Vấn đề: phải giữ và theo dõi rất nhiều node Jenkins; thời gian chờ lập lịch job lâu hơn thời gian release; dependency Maven tải lại trên mỗi node, không dùng chung. Một lượt release mất 2–3 ngày.
  • Pull mode (cách cuối): mỗi job Jenkins (pipeline Groovy) chạy vòng lặp: hỏi service trung tâm lấy thư viện kế tiếp → release → báo kết quả → lấy tiếp, tới khi hết. Chỉ cần một node với 20 job Jenkins; dependency đã tải được dùng lại giữa các thư viện; không tốn thời gian lập lịch job.
  • Kết quả: hơn 3.000 thư viện release trong khoảng 2 giờ (so với 2–3 ngày).

Vì sao

  • Theo eBay, kéo việc về theo năng lực của worker vừa tận dụng hết từng worker, vừa bỏ được việc giữ một đội node lớn chỉ để chờ được giao việc.

Bài học cho SWE

  • Pull thay vì push là backpressure tự nhiên: worker chỉ nhận việc khi rảnh, bộ điều phối không cần biết sức chứa của từng worker (Load shedding, rate limit và backpressure).
  • Với việc có phụ thuộc, thứ tự trong cùng mức cũng quan trọng: ưu tiên việc đang chặn nhiều việc khác (giống đường găng trong lập lịch).
  • Chi phí khởi động mỗi việc (lập lịch job, tải dependency) có thể lớn hơn chính việc; worker sống lâu và giữ cache cục bộ thắng worker dùng một lần.
  • Theo eBay, mẫu "service trung tâm giữ hàng đợi + worker kéo việc" dùng lại được cho chạy test tích hợp phân tán hay thu thập dữ liệu nhiều kênh; đây là công cụ nền tảng phục vụ một cuộc migrate hệ build (Nền tảng nội bộ cho service (đường ray chung)).

Liên quan