Building a data plane from scratch: Stripe's own high-performance distributed proxy
Bài tóm tắt Stripe 2026 4. Điều chỉnh Độ khó: Nâng cao
Stripe · 2026 · 4. Điều chỉnh · Độ khó: Nâng cao — bài gốc
Bối cảnh
- Mục tiêu độ tin cậy 99,9995% cho request thanh toán; service mesh nội bộ xử lý hàng triệu request/giây giữa hàng nghìn service (2026). Gần 10 năm dùng Envoy làm data plane.
- Vấn đề với Envoy, theo Stripe:
- Số kết nối: mô hình mỗi core một worker, mỗi worker giữ kết nối tới mọi upstream nên mỗi server nhận một kết nối cho mỗi core của mỗi client. Service hạ tầng nhận request từ cả fleet (ví dụ xử lý tracing) phải giữ hàng trăm nghìn kết nối; thường chỉ lộ ra khi quá nhiều kết nối gây sự cố.
- Nâng cấp rủi ro (Hyrum's Law với fleet nhiều service khác nhau): năm 2024 một bản nâng cấp kéo theo nghttp2 có chống rapid-reset HTTP/2, cấu hình mặc định từ chối nhầm traffic hợp lệ của một service; may bắt được trong load test QA.
- Khó làm tính năng riêng: một cách định tuyến giúp thu nhỏ máy chạy Ruby (đắt) cần tuỳ biến Envoy quá nhiều nên chưa từng làm.
Thay đổi chính
- mesh-proxy viết bằng Go, tự cài HTTP/1.1 và HTTP/2 (dùng thư viện framing HTTP/2 chính thức), nối thẳng vào service registry để discovery; có retry, hedging, rate limiting, định tuyến theo độ ưu tiên động.
- Mô hình đồng thời khác: một goroutine đọc + một goroutine ghi cho mỗi kết nối, multiplex request trên kết nối chung, nên mỗi host chỉ một kết nối (thay vì mỗi worker một kết nối). Đổi lại phải điều phối state request dùng chung giữa goroutine.
- Nối thẳng registry hiệu quả hơn xDS trong nhiều trường hợp (Envoy nhận cập nhật xDS nhiều hơn cần, tốn CPU và RAM mỗi máy).
- Rủi ro lớn nhất là không bằng Envoy về latency/CPU; kết quả sau rollout: khoảng một nửa CPU khi tải cao, latency giảm khoảng 50%, tiết kiệm khoảng 3.000 ngày latency giữa các service mỗi ngày.
- Tính năng mới làm được: cân bằng traffic đều hơn giữa replica Ruby (thêm 15–20% dư địa trước khi đợt tăng làm ngợp máy); làm lại định tuyến theo ưu tiên, hỗ trợ deploy, rate limit, chuyển traffic.
- Kiểm thử: unit, end-to-end, synthetic test trước khi deploy. Tiếp theo: phát hiện bất thường và định tuyến thông minh.
Vì sao
- Theo Stripe, mesh nội bộ đã đủ phức tạp và riêng nên tự xây lại tin cậy hơn vận hành dự án mã nguồn mở đã được kiểm chứng; điều này ngược trực giác và họ thừa nhận vậy.
Bài học cho SWE
- Mô hình threading của proxy quyết định số kết nối mà service phía sau phải chịu; chi phí ẩn tăng theo số core của cả fleet.
- Phụ thuộc lớn nâng cấp kéo theo thay đổi hành vi nhỏ; load test có traffic đúng hình dạng production là cổng cuối.
- Tự viết lại chỉ hợp lý khi đo được rủi ro chính (ở đây latency/CPU) từ sớm và có nhu cầu tuỳ biến thật.
Liên quan
- Nền tảng nội bộ cho service (đường ray chung) · Đổi ngôn ngữ và runtime
- Chiều ngược lại, chuyển sang Envoy: Dropbox 2020 · Slack 2021
#service mesh#Envoy#mesh-proxy#Go#HTTP/2#connection cardinality#worker-per-core#goroutine per connection#xDS#Hyrum's Law#priority routing#hedging
Được nhắc tới trong
Công ty (1)