ADR-0001. @nx/mq-pay được dùng như component, không phải service riêng
| Trường | Giá trị |
|---|---|
| Trạng thái | Accepted |
| Ngày | 2026-01-15 |
| Người quyết định | Phat Nguyen |
| Thay thế | - |
Bối cảnh
@nx/mq-paylà một bộ máy thanh toán đa nhà cung cấp (VNPAY, v.v.) với controller, service, repository và BullMQ worker riêng.- Chúng tôi cần tích hợp nó với phần auth, identity và scope merchant của BANA.
- Có hai lựa chọn:
- Chạy mq-pay như một microservice riêng với deployment và lớp REST riêng.
- Chạy mq-pay như một component chạy trong cùng tiến trình của
@nx/payment.
Quyết định
Dùng mq-pay như một component (MQPayComponent) được nạp bởi ApplicationPaymentComponent. @nx/payment là service được triển khai; mq-pay là code thư viện.
Payment cung cấp phần gắn kết tích hợp (credential đã mã hoá, webhook event handler, điều phối mode) và tái sử dụng controller, repo, service, worker của mq-pay thông qua đăng ký trong cùng tiến trình.
Hệ quả
| Ưu điểm | Nhược điểm |
|---|---|
| Chỉ một service để deploy / giám sát / bảo mật | Phiên bản payment và mq-pay gắn chặt với nhau |
| Chạy cùng tiến trình = độ trễ RPC bằng 0 giữa auth và mq-pay | Khó scale mq-pay độc lập như một service riêng |
| Dùng chung DB / Redis / BullMQ - không phải đo đạc hai lần | Dung lượng bộ nhớ của payment gồm cả phần mq-pay |
| Một danh mục permission Casbin duy nhất | Lỗi trong mq-pay có thể làm sập payment và việc tiếp nhận IPN |
Phương án đã cân nhắc
| Lựa chọn | Ưu điểm | Nhược điểm | Lý do từ chối |
|---|---|---|---|
Service @nx/mq-pay riêng | Scale độc lập | RPC mỗi request; hạ tầng nhân đôi | Phức tạp không đáng so với quy mô của chúng tôi |
| Nhúng thẳng code mq-pay vào payment | Một package | Mất tính tái dùng của MQ-Pay | Sai tầng - mq-pay là code tái dùng được |
Tham chiếu
src/components/payment.component.ts:76-140(thiết lập MQ-Pay)@nx/mq-pay/src/component.ts(MQPayComponent)