ADR-0001. @nx/mq-pay được sử 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 | payment-team |
| Thay thế | — |
Bối cảnh
@nx/mq-paylà một engine 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 hệ thống auth, identity, và phạm vi merchant của BANA.
- Hai lựa chọn:
- Chạy mq-pay như một microservice riêng với deployment + bề mặt REST riêng.
- Chạy mq-pay như một component in-process của
@nx/payment.
Quyết định
Sử dụng mq-pay như một component (MQPayComponent) được load bởi ApplicationPaymentComponent. @nx/payment là service triển khai; mq-pay là code thư viện.
Payment cung cấp lớp keo tích hợp (credential mã hóa, webhook event handler, điều phối mode) và tái sử dụng controller, repo, service, worker của mq-pay qua đăng ký in-process.
Hệ quả
| Ưu điểm | Nhược điểm |
|---|---|
| Một service để deploy / monitor / secure | Phiên bản payment + mq-pay gắn chặt với nhau |
| In-process = độ trễ RPC bằng 0 giữa auth và mq-pay | Khó scale mq-pay độc lập như một service riêng |
| Chia sẻ DB / Redis / BullMQ — không double instrumentation | Memory footprint của payment bao gồm cả mq-pay |
| Một danh mục permission Casbin duy nhất | Bug trong mq-pay có thể làm sập payment + tiếp nhận IPN |
Phương án thay thế đã 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; double infrastructure | Phức tạp không đáng so với quy mô của chúng tôi |
| Nhúng code mq-pay trực tiếp vào payment | Một package | Mất tính di động của MQ-Pay | Sai layer — mq-pay có thể tái sử dụng |
Tham chiếu
src/components/payment.component.ts:76-140(setup MQ-Pay)@nx/mq-pay/src/component.ts(MQPayComponent)