Skip to content

Vận hành

1. Triển khai

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

Traefik routing labels

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

Hạ tầng yêu cầu

Phụ thuộcLý do
PostgreSQLDatastore chính (schema sale, allocation)
Kafka brokersBắt buộc — producer dùng cho thông báo downstream
RedisTùy chọn — auth cache; service vẫn start không có nó
@nx/identity đến đượcXác minh JWKS trên mỗi JWT
@nx/pricing đến đượcCheckout fail nếu không có pricing service
@nx/mq-pay đến đượcNguồn webhook — phải cùng mạng nội bộ
@nx/signal đến đượcFanout WebSocket

2. Observability

Tín hiệuNguồnTìm ở đâu
Logsstdout (IGNIS structured logger, định dạng key: %s)kubectl logs deploy/sale / Loki
HealthGET /v1/api/sale/healthz, GET /readyzGateway portal
OpenAPI live specGET /v1/api/sale/doc/openapi.jsonGateway portal explorer
MetricsTraefik gateway :30800 (Prometheus scrape)Grafana — gateway dashboard

Trường log quan trọng

TrườngNguồnGhi chú
requestIdheader X-Request-IdLan truyền liên service
userIdJWT subject
merchantIdscope request
saleOrderIdservice operationsQuan trọng cho trace
kitchenTicketItemIdflow kitchen ticket
topic / partition / offsetlog Kafka emit

Truy vấn log hữu ích

Câu hỏiTruy vấn
Webhook routing failureslevel=error AND PaymentWebhookService
Lỗi pricing service khi checkoutlevel=error AND PricingNetworkService
Order add-item lock waitsSELECT FOR UPDATE AND wait
Kitchen status mismatchKITCHEN_TICKET_ITEM_STATUS_CHANGED AND unexpected

3. Bảo mật

Mối quan tâmGiảm thiểu
AuthNJWT (ES256, JWKS lấy từ identity khi boot + theo yêu cầu)
AuthZCasbin qua PolicyDefinitionService; permission cache trong Redis (hoặc in-memory)
Trust webhook/webhooks/payment không có auth — dựa vào Cilium network policy chỉ cho phép MQ-Pay → sale
Service-to-serviceStrategy BASIC cho call liên package
SecretsK8s Secret mount như env (APP_ENV_DB_URL, APP_ENV_KAFKA_SASL_PASSWORD, v.v.)
TLSKết thúc tại Nginx → Traefik → service plaintext (intra-cluster)
Rate limitMiddleware Traefik (mặc định 100 rps/IP); endpoint webhook có thể có quota riêng
Network policyCilium — chỉ cho phép gateway + Kafka + Postgres + Redis + identity + pricing + MQ-Pay
Soft-deletedeletedAt trên tất cả thực thể sale; archive thay vì hard-delete
Bảo vệ raceSELECT ... FOR UPDATE trên row order khi add-item, checkout, merge, split

4. Runbook

4.1 Phân loại Alert

AlertTriggerKiểm traSửaEscalate
SaleHighErrorRate5xx >5% trong 5mkubectl logs deploy/sale | grep level=errorxác định endpoint lỗi; rollback deploy gần nhất nếu vừa diễn raon-call backend
SaleWebhookFailureswebhook 5xx errors tănggrep PaymentWebhookControllerkiểm tra schema drift của payload; kiểm tra trạng thái sister-serviceon-call backend + payment team
SaleCheckoutFailuresspike /checkout 4xx/5xxgrep PricingNetworkService; kiểm tra health pricing servicerestart pricing svc; tăng replica pricingon-call backend
SaleKafkaProduceFailurelog error KafkaProducerbun -e 'cluster status'kiểm tra health broker, SASL credson-call SRE
SaleStuckOrderorder ở PROCESSING >1hDB query WHERE status='PROCESSING' AND processingAt < now() - interval '1h'kiểm tra MQ-Pay attempts; hủy thủ công nếu cũon-call backend
SaleSessionLeakopen PosSession per device >24hDB queryđóng thủ công + đối chiếuon-call ops
SaleAllocationStuckAllocationUsage.ACTIVE >24h sau hủyDB querycascade hủy thủ côngon-call backend

4.2 Thao tác phổ biến

Thao tácLệnh
Tail logkubectl logs -n <ns> -f deploy/sale
Chạy migration thủ côngkubectl exec -it deploy/sale -- bun run migrate
Chuyển trạng thái order kẹt thủ côngDB UPDATE (sau backup) — yêu cầu phê duyệt senior
Replay sự kiện webhookTrigger MQ-Pay redelivery qua admin API của nó
Kiểm tra subscriber WebSocketAdmin panel @nx/signal
Audit lý do hủySELECT cancellationReason, count(*) FROM "SaleOrder" WHERE cancelledAt > ... GROUP BY 1

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

Kịch bảnPhục hồi
Service crash giữa checkoutOrder vẫn DRAFT (transaction rollback); UI prompt retry
Webhook đã đến nhưng Kafka emit fail_enqueuePaymentSuccess log lỗi; tool replay thủ công publish từ snapshot order. Inventory chưa bị trừ cho đến khi replay.
Webhook redelivery duplicateIdempotency handler: skip no-op nếu order đã ở status target
Kẹt PROCESSING sau timeout MQ-PayHủy thủ công → status CANCELLED → AllocationUsage hủy theo
Tổng sai sau merge/splitDùng jsonb transferHistory trên SaleOrderItem để audit; rollback qua OrderMergeService.rollback hoặc op ngược của OrderSplitService
Mất POS sessioncloseRecountCount theo dõi số lần đếm lại; đóng thủ công + đối chiếu

5. Cross-Service Runbook

Cho 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.