Skip to content

Operations

1. Deployment

Thuộc tínhGiá trị
Imageregistry/nx-seller-finance:<tag>
Container Port3000
External Port31040
Snowflake ID4
Replicas (mặc định)1 (dev) / 2+ (staging+)
Resources (req/lim)200m / 1 CPU, 512Mi / 2Gi memory
HPA targetCPU 70% (khi scale)
Migration modejob RUN_MODE=migrate trước rollout; on-boot cho dev
Live probeGET /v1/api/finance/healthz
Ready probeGET /v1/api/finance/readyz

Scale consumer vượt 1 replica sẽ trải các partition trên SVC-00040-FINANCE_CONSUMER_GROUP. Hạch toán vẫn đúng dưới concurrency vì mỗi dòng tài khoản được khóa FOR UPDATE trong khi post phiếu.

Traefik routing labels

yaml
labels:
  - "traefik.enable=true"
  - "traefik.http.routers.finance.rule=PathPrefix(`/v1/api/finance`)"
  - "traefik.http.services.finance.loadbalancer.server.port=3000"

Hạ tầng bắt buộc

DependencyTại sao
PostgreSQLDatastore chính (schema finance)
Kafka brokersBắt buộc — component throw khi boot nếu APP_ENV_KAFKA_BROKERS rỗng
RedisCache authorization + WebSocket emitter pub/sub
@nx/identity reachableJWKS verify trên mỗi JWT
@nx/commerce + DebeziumLuồng merchant CDC điều khiển đối soát tài khoản

2. Observability

SignalNguồnNơi xem
Logsstdout (IGNIS structured logger, định dạng key: %s)kubectl logs deploy/finance / Loki
HealthGET /v1/api/finance/healthz, GET /readyzGateway portal
OpenAPI live specGET /v1/api/finance/doc/openapi.jsonGateway portal explorer
MetricsTraefik gateway (Prometheus scrape)Grafana — gateway dashboard

Trường log quan trọng

TrườngNguồnGhi chú
requestIdheader X-Request-IdPropagate cross-service
merchantIdrequest scope / eventKhóa tenant
voucherNumber / voucherIdFinanceVoucherServiceVết audit hạch toán
topic / partition / offsetlog consume KafkaTọa độ replay
accountId / postingSequencetoán balanceAlert toàn vẹn

Truy vấn log hữu ích

Câu hỏiQuery
Lỗi post phiếulevel=error AND FinanceWorkerService
Sự kiện thanh toán bị skip (không có account trên payload)SKIP voucher AND finance.source.id
Replay idempotent (redeliver)finance.voucher.idempotent_replay
Tài khoản âmfinance.account.went_negative
Thiếu tài khoản kiểm soátINVENTORY/COGS control account missing

3. Security

Mối quan tâmBiện pháp
AuthNJWT (ES256, JWKS kéo từ identity); VerifierApplication
AuthZCasbin; list/count tài khoản giới hạn ở merchant mà user có GROUP policy; route single-entity gọi assertMerchantAccess (404 xuyên tenant, không phải 403)
Bí mật credentialPaymentIntegration.credential encrypted at rest; FinanceIntegrationService mask trong response
SecretsK8s Secret mount làm env (APP_ENV_DB_URL, SASL password, v.v.)
TLSKết thúc tại Nginx → Traefik → service plaintext nội bộ cluster
Network policyCilium — chỉ cho phép gateway + Kafka + Postgres + Redis + identity
Soft-deletedeletedAt trên mọi entity finance; phiếu đã issue được void (đảo), không bao giờ xóa
Toàn vẹn hạch toánKhóa FOR UPDATE theo từng tài khoản + postingSequence đơn điệu + DB partial unique index

4. Runbook

4.1 Lớp Alert

AlertTriggerCheckFixEscalate
FinanceHighErrorRate5xx >5% trong 5mkubectl logs deploy/finance | grep level=errorxác định route lỗi; rollback deploy gần đâyon-call backend
FinanceConsumerLaglag group tăngbroker consumer-group lagcheck lỗi handler (offset không commit = vòng lặp redeliver)on-call SRE
FinancePostingFailurelỗi FinanceWorkerServicegrep handler + vouchergiải quyết gốc rễ; redeliver replay sau khi fixon-call backend
FinanceMissingControlAccountlog control account missingxác nhận merchant CDC đã chạyre-emit merchant CDC hoặc tạo thủ công tài khoản INVENTORY/COGSon-call backend
FinanceAccountNegativecảnh báo went_negativereview hạch toán cho tài khoản đóđối soát qua phiếu ADJUSTMENT (overdraft được phép, không chặn)finance ops

4.2 Thao tác thường gặp

Thao tácLệnh
Tail logkubectl logs -n <ns> -f deploy/finance
Chạy migration thủ côngkubectl exec -it deploy/finance -- bun run migrate
Replay một Kafka topicreset offset SVC-00040-FINANCE_CONSUMER_GROUP; idempotency dedup các replay
Inspect ledger của một phiếuSELECT * FROM finance."FinanceTransaction" WHERE finance_voucher_id = '<id>' ORDER BY line_number
Đối soát một balancephát hành một phiếu ADJUSTMENT thủ công (reason correction / cash_count) — không bao giờ UPDATE balance trực tiếp

4.3 Kịch bản phục hồi

Kịch bảnRecovery
Handler crash giữa postHạch toán là một DB transaction → rollback; offset không commit → redeliver, replay sạch
Kafka redeliver trùngtryIdempotentReplay trả về phiếu hiện có; không post đôi
Sự kiện thanh toán không có attempt.finance.source.idINFO-skip theo thiết kế (không chọn account) — điều tra payload phía sale, không phải finance
Hạch toán saivoid phiếu (post bút toán đảo cân bằng); phiếu COGS / INVENTORY_ADJUSTMENT không void được — sửa bằng một ADJUSTMENT mới
Merchant thiếu tài khoản mặc địnhxác nhận CDC giao `op c

5. Cross-Service Runbook

Với sự cố trải nhiều service, xem runbook/ trung tâm:

6. Trang liên quan

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