Parallel Run Pattern - A Migration Technique in Microservices Architecture

Bài tóm tắt Zalando 2021 4. Điều chỉnh Độ khó: Dễ

Zalando · 2021 · 4. Điều chỉnh · Độ khó: Dễ — bài gốc

Bối cảnh

  • Ở Zalando microservices là chuẩn, nhưng theo bài: "microservice hôm qua thành monolith hôm nay". Team Returns phải tách logic trả hàng ra khỏi một monolith sắp thành legacy.
  • Vì sao test là chưa đủ: đọc code cũ dễ sót logic; có phần không có test; ứng dụng quan trọng nên không được downtime.

Thay đổi chính

Parallel Run (theo Sam Newman): gọi cả hai bản cài đặt, so sánh kết quả, nhưng chỉ một bên là nguồn sự thật (bên cũ) cho tới khi bên mới đáng tin.

  • Luồng:

    1. Monolith trả lời client ngay (không làm chậm user);
    2. sau đó POST bản sao request + response sang endpoint /consistency-checks của service mới, nhận ngay 202 (xử lý bất đồng bộ, monolith không phải chờ);
    3. service mới tự gọi endpoint thật của chính nó, so sánh với response của monolith, phát metric và log.
  • Metric theo từng endpoint (Prometheus/Grafana):

    • matched;
    • unmatched (khác status, header hoặc body);
    • failed (lỗi tạm thời 5xx, không tính).

    Mỗi endpoint có ngưỡng nhất quán riêng, vì sửa vài phần trăm cuối thường tốn hơn giá trị nó mang lại.

  • Rollout: chuyển từng endpoint qua proxy Skipper (mã nguồn mở của Zalando); rollback chỉ cần đổi proxy, không phải deploy lại.

  • Dọn dẹp: gỡ ~700 dòng code và ~1.300 dòng test của cơ chế so sánh.

Vì sao (ưu và nhược theo Zalando)

  • Ưu: test bằng dữ liệu thật; rollout và phát triển theo từng endpoint; rollback dễ; lộ cả bug của monolith; biết được hiệu năng thật của service mới trước khi chạy chính thức.
  • Nhược:
    • tải tăng (có thể gấp đôi);
    • phải tinh chỉnh phép so sánh (bỏ qua header không liên quan; PDF khác metadata; thứ tự collection khác nhau);
    • GDPR: không được lưu dữ liệu cá nhân, nên khó điều tra chỗ lệch;
    • chỉ dùng được cho endpoint idempotent;
    • tốn công dựng, không phải cách làm nhanh.

Bài học cho SWE

  • Cùng họ với shadow traffic của Grab (Grab 2016) và Scientist của GitHub (GitHub 2021). Điểm thêm của Zalando: gửi bất đồng bộ sau khi đã trả lời, nên không thêm latency cho user.
  • Đặt ngưỡng nhất quán theo từng endpoint, không đòi 100% ở mọi nơi.
  • Ràng buộc pháp lý (GDPR) cũng ảnh hưởng tới kỹ thuật migration.
  • Theo Zalando, chỉ đáng làm khi phần thay đổi có rủi ro cao.

Liên quan