How We Built a Cross-Region Caching Library

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

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

Bối cảnh

  • Wix (2022): hơn 500 tỷ HTTP request và 30 tỷ event Kafka mỗi ngày, hơn 2.500 microservice ở nhiều data center.
  • Nhiều team tự viết thư viện cache nửa vời, mỗi nhóm một kiểu; team Data Streams nhận làm một giải pháp chung.
  • Yêu cầu: p99 khoảng 10 ms cho put/get hai tầng; nhất quán (cuối cùng) giữa các region; dung lượng không thành nút thắt; chịu được 10–100 lần traffic.
  • Không dùng Redis/Memcached vì bảng có thể tới hàng TB và dữ liệu cần sống lâu không TTL (ví dụ object quyền của một app), không hợp với kho trong RAM.

Lần 1: Kafka compact topic (thất bại)

Mỗi pod khi khởi động đọc compact topic từ đầu để dựng KV trong RAM. Ổn với topic nhỏ; với topic lớn, đọc lại hàng trăm nghìn event làm khởi động pod chậm vài phút, phá autoscaling. Không đạt yêu cầu "dataset tăng dần".

Lần 2: thư viện WixCache

  1. DB xuyên region: DynamoDB Global Table (replication giữa region do AWS lo, theo dõi được độ trễ replication).
  2. Thư viện cache trong pod: LRU, write-through, warm-up cấu hình được. API: Get (RAM trước, miss thì đọc DynamoDB rồi lưu), Put (ghi RAM và DB), Delete (xoá cả hai, replication xoá ở region khác), localPut (chỉ cập nhật RAM, dùng cho consumer).
  3. Cập nhật RAM ở mọi pod mọi region: chỉ replication DB thì pod ở region B vẫn trả giá trị cũ. Một sync service đọc CDC của DynamoDB qua Kinesis Data Streams và đẩy thành message Kafka nội bộ (một topic mỗi bảng); một dispatcher có bảng định tuyến bảng → topic. Pod trong region consume topic (mỗi pod một subscriber group ngẫu nhiên, nên pod nào cũng nhận) và cập nhật RAM.

Bài học cho SWE

  • Dựng cache bằng cách replay log từ đầu không scale: thời gian khởi động tăng theo dữ liệu (Cache và invalidation).
  • Invalidation xuyên region = replication DB + phát CDC tới mọi bản cache; thiếu vế sau thì region khác đọc dữ liệu cũ (Độ tin cậy và multi-region).
  • Theo Wix: đừng tối ưu bằng cache khi chưa thật cần; chỉ khi latency hoặc chi phí ở mức nguy cấp.

Liên quan