Phần 9: Transactional Outbox & Saga đảm bảo giao sự kiện

Khi một khách hàng bấm nút đặt hàng trên nền tảng Composable Commerce, có tới 7 sự kiện bắt buộc phải diễn ra theo chuỗi vắt ngang qua 4 service hoàn toàn độc lập: Tạo Đơn hàng (Order created) → Duyệt Thanh toán (Payment authorized) → Giữ chỗ Tồn kho (Stock reserved) → Kích hoạt Giao nhận (Fulfillment triggered) → Bắn Thông báo (Notification sent) → Cộng Điểm thưởng (Loyalty points awarded) → Tạo Mã vận đơn (Shipping label generated). Bất kỳ mắc xích nào trong số này cũng có thể đứt. Mạng có thể rớt. Database có thể sập. Một cái cổng thanh toán (payment gateway) của bên thứ ba có thể bị timeout. ...

3 tháng 6, 2026 · 18 phút · Lê Tuấn Anh
Quyết định cơ sở dữ liệu khi chuyển đổi Magento: Shared DB vs CDC vs Event Bus — So sánh Kiến trúc

Shared DB, CDC Hay Event Bus? Quyết Định Cơ Sở Dữ Liệu Khi Chuyển Đổi Monolith

🇬🇧 Read the English version of this article on tanhdev.com Answer-first: Khi chuyển đổi từ Magento sang Golang, bạn có ba chiến lược cơ sở dữ liệu (database): (A) Dùng chung DB (Shared DB) để tối ưu compute ngay lập tức, (B) CDC + Outbox để tách DB dần dần mà không cần chỉnh sửa code PHP, hoặc (C) Tách biệt hoàn toàn bằng Event Bus. Phương án A là một trạng thái chuyển giao tuyệt vời nhưng lại là một trạng thái cuối cùng thảm họa. Phương án B là con đường được khuyến nghị trong ngành công nghiệp cho hầu hết các hệ thống Magento — nó cho phép Go làm chủ schema của riêng mình và làm phẳng cấu trúc EAV mà không yêu cầu PHP Magento phải phát ra dù chỉ một sự kiện nào. Phương án C chỉ khả thi khi đội ngũ Magento của bạn có thể xây dựng và duy trì một hệ thống phát hành sự kiện (event publisher) đáng tin cậy. ...

18 tháng 7, 2026 · 17 phút · Lê Tuấn Anh

Mô Hình Saga (Saga Pattern) Trong Go — Orchestration Với Temporal & Transactional Outbox

Điều kiện tiên quyết: Đây là Phần 8 của Khóa Học System Design. Bạn nên tham khảo lại Phần 7: Thiết Kế API Kháng Lặp trước khi tìm hiểu sâu — các thao tác hoàn trả (compensating transactions) trong mô hình Saga bắt buộc phải đảm bảo tính kháng lặp (idempotency). Answer-first: Trong kiến trúc microservices và AI-Native phân tán 2026, mô hình Saga (Saga Pattern) giải quyết bài toán quản lý giao dịch phân tán (distributed transactions) xuyên suốt nhiều microservices bằng cách chia nhỏ một giao dịch lớn thành một chuỗi các giao dịch cục bộ (local transactions). Khi một bước trong chuỗi gặp sự cố, hệ thống tự động kích hoạt chuỗi các hành động hoàn trả (compensating transactions) theo thứ tự ngược lại (reverse LIFO order) để khôi phục trạng thái nhất quán của toàn bộ hệ thống. ...

18 tháng 6, 2026 · 10 phút · Lê Tuấn Anh

Chương 4: Gỡ Rối Bài Toán Dual-Write Với Transactional Outbox

← Bài trước | Series hub | Tiếp theo → Chương 4: Xóa Sổ Cơn Ác Mộng Dual-Write Ngay khi ứng dụng Golang của bạn dịch chuyển từ Monolith (kiến trúc nguyên khối) sang mô hình Event-Driven Microservices, bạn sẽ lập tức nếm mùi một cơn ác mộng kiến trúc: Vấn Đề Dual-Write (Ghi song song). 1. Vấn Đề Dual-Write Là Gì? Answer-first: Dual-Write bộc phát lúc một ứng dụng thử cố gắng vừa lưu chép xuống Database vừa thả (publish) event tới Message Broker (Kafka) cùng một lúc. Do không có vỏ bọc của một transaction phân tán (distributed transaction), chỉ một lần vấp lỗi mạng cũng đủ sức khiến hai hệ thống trên rớt nhịp đồng bộ mãi mãi. ...

9 tháng 6, 2026 · 5 phút · Lê Tuấn Anh