Cho mình hỏi về việc thay đổi data trong hệ thống microservice
StackShortlist
Đã trả lời khoảng 5 giờ trước
Mình đồng ý với câu trả lời ở trên là phần trừ tiền nên làm đồng bộ trong một transaction. Bổ sung thêm cho trường hợp bạn vẫn cần gửi message sang service khác sau khi ghi DB:
- Dùng Transactional Outbox: trong cùng transaction ghi số dư, bạn insert thêm một dòng vào bảng outbox. Một worker riêng đọc bảng outbox rồi publish lên message broker. Như vậy không có chuyện DB đã ghi mà message bị mất, hoặc ngược lại.
- Phía consumer phải idempotent: mỗi giao dịch có một transaction_id duy nhất, consumer kiểm tra id đã xử lý chưa trước khi làm tiếp, vì broker thường chỉ đảm bảo at-least-once.
- Về chuyện đọc lại số dư: nếu bạn tách read model (CQRS) thì mới cần lo đọc dữ liệu cũ. Lúc đó đọc số dư của chính user vừa giao dịch từ DB chính (read-your-writes), còn các màn hình thống kê thì chấp nhận eventual consistency. Cache không nên là nguồn sự thật cho số dư.
Cảm ơn bạn đã đặt câu hỏi.
0
Tổ chức
Chưa có tổ chức nào.