Why We Switched Our Data Orchestration Service

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

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

Bối cảnh

  • Spotify chạy 20.000 pipeline batch mỗi ngày, định nghĩa trong hơn 1.000 repo, của hơn 300 team (2022). Đa số dựa vào Luigi (Python) và Flo (Java): workflow là các task phụ thuộc đệ quy, đóng gói cả vào một image Docker, Styx lập lịch và chạy trên GKE; đồ thị phụ thuộc chỉ được khám phá lúc chạy.
  • Vấn đề của mô hình thư viện:
    • Bảo trì hai thư viện cùng chức năng.
    • Phải đẩy bản cập nhật tới mọi user, mà user không nâng phiên bản: khó đưa bản sửa và instrumentation mới tới hơn 1.000 repo; phiên bản phân mảnh.
    • Container workflow là hộp đen với nền tảng: chỉ biết đồ thị task và upstream bị chặn sau khi chạy; một phần thời gian cụm GKE bị tốn cho việc poll phụ thuộc còn thiếu.

Thay đổi chính

  • Từ 2019, mục tiêu: nâng cấp không ma sát (đẩy nhiều chức năng nhất có thể xuống nền tảng để tự động áp cho mọi người) và mở đường cho tự động hoá (tự backfill phía sau, hành động theo event, huỷ khi có alert, báo consumer khi workflow trễ/hỏng), mà cần nhìn thấy task và workflow.
  • Từ thư viện sang dịch vụ: điều phối do một dịch vụ được quản lý làm; code nghiệp vụ chạy trong môi trường nền tảng kiểm soát; user định nghĩa workflow bằng SDK mỏng do nền tảng phát hành.
  • Tiêu chí chọn: công migrate, làm mới hay dùng sản phẩm có sẵn, gánh bảo trì, khả năng mở rộng, nhìn được bên trong workflow, hỗ trợ nhiều ngôn ngữ. Chọn Flyte: mô hình thực thể gần với Luigi/Flo (dễ migrate), task là công dân hạng nhất, SDK mỏng vì logic ở backend, tách khỏi phần còn lại của hệ sinh thái, mở rộng được, đã chạy ở quy mô tương tự, mã nguồn mở (Spotify góp vào). Workflow đăng ký cả vào Flyte Admin lẫn Styx.
  • Lúc viết đã chạy pipeline quan trọng trên Flyte, còn phải chuyển hết pipeline cũ từ Luigi.

Vì sao

Bài học cho SWE

  • Ở quy mô hàng nghìn repo, đừng phát hành năng lực nền tảng dưới dạng thư viện dày; SDK mỏng + dịch vụ cho phép nâng cấp tập trung.
  • Muốn tự động hoá trên workflow (backfill, báo trễ) thì nền tảng phải thấy được cấu trúc workflow trước khi chạy.

Liên quan