Utilizing Amazon DynamoDB and AWS Lambda for Asynchronous Event Publication

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

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

Bối cảnh

  • Order Store của Zalando Payments lưu dữ liệu thanh toán theo đơn hàng trong DynamoDB, cập nhật qua REST đồng bộ; mỗi thay đổi phải phát event lên Nakadi (message bus của Zalando).
  • Ban đầu service ghi DynamoDB rồi gửi event ngay trong request, nên phụ thuộc cả DB lẫn bus. Lập luận của bài: availability của service là tích availability các dependency, 99,9% × 99,9% ≈ 99,8%.

Thay đổi chính

  • Áp transactional outbox: request chỉ ghi data store rồi trả thành công; việc phát event tách ra phía sau.
  • Không có bảng outbox riêng: DynamoDB Streams (CDC) đóng vai outbox, mỗi thay đổi item đẩy old image + new image vào stream.
  • Lambda (Python) đọc stream, dựng event gồm item sau thay đổi và một patch diff, publish lên Nakadi; retry với exponential backoff.
  • Hết retry thì event vào SQS dead letter queue; một Kubernetes CronJob chạy lại cùng code Python theo chu kỳ để gửi lại và xoá khỏi hàng đợi khi thành công.
  • Đánh đổi nêu rõ: không đảm bảo thứ tự event (event vào DLQ sẽ đến muộn).

Vì sao

  • Giảm dependency đồng bộ của request xuống còn DynamoDB để tăng availability; event chỉ cần nhất quán cuối.

Bài học cho SWE

  • Khi DB có CDC (DynamoDB Streams, logical decoding), chính change log là outbox: không cần ghi hai lần trong một transaction.
  • Đường phát event cần chỗ chứa cho lần gửi thất bại (DLQ) và cơ chế phát lại; quyết định trước consumer có chịu được event lệch thứ tự không.
  • Theo Zalando, họ đã có outbox cho PostgreSQL quản lý tập trung bằng Kubernetes operator và đang đưa bản DynamoDB thành dịch vụ chung.

Liên quan