Service Architecture at SoundCloud — Part 3: Domain Gateways

Bài tóm tắt SoundCloud 2021 4. Điều chỉnh Độ khó: Trung bình

SoundCloud · 2021 · 4. Điều chỉnh · Độ khó: Trung bình — bài gốc

Bối cảnh

  • Bài cuối của series 3 phần về tiến hoá kiến trúc service của SoundCloud. Phần 1: SoundCloud 2021; phần 2: SoundCloud 2021. Theo phần tóm tắt trong bài, kiến trúc có ba tầng:
    • BFF (backend-for-frontend) cho từng ứng dụng;
    • Value-Added Services (VAS): điểm vào chuẩn cho một aggregate lõi như Track, Playlist. VAS lấy trạng thái từ các service Foundation, áp luật phân quyền (ví dụ chặn track theo lãnh thổ), gom logic trước đây bị nhân bản ở các BFF;
    • Foundation.
  • Vấn đề: aggregate ngày càng lớn nên VAS fan-out ngày càng nhiều lời gọi mạng, trong khi mỗi BFF chỉ cần một phần (có tính năng chỉ có trên mobile).

Thay đổi chính

  • Partial response bằng FieldMask: BFF chỉ định những trường cần, VAS chỉ lấy phần đó. Dùng Twinagle (IDL protobuf theo giao thức Twirp). Đánh đổi: schema aggregate gắn chặt hơn với topology service. Họ cân nhắc GraphQL nhưng không chọn vì chi phí migrate khỏi stack hiện tại.
  • Thêm command (thao tác ghi) vào VAS: tải, like, repost track. Ví dụ "like": service Likes chỉ lưu liên kết, không biết phân quyền track, nên kiểm tra quyền đặt ở Tracks VAS rồi mới gọi Likes. Tách query/command theo tinh thần CQRS: đọc và ghi có thể dựa trên các service và kho khác nhau mà phía trên không cần biết.
  • Domain Gateway: một entity (track) được dùng ở nhiều domain với mẫu truy cập và phân quyền khác nhau (Consumer và Creator, hai team khác nhau). Thay vì một VAS ôm mọi thứ (dễ thành điểm nghẽn và dính chặt), mỗi domain có một gateway riêng trên cùng tầng Foundation, đóng vai anti-corruption layer.
  • Theo SoundCloud, đổi lại là chấp nhận một mức nhân bản để có tự chủ và khả năng scale. Hợp khi các domain có mẫu truy cập rất khác nhau, hoặc team khó phối hợp (khác múi giờ).

Vì sao

Theo SoundCloud: giảm độ phức tạp và logic trùng lặp ở tầng edge (BFF), tập trung phân quyền tại một nơi cho mỗi domain.

Bài học cho SWE

  • Gateway theo domain là lời giải lặp lại khi số service tăng: Uber DOMA có gateway cho mỗi domain (Uber 2020); Cloudflare có gRPC API trước DNS DB (Cloudflare 2024).
  • Fan-out của aggregate tăng theo số tính năng; partial response là cách giảm mà vẫn giữ một endpoint chuẩn.
  • Nhân bản có chủ đích (một gateway mỗi domain) đôi khi tốt hơn một service dùng chung ôm mọi thứ.

Liên quan