Phoenix — Tinder's Testing Platform, Part II (Levers)

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

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

Phần 2/3 của series Phoenix. Phần 1: Tinder 2019; phần 3: Tinder 2020. Đọc qua trình duyệt, raw/ chỉ là placeholder.

Bối cảnh

  • Một tính năng của app mobile đi qua PM, design, code, QA, build rồi duyệt của app store. Bất kỳ thay đổi nào sau đó (bug lọt QA, chỉnh chi tiết, muốn ra mắt đúng giờ) đều phải lặp lại cả vòng; trên mobile không thể revert rồi deploy lại như ở server.
  • Lịch phát hành tính năng và lịch phát hành app thường không khớp nhau.

Thay đổi chính

  • Remote configuration: app hỏi server lấy cấu hình thay vì nướng tham số và cờ vào binary; có thể hẹn giờ đổi cấu hình.
  • Lever là đơn vị cấu hình: định danh, kiểu (Boolean, String, Number), giá trị. Mẫu thường dùng: một Boolean Lever làm cổng chính của tính năng, các Lever khác cho tham số (chữ, màu nút, độ trễ trước khi hiện thông báo). Nghĩ về Lever trước khi viết code giúp chọn phần nào đáng thử nghiệm.
  • Config Service trên từng nền tảng (iOS, Android, Web) xử lý, lưu và cung cấp giá trị; các team nền tảng phối hợp để có cùng tính năng.
  • Manifest phía client: client khai báo mọi Lever nó đọc và kiểu của chúng; giá trị server gửi sai kiểu thì bỏ qua; mỗi Lever có giá trị dự phòng khi server không gửi (ví dụ app cũ sau khi backend đã bỏ Lever). Thêm chính sách khoá (unlocked, khoá theo session…) quy định khi nào giá trị mới có hiệu lực.
  • Tách khỏi thí nghiệm: Config Service không biết "thí nghiệm" là gì; mỗi Lever mang một định danh cho backend biết nó thuộc thí nghiệm nào, định danh này được gắn vào metric của tính năng.
  • Metric miễn phí: mỗi lần đọc Lever tự ghi lại giá trị được dùng, nên team không phải tự gắn analytics cho biến thể và phân bổ (nơi theo Tinder rất dễ sai).

Vì sao

  • Rollback một bản phát hành app vừa chậm vừa khó; rollback một thay đổi cấu hình mất vài giây (theo Tinder).
  • Code mới có thể vào nhánh chính sớm, nằm sau Lever tắt, và được làm cứng dần thay vì dồn vào cuối chu kỳ phát hành.

Bài học cho SWE

  • Với client không tự cập nhật được, cấu hình từ xa là cơ chế rollback chính; nhưng client và server lệch phiên bản là trạng thái bình thường, nên client cần manifest kiểu và giá trị mặc định. Cùng bài toán "hai phiên bản luôn cùng chạy" ở Shopify 2022.
  • Gắn đo lường vào chính đường đọc cấu hình làm dữ liệu thí nghiệm đúng mà không phụ thuộc kỷ luật của từng team.

Liên quan