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
- Giao dịch phân tán và nhất quán xuyên service · Event-driven, message queue và Kafka
- Outbox bằng bảng trong Postgres: Clear Street 2020
#Transactional Outbox#DynamoDB Streams#AWS Lambda#Nakadi#SQS dead letter queue#Kubernetes CronJob#CDC#availability của dependency
Được nhắc tới trong
Công ty (1)