Now You See Me, Now You Don't: LinkedIn's Real-Time Presence Platform

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

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

Bối cảnh

  • Chấm xanh "đang online" cho khoảng 500 triệu thành viên (2018): mỗi giây hàng nghìn người online/offline, cần phát thay đổi tới mọi kết nối đang xem.
  • Dựa trên Real-time Platform dựng năm trước cho tin nhắn: pub/sub đẩy từ server xuống client qua kết nối bền. Có kết nối nghĩa là online; người xem subscribe topic presence của người kia.

Thay đổi chính

  • Chống chập chờn: mobile hay rớt mạng ngắn (đường hầm, hầm xe). Real-time Platform phát heartbeat mỗi d giây cho mỗi kết nối. Presence Platform: không có entry còn hạn trong kho K/V → coi là vừa online, phát event online, ghi entry TTL d + ε; có entry → chỉ cập nhật thời điểm heartbeat. Rớt rồi nối lại trong d giây vẫn là online.
  • Phát hiện offline = phát hiện heartbeat vắng: mỗi member online có một delayed trigger hẹn d + 2ε giây, mỗi heartbeat đặt lại; khi trigger nổ mà entry đã hết hạn thì phát event offline.
  • Một Akka actor cho mỗi member online làm trigger: actor nhẹ nên hàng triệu cái chạy trên ít thread; số actor sống bằng số người đang online.
  • Scale ngang: state chung chỉ nằm ở kho K/V nên node nào xử lý cũng được; để không trùng trigger, D2 băm member ID để heartbeat của một người dính vào một node (best-effort). Khi deploy, chờ d + 2ε giây cho trigger chạy hết rồi mới restart.
  • Kết quả: thay đổi tới người xem dưới 200 ms ở p99; mỗi node khoảng 1.800 QPS.

Vì sao

  • Không lọc chập chờn thì vừa xấu giao diện vừa tạo lượng fan-out vô ích qua toàn backend.

Bài học cho SWE

  • Trạng thái "đang có mặt" nên suy ra từ heartbeat + TTL, và "vắng mặt" cần một timer riêng vì không có event nào báo.
  • Chọn d là đánh đổi giữa tải heartbeat và độ trễ phát hiện offline.
  • Sticky routing best-effort đủ để tránh trùng việc khi state thật nằm ở kho chung.

Liên quan