The million dollar engineering problem
Bài tóm tắt Segment 2017 2. Tăng trưởng Độ khó: Trung bình
Segment · 2017 · 2. Tăng trưởng · Độ khó: Trung bình — bài gốc
Bối cảnh
- Cuối quý 3/2016: 2/3 giá vốn (COGS) của Segment là hoá đơn AWS.
- Theo Segment, chi phí hạ tầng của sản phẩm dạng infrastructure-as-a-service tăng tuyến tính theo mức dùng, không có lợi thế quy mô như SaaS thông thường: một container của họ xử lý hàng nghìn message/giây, có thể từ một khách duy nhất.
- Cloud dễ tới mức phản xạ đầu tiên với mọi vấn đề là chi thêm tiền.
Thay đổi chính
Dự án "benjamin", 3 tháng, giảm hơn 1 triệu USD/năm.
- Đọc hoá đơn từng dòng: bật AWS Detailed Billing, đổ vào Redshift để phân tích. Họ tìm ra ~15 điểm, chiếm khoảng 40% hoá đơn tháng. Nhiều điểm rất bình thường: hàng trăm ổ EBS lớn bị bỏ quên, cache và RDS cấp dư từ các lần tải tăng rồi không thu lại. Không có công cụ thần kỳ.
- DynamoDB hot shard (~300.000 USD/năm):
- Bị throttle dù đã cấp dư capacity. Thực tế tiền capacity quyết định số partition, không phải tổng throughput; một key nóng buộc phải gấp đôi capacity mà vẫn bị giới hạn ở sức của một partition.
- Heatmap của AWS (647 partition) cho thấy một partition "đỏ". Vì không có công cụ tìm hot key, họ hạ capacity để cố tình gây throttle rồi log key bị throttle.
- Thủ phạm: khách hàng test tự động hằng ngày gửi hàng trăm nghìn event cho cùng một userId kiểu
"user_id"(biến chưa được thay giá trị). - Giải pháp: chặn các key xấu, hạ capacity 4 lần. Hướng lâu dài: chuyển NSQ → Kafka để partition từ phía trên DynamoDB.
- Auto-scaling service (~60.000 USD/năm): dùng auto-scaling của ECS cho container (từ 5/2016) và cho instance. Traffic ban đêm và cuối tuần chỉ còn ~60% đỉnh; không còn phải chạy dư 2 lần.
- Bin packing (~240.000 USD/năm): chuyển ELB → ALB để container dùng port động, sau đó gom lên c4.8xlarge. Có máy chạy 100–200 container, và họ mua reserved instance (rẻ ~40%).
- Hiệu quả là mặc định: module Terraform (cluster, service, worker, auto-scaling) cho service mới tự có mọi tối ưu trên mà không cần cấu hình thêm.
Kết quả
1 triệu USD/năm; utilization trung bình tăng 20%; cùng lúc lượng API tăng 4 lần.
Vì sao
Theo Segment: biên lợi nhuận. Họ kết luận rằng với microservices, auto-scaling phổ biến là yêu cầu thực tế, vì kỹ sư thường cấp dư cho vài tháng và quản lý dung lượng cho hàng chục service bằng tay là ác mộng.
Bài học cho SWE
- Hot partition có thể do khách hàng dùng sai chứ không do thiết kế khoá, nên cần cách quan sát key nóng.
- Hiểu mô hình tính giá của managed service (capacity ↔ số partition) để biết mình thực sự trả tiền cho cái gì.
- Tối ưu chi phí một lần sẽ trôi lại sau vài tháng, trừ khi đưa nó vào "đường ray" mặc định (Terraform module). Xem Nền tảng nội bộ cho service (đường ray chung).
- Bối cảnh: cùng thời điểm Segment đang gặp chi phí vận hành của 140+ service (Segment 2018).
Liên quan
Hot partition và thundering herdChi phí hạ tầng và build vs buyNền tảng nội bộ cho service (đường ray chung)Event-driven, message queue và Kafka
Được nhắc tới trong
Chủ đề (4)
Công ty (1)
Bài tóm tắt (1)