How Discord Reduced Websocket Traffic by 40%

Bài tóm tắt Discord 2024 3. Quy mô lớn Độ khó: Trung bình

Discord · 2024 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc

Bối cảnh

  • Client nhận cập nhật realtime qua service "gateway" (Elixir), nén bằng zlib từ cuối 2017 (nhỏ hơn 2–10 lần). Lần thử zstandard năm 2019 (chỉ desktop) tốn RAM quá nên bỏ.
  • Mục tiêu 2024: giảm băng thông client, nhất là mobile.

Thay đổi chính

  • Dark launch: nén một phần nhỏ traffic production bằng cả zlib lẫn zstandard, ghi metric rồi bỏ dữ liệu zstandard. Tránh phải đợi khoảng một tháng để client các nền tảng hỗ trợ trước khi biết kết quả.
  • Kết quả đầu tệ hơn zlib (MESSAGE_CREATE khoảng 250 byte với zlib, hơn 750 byte với zstd) vì zlib nén streaming (giữ ngữ cảnh suốt kết nối) còn zstd nén từng message nhỏ. Fork thư viện ezstd thêm streaming (đóng góp ngược upstream): tỉ lệ nén từ 6 lên gần 10, payload 270 → 166 byte, thời gian nén mỗi byte thấp hơn zlib.
  • Tinh chỉnh tham số (level 6, chainlog/hashlog 16, windowlog 18) vẫn vừa bộ nhớ một node gateway.
  • Dictionary (train từ 120.000 message đã ẩn danh, hai bộ cho JSON và ETF): lợi rõ với payload rất nhỏ nhưng production cho kết quả lẫn lộn, có loại còn tệ hơn; bỏ vì độ phức tạp ở server lẫn client không đáng.
  • Nâng buffer giờ thấp điểm bằng vòng phản hồi theo bộ nhớ từng node: chỉ đạt tỉ lệ nâng khoảng 30% (mong 70%) vì phân mảnh bộ nhớ của allocator BEAM; chỉnh allocator tốn công nên gỡ bỏ.
  • Rollout zstd cho cả desktop và mobile sau experiment (để rollback nhanh, kiểm kết quả, theo dõi metric nền). Phải tự viết binding cho iOS.
  • Metric từ dark launch lộ ra PASSIVE_UPDATE_V1 chiếm hơn 30% băng thông gateway dù chỉ khoảng 2% số dispatch, vì gửi lại toàn bộ danh sách khi một phần tử đổi. V2 chỉ gửi delta: từ 35% xuống 5% băng thông gateway.
  • Tổng: giảm gần 40% băng thông gateway (1–8/2024).

Vì sao

  • Kết nối gateway sống lâu nên autoscale theo giờ không hiệu quả; tài nguyên thừa giờ thấp điểm là lý do thử nâng buffer.

Bài học cho SWE

  • Dark launch so hai thuật toán trên traffic thật trước khi đụng tới client, vòng lặp tính bằng ngày thay vì tuần.
  • Thông tin ngữ cảnh (streaming) quan trọng hơn thuật toán khi message nhỏ.
  • Dám gỡ tối ưu có lợi nhỏ mà thêm phức tạp (dictionary, buffer động).
  • Instrumentation cho dự án này tìm ra một khoản tiết kiệm lớn ở chỗ khác (snapshot → delta).

Liên quan