How we built it: Real-time analytics for Stripe Billing
Bài tóm tắt Stripe 2025 3. Quy mô lớn Độ khó: Trung bình
Stripe · 2025 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc
Bài vừa kỹ thuật vừa giới thiệu tính năng; ít số liệu quy mô.
Bối cảnh
- Dashboard của Stripe Billing hiển thị MRR, churn, tỉ lệ chuyển đổi trial... Hệ cũ chạy batch, trễ trung bình 24 giờ: trạng thái hiện tại của một subscription được tính lại bằng cách phân tích toàn bộ lịch sử của nó từ đầu, nên không thể chạy đủ thường để gần realtime. Thêm một bước tiền tổng hợp trước khi đưa vào OLAP (Pinot).
Thay đổi chính
- Pipeline event-driven với Flink: cập nhật của object subscription và invoice thành sự kiện analytics; Flink giữ lịch sử subscription dạng nén làm state và cập nhật tăng dần. Khoản trả 20 USD tháng 6 chỉ được cộng vào sổ trong state, không phải đánh giá lại cùng mọi khoản từ tháng 1. Khởi tạo state cho khách lâu năm (phải phát lại hàng tỉ sự kiện lịch sử) là một thách thức riêng. Độ trễ cập nhật thấp nhất khoảng 15 phút.
- Bỏ tiền tổng hợp nhờ engine mới của Pinot: engine đa tầng (v2) của Pinot hỗ trợ aggregation theo cửa sổ thời gian, tính MRR theo thời gian lúc query mà không cần tổng hợp offline. Làm cùng maintainer để đưa engine (chưa từng dùng hướng tới user ở quy mô này) vào production. Đa số cập nhật xử lý dưới 1 phút, gần như tất cả có trong 15 phút; query dưới 300 ms.
- Khách đổi định nghĩa metric (ví dụ bỏ coupon một lần khỏi MRR) mà vẫn nhất quán:
- Chạy batch tính lại lịch sử theo định nghĩa mới.
- Song song vẫn stream sự kiện mới theo định nghĩa cũ.
- Đồng thời đệm sự kiện mới trong RAM của ứng dụng Flink.
- Xong batch thì vá state của Flink bằng lịch sử đã tính lại, cho Flink xử lý lại sự kiện đã đệm trên lịch sử mới.
- Chuyển Dashboard sang dữ liệu mới, dừng xử lý theo định nghĩa cũ. Dashboard không bị xám hay bất nhất trong suốt quá trình.
Vì sao
- Tính lại từ đầu mỗi lần chỉ hợp với batch; state tăng dần trong stream processor biến chi phí mỗi cập nhật thành hằng số (Pipeline dữ liệu và analytics).
- Batch không mất đi mà đổi vai: dùng để tính lại lịch sử khi định nghĩa đổi, rồi ghép với stream.
Bài học cho SWE
- Dữ liệu có lịch sử (subscription) cần state tăng dần thay vì quét lại; khởi tạo state cho dữ liệu cũ là bài toán riêng.
- Đổi logic tính toán trên hệ stream: tính lại lịch sử bằng batch, đệm sự kiện mới, vá state, phát lại, rồi chuyển một lần.
- Tiền tổng hợp làm nhanh query nhưng làm chậm độ tươi; engine query mạnh hơn cho phép bỏ bước đó.
Liên quan
#Streaming analytics#Apache Flink#Stateful stream#Apache Pinot#Multi-stage engine#Window aggregation#MRR#Backfill#Metric definition change
Được nhắc tới trong
Công ty (1)
Bài tóm tắt (3)