Skip to content

ADR-0002. Triển khai theo Mode (FULL / API / WORKER)

TrườngGiá trị
Trạng tháiAccepted
Ngày2026-02-05
Người quyết địnhpayment-team, SRE
Thay thế

Bối cảnh

  • Service payment xử lý hai khối lượng công việc khác nhau:
    1. Tiếp nhận REST + IPN — đồng bộ, nhạy cảm về độ trễ, scale theo lưu lượng nhà cung cấp.
    2. BullMQ worker — bất đồng bộ (scheduler + confirmation), scale theo độ sâu queue.
  • Chạy cả hai trong một process hạn chế khả năng scale độc lập và khuếch đại bán kính sự cố crash.
  • Tuy nhiên, môi trường dev cần mọi thứ trong một pod.

Quyết định

Một image, ba mode triển khai chọn qua APP_ENV_MQ_PAY_MODE:

ModeControllersQueue producerWorkersTrường hợp sử dụng
FULL (mặc định)Dev — single pod
APITier REST production — scale theo tốc độ request
WORKERTier worker production — scale theo độ sâu queue

Mẫu production: 1× API + N× WORKER. Mỗi pod WORKER phải có APP_ENV_NODE_ID duy nhất (Snowflake worker ID = 91, 92, …).

Hệ quả

Ưu điểmNhược điểm
REST và worker scale độc lậpBa manifest triển khai cần duy trì
Worker crash không làm sập APIYêu cầu khóa mã hóa chia sẻ (APP_ENV_APPLICATION_SECRET)
Dev vẫn dùng single pod (FULL)Pod WORKER cần snowflake ID duy nhất — dễ sai sót
Topology chuẩn "API + worker"Mode mismatch có thể gây dead queue âm thầm

Phương án thay thế đã cân nhắc

Lựa chọnƯu điểmNhược điểmLý do từ chối
Một mode duy nhất (luôn full)Vận hành đơn giản hơnKhông thể scale REST và worker độc lậpSai tradeoff cho production
Tách image API và WORKERRanh giới rõ ràngPhức tạp build pipeline; rủi ro image driftSingle-image-multi-mode là tiêu chuẩn ngành
Worker stateless không có BullMQKhông phụ thuộc RedisKhông có retry / scheduler / persistencemq-pay cần ngữ nghĩa queue

Tham chiếu

  • @nx/mq-pay/src/common/constants.ts:11-14 (MQPayRunModes)
  • @nx/mq-pay/src/component.ts:437-444 (xác minh mode)
  • src/components/payment.component.ts:124-125 (giải quyết mode)

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.