How we build the Image Gallery on trivago

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

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

Bối cảnh

  • Một pipeline ETL sinh gallery ảnh đã sắp thứ tự cho mỗi chỗ ở (theo tag nội dung và chất lượng ảnh) rồi gửi cho các đội frontend. Pipeline chạy trên AWS, rồi được chuyển sang GCP và thiết kế lại toàn bộ để thêm tính năng và độ ổn định.

Thay đổi chính

  • Chuỗi job Dataflow (Apache Beam): chụp snapshot ảnh, snapshot tag, lấy chỗ ở có ảnh đổi, dựng gallery, snapshot gallery, kiểm tra, rồi stream thay đổi qua Kafka. Dùng Flex template (image Docker) để truyền tham số động mỗi lần chạy.
  • Điều phối, ba phương án: lập lịch cách nhau một khoảng (không đoán được, phí thời gian hoặc chạy chồng), Cloud Composer (phải giữ một máy chạy cả ngày cho pipeline xong trong vài giờ), và cách được chọn: log sink bắt sự kiện job Dataflow kết thúc → Pub/Sub → Cloud Function kích job kế tiếp. Hoàn toàn serverless, đổi lại không chạy song song được.
  • Chỉ stream phần đổi (CDC): dù gallery tính lại toàn bộ khi một ảnh đổi, chỉ gửi bản ghi thay đổi bằng cách so với snapshot hôm trước (thêm, đổi thứ tự, xoá). Bẫy: chỉ tính gallery cho chỗ ở đã đổi nên phải kiểm cờ "đã đổi" trước khi sinh bản ghi xoá, không thì xoá nhầm mọi ảnh không đổi.
  • Snapshot tăng dần: snapshot ngày n = snapshot ngày m + mọi CDC từ m tới n, nên bỏ lỡ nhiều ngày vẫn dựng lại được. Chỉ lấy file tới hết hôm trước để tránh file đang ghi dở; ranh giới ngày phải gồm đúng một đầu để các snapshot khớp nhau.
  • Bẫy của Beam: khoá ghép là object JSON với thứ tự field khác nhau bị coi là khoá khác nhau; phải sinh khoá chuỗi chuẩn hoá.
  • Kiểm tra trước khi stream: thứ tự ảnh liên tục từ 1 tới N; snapshot không chứa bản ghi xoá; mọi bản ghi thay đổi trong ngày có trong snapshot. Theo trivago, kiểm tra thứ tự liên tục rất đơn giản nhưng bắt được nhiều lỗi.

Vì sao

  • Gửi toàn bộ gallery mỗi lần làm phía nhận phải xử lý lại mọi thứ; so snapshot để chỉ gửi phần đổi giữ luồng nhỏ, còn snapshot giữ khả năng dựng lại khi pipeline ngừng.

Bài học cho SWE

  • Chuyển cloud là dịp thiết kế lại, nhưng mỗi lựa chọn hạ tầng (Composer hay function) nên cân theo thời lượng chạy thật.
  • Sinh CDC bằng so snapshot cần cẩn thận với phạm vi đã tính: "không có trong lần tính" khác "đã bị xoá".
  • Một bất biến đơn giản kiểm tra trước khi xuất dữ liệu đáng giá hơn nhiều unit test.

Liên quan