Building a dynamic and responsive Pinterest

Bài tóm tắt Pinterest 2018 3. Quy mô lớn Độ khó: Nâng cao

Pinterest · 2018 · 3. Quy mô lớn · Độ khó: Nâng cao — bài gốc

Bối cảnh

  • 2015: phần lớn nội dung được sinh sẵn cho user trước khi họ đăng nhập, lưu tĩnh trong HBase. Kiến trúc này đưa Pinterest tới 100 triệu MAU.
  • Điểm yếu: khó thử nghiệm; feature dùng để xếp hạng có thể cũ hàng tuần; không dùng được hành động realtime; phải sinh và lưu nội dung cho mọi user, kể cả người không quay lại, và cho mọi thí nghiệm, nên chi phí lưu trữ rất lớn.
  • Following feed năm 2015 = fan-out lúc ghi: khi một Pin được lưu, job bất đồng bộ (Pinlater) lấy mọi follower từ MySQL, chấm điểm Pin cho từng follower, ghi (follower, điểm, Pin) vào HBase. Khi user vào, quét HBase theo tiền tố user id.

Thay đổi chính

Xây 9 hệ thống mới để chuyển sang sinh nội dung lúc đọc (dynamic):

  • Following feed mới:
    • Apiary: user → các board đang theo, cập nhật realtime;
    • Polaris: board → Pin, lọc bằng bloom filter (Pin đã xem) và chấm điểm nhẹ;
    • Aperture: lịch sử impression của user tới vài tháng, p99 một chữ số ms;
    • RealPin: tín hiệu realtime của user;
    • Scorpion: nền tảng xếp hạng ML online thống nhất, tách compute khỏi storage, cache feature tĩnh trên node, shard để cache hit trên 90%;
    • Feed Generator gọi đồng thời các hệ trên.
  • Interest feed và "Picked For You" đi cùng hướng (thay job hằng ngày bằng sinh lúc đọc); thêm Pixie (random walk trên đồ thị board–Pin nằm trong RAM) cho gợi ý realtime.
  • Công nghệ: lúc đó backend chủ yếu Java, chưa có hệ thống C++ nào. Họ chọn C++11, FBThrift, Folly, RocksDB vì cần tail latency thấp với fan-out lớn (có lúc tới mọi shard) và nhiều hệ nặng CPU. Đầu tư ban đầu chậm (phải dựng thư viện nền, build/release) nhưng về sau đáng.
  • Rocksplicator: replication cho RocksDB (từ ghi vào mọi replica sang master-slave) + thư viện route nhận biết AZ để giảm traffic xuyên AZ (tốn tiền trên AWS); đặt TCP_USER_TIMEOUT để fail nhanh (mặc định TCP có thể mất hơn 10 phút mới báo khi máy bên kia chết); tích hợp Apache Helix để quản lý cluster. Các hệ này chiếm hơn 10% instance AWS của Pinterest.
  • Tinh chỉnh:
    • counter service trả hàng chục nghìn số đếm mỗi request với p99 dưới 20ms (RocksDB plain table như hash table trong RAM, float16, tự mã hoá nhị phân);
    • Scorpion: cache LRU zero-copy, chấm điểm theo lô để dùng SIMD, xếp cây GBDT cho cache CPU, chặn thundering herd khi cache miss bằng đồng bộ ở mức object.

Bài học cho SWE

  • Fan-out lúc ghi (sinh sẵn) và sinh lúc đọc là một đánh đổi: sinh sẵn đọc rẻ, nhưng tốn lưu trữ cho cả user không quay lại và khó thử nghiệm; sinh lúc đọc tươi hơn, linh hoạt hơn, nhưng cần hạ tầng latency cực thấp. Đây là câu trả lời một phần cho câu hỏi "fan-out-on-write hay on-read" trong Realtime và fan-out.
  • Đổi ngôn ngữ cho đúng loại hệ thống (Java → C++ cho hệ tail-latency thấp, nặng CPU), có chi phí khởi đầu. Xem Đổi ngôn ngữ và runtime.
  • Traffic xuyên AZ là chi phí thật trên cloud, nên route theo AZ. Xem Chi phí hạ tầng và build vs buy.

Liên quan