Service Architecture at SoundCloud — Part 1: Backends for Frontends
Bài tóm tắt SoundCloud 2021 2. Tăng trưởng Độ khó: Dễ
SoundCloud · 2021 · 2. Tăng trưởng · Độ khó: Dễ — bài gốc
Phần 1 của series 3 phần; sheet trỏ tới phần 3 (SoundCloud 2021). Phần 2: SoundCloud 2021.
Bối cảnh
- Trước 2013, SoundCloud "tự ăn món mình nấu": một Public API duy nhất phục vụ cả app chính thức lẫn bên thứ ba.
- Nhu cầu scale cả vận hành lẫn tổ chức đẩy họ từ monolith sang microservices. Monolith có thêm API nội bộ và trở thành "một microservice nữa". Từ đó mở đường cho API riêng cho từng frontend.
Thay đổi chính
- 2013: khai sinh pattern BFF (backend-for-frontend): mỗi loại client có một API gateway riêng, tối ưu cho đúng nhu cầu của nó.
- Hiện trạng 2021:
- vài chục BFF (Mobile API cho Android/iOS, Web API, Public API, Partner API);
- mọi traffic từ ngoài vào data center đều qua một BFF, tổng cộng hàng trăm triệu request mỗi giờ;
- BFF đảm nhận rate limit, xác thực, làm sạch header, cache control nhờ một thư viện edge dùng chung; bản mới của thư viện được rollout bán tự động tới mọi BFF trong vài giờ;
- BFF được bảo trì theo mô hình inner source: team nào cũng đóng góp được, một Core team duyệt theo nguyên tắc chung.
Vì sao (theo SoundCloud)
- Tốt:
- tự chủ: mobile thích response lớn, nhúng nhiều entity; web thích response nhỏ;
- chịu lỗi: deploy hỏng chỉ sập một BFF ở một AZ;
- nhịp phát triển nhanh: BFF chính deploy nhiều lần mỗi ngày;
- có chỗ đặt workaround cho bug của một phiên bản client mà không làm phức tạp cả nền tảng.
- Xấu: khi microservice chỉ làm CRUD và không có tầng giữa, logic tích hợp và phân quyền rơi vào BFF và bị nhân bản ở từng BFF, mỗi bản trôi một kiểu. Vấn đề rõ nhất khi Track và Playlist bị tách thành nhiều microservice: phân quyền phải làm ở điểm ghép, tức là BFF.
- Tệ:
- thiếu năng lực chung (ví dụ quyền theo ứng dụng) thì dễ đẻ thêm BFF cho từng ca hẹp;
- đẩy logic client sang BFF, ví dụ phân trang đệ quy trả cả collection trong một request, gây timeout và fan-out storm có thể kéo sập hệ thống;
- "tự chủ hoàn toàn cho dev client là ảo tưởng": BFF nằm ở giao giữa frontend và backend.
Bài học cho SWE
- BFF giải bài toán "mỗi client một nhu cầu", nhưng nếu thiếu tầng nghiệp vụ ở giữa thì BFF thành nơi chứa logic trùng lặp. Phần 2 kể cách họ sửa: SoundCloud 2021.
- Tầng edge dùng chung (thư viện + rollout tự động + inner source) là thứ giữ cho nhiều BFF không trôi xa nhau.
Liên quan
Được nhắc tới trong
Công ty (1)
Bài tóm tắt (3)