Skip to content

ADR-0002. Một sản phẩm triển khai, tách thành role api và worker lúc runtime

TrườngGiá trị
StatusAccepted
Date2026-03-30
DecidersPhat Nguyen
Supersedes-

Bối cảnh

  • Phần REST (đưa vào hàng đợi, vòng đời, tải về) và pipeline sinh sổ nặng nề có nhu cầu tài nguyên cũng như cách mở rộng rất khác nhau.
  • Gói mọi thứ vào mọi bản chạy sẽ lãng phí CPU trên pod API và buộc ingress phải gắn chặt với năng lực render.
  • Tách thành hai package riêng lại nhân đôi schema, phần đấu nối DI và hạ tầng triển khai.

Quyết định

Chúng ta sẽ phát hành một image duy nhất và chọn hành vi lúc khởi động bằng APP_ENV_APPLICATION_ROLES (chuỗi CSV gồm api, worker; nếu không hợp lệ hoặc rỗng thì mặc định bật cả hai). configureControllers() chỉ đăng ký controller cho api; configureServices()/configureComponents() chỉ đăng ký pipeline worker (LedgerWorkerService, các generator), bộ phát WebSocket và lượt quét khôi phục cho worker. Kafka consumer và component khôi phục được đăng ký vô điều kiện nhưng tự bỏ qua chính nó khi không có role worker.

Hệ quả

ƯuNhược
Mở rộng API và worker độc lậpViệc phân luồng theo role nằm rải rác qua application.ts + các component
Một image, một artifact CI, dùng chung schema/DINếu APP_ENV_APPLICATION_ROLES cấu hình sai thì âm thầm bật lại cả hai
Pod chỉ chạy worker không cần ingressPhải kiểm tra role ở hai nơi (lúc đăng ký + lúc component tự bỏ qua)

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

Phương ánƯuNhượcVì sao loại
Hai package riêngCô lập triệt đểNhân đôi schema/DI, triển khai gấp đôiQuá nhiều trùng lặp cho một bounded context
Luôn chạy cả hai role trên mỗi bảnCấu hình đơn giản nhấtLãng phí CPU trên pod API; mở rộng bị gắn chặtĐánh mất ý nghĩa của việc tách role
Feature flag cho từng componentĐiều khiển chi tiếtSố lượng tổ hợp cấu hình bùng nổHai role thô đã bao trùm mọi topology thực tế

Tham chiếu

  • ledger/src/common/roles.ts (getAppRoles)
  • ledger/src/application.ts (configureComponents/Services/Controllers)
  • ledger/src/components/kafka.component.ts, recovery.component.ts (tự bỏ qua)
  • Configuration

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