Our Evolution Towards T-REX: The Prehistory of Experimentation Infrastructure at LinkedIn

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

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

Bài đầu của series về lịch sử nền tảng thí nghiệm của LinkedIn (tên cũ: LiX, XLNT); các phần sau (engine nhanh 20 lần, pipeline phân tích) chưa ingest.

Bối cảnh

  • 2020: T-REX (Targeting, Ramping, and Experimentation) phục vụ tới 41.000 A/B test cùng lúc trên hơn 700 triệu thành viên; gồm targeting, cấu hình động, hạ tầng thí nghiệm, pipeline báo cáo, thông báo, UI.
  • Ba lực đẩy: công ty lớn nhanh, dữ liệu tăng theo cấp số nhân, và văn hoá đổi sang coi thí nghiệm là một phần của quy trình phát hành.

Thay đổi chính

  • "Thời đồ đá" (khoảng 2009): member chia vào 1.000 bucket bằng member_id mod 1000; muốn chạy test phải xin một dải bucket không trùng ai, qua email (độ phức tạp O(số test²) vì mỗi chủ test phải nói chuyện với mọi chủ test khác); định nghĩa test rải khắp codebase; bật một test cho một service mất hàng giờ vì phải sửa config và deploy; báo cáo tính tay bằng spreadsheet hoặc R. Gán bucket theo modulo không phải ngẫu nhiên đúng nghĩa nên kết quả có thể sai.
  • Khoảng 2010: thiết kế lại từ đầu. Tách hai khái niệm: test (một giả thuyết hay một tính năng, là interface giữa ứng dụng và nền tảng) và experiment (một bậc của test với một phân bổ cụ thể, bất biến; ramp 5% → 25% → 50% → 100% là bốn experiment). Ứng dụng chỉ evaluate test, không evaluate experiment, nên ramp không cần đổi code.
  • Quản lý test tập trung qua UI; độ trễ deploy một experiment dưới 5 phút, nên ramp dần và đo ở mỗi bậc trở thành cách phát hành bình thường. Targeting thành chức năng của nền tảng, tách khỏi logic nghiệp vụ; viết bằng Lix DSL.
  • Đến 2013: thực thi nhiều tầng cache. Thư viện client evaluate cục bộ bằng cache trong bộ nhớ (hit 98–99%); thiếu thì hỏi backend thí nghiệm (cache hit 93%+); thiếu nữa thì backend đọc thuộc tính từ kho key-value Venice. Kết quả: dưới 0,2% lần evaluate chạm storage, dưới 2% cần gọi mạng.

Vì sao

  • Cấp phát bucket bằng con người không scale theo số test; deploy config cho mỗi test làm thí nghiệm đắt tới mức người ta né.
  • Theo LinkedIn: tách test (thứ ứng dụng thấy) khỏi experiment (trạng thái phát hành) là quyết định nền tảng cho phép ramp và targeting mà không đổi code.

Bài học cho SWE

  • Tài nguyên dùng chung (bucket người dùng) mà cấp phát bằng thoả thuận giữa người thì chi phí tăng theo bình phương; phải có một nơi cấp phát tập trung.
  • Đặt trạng thái phát hành ngoài code (một bản ghi bất biến cho mỗi bậc ramp) để thí nghiệm và rollout dùng chung một cơ chế.
  • Lời gọi evaluate nằm trên đường request của mọi service nên phải gần như cục bộ: cache nhiều tầng, chỉ một phần rất nhỏ đi qua mạng.

Liên quan