Operations
1. Triển khai
| Thuộc tính | Giá trị |
|---|---|
| Image | registry/pricing:<tag> |
| Container Port | 3000 (ngoài 31070) |
| Probes | GET /healthz (live), GET /readyz (ready) |
| Snowflake ID | 7 (APP_ENV_NODE_ID) |
| Run modes | api (REST + CDC consumer lúc boot) · migrate (seed chạy một lần) |
| Phụ thuộc lúc boot | PostgreSQL (schema pricing), Redis (auth cache), Kafka (binding throw nếu APP_ENV_KAFKA_BROKERS rỗng) |
Kafka là phụ thuộc boot cứng:
ApplicationKafkaComponent.binding()throwInternalServerErrornếu brokers chưa đặt, dù pricing chỉ consume (không produce). Một pod không có broker tới được sẽ không start.
Traefik labels
yaml
labels:
- "traefik.enable=true"
- "traefik.http.routers.pricing.rule=PathPrefix(`/v1/api/pricing`)"
- "traefik.http.services.pricing.loadbalancer.server.port=3000"2. Observability
| Tín hiệu | Nguồn | Xem ở đâu |
|---|---|---|
| Logs | stdout (key-value có cấu trúc IGNIS) | kubectl logs <pod> / Loki |
| Health | GET /healthz, GET /readyz | Portal gateway |
| OpenAPI | GET /doc (Scalar), /doc/openapi.json | API explorer trực tiếp |
Marker log chính
| Marker | Nguồn | Ý nghĩa |
|---|---|---|
SKIP — FareSet already exists | PricingWorkerService | Trúng idempotency CDC (kỳ vọng khi replay RETRIEVE) |
DONE FareSet + SALE Fare seeded via CDC | PricingWorkerService | Variant mới được định giá |
DONE FBT override seeded | PricingWorkerService | Tạo FBT override child fare |
Received message | Topic: %s | ApplicationKafkaComponent | Nạp message CDC |
Unknown topic — subscribed but no handler | ApplicationKafkaComponent | Subscription sai cấu hình |
3. Bảo mật
| Mối quan tâm | Giảm thiểu |
|---|---|
| AuthN | JWT (ES256, JWKS từ identity); BASIC cho service-to-service (sale → pricing) |
| AuthZ | Casbin qua PolicyDefinition; theo resource mỗi controller; cache trong Redis |
| Secrets | K8s Secret mount như env (DB URL, Kafka SASL, basic-auth) |
| TLS | Kết thúc tại gateway; Kafka SASL tuỳ chọn |
| Network policy | Cilium — chỉ cho gateway + sale + Kafka + Postgres + Redis |
| Soft-delete | deletedAt — mặc định không hard-delete |
4. Runbook
4.1 Lớp cảnh báo
| Cảnh báo | Kích hoạt | Kiểm tra | Khắc phục | Leo thang |
|---|---|---|---|---|
pricingHighErrorRate | 5xx >5% trong 5m | logs level=error | xem lỗi calculator / khả năng tới DB | backend on-call |
pricingCheckoutRejects | tăng vọt 4xx trên /simulation* | logs cho "no active fare set" | xác nhận CDC worker đang seed FareSet | backend on-call |
pricingCdcStalled | offset CDC không tiến | khả năng tới broker + lag consumer group | restart pod / kiểm Debezium | SRE on-call |
pricingBootCrashLoop | pod restart | logs Cannot start Kafka — env ... empty | đặt APP_ENV_KAFKA_BROKERS | SRE on-call |
4.2 Thao tác thường gặp
| Thao tác | Lệnh / hành động |
|---|---|
| Tail logs | kubectl logs -n <ns> -f deploy/pricing |
| Re-seed fare của một variant | Re-emit hàng ProductVariant của nó (CDC RETRIEVE) — worker idempotent |
| Xem fare thắng | POST /simulation-v2/calculate với variant + context; đọc fareSource trên applied-rule PRICE |
| Chạy migration thủ công | bun run migrate (trong pod) — seed permissions + role-permissions |
| Xác minh tiêu thụ CDC | Kiểm lag consumer group cho PRICING_CONSUMER_GROUP trên PRODUCT_VARIANT |
Ghi DB / migration do operator chạy. Chẩn đoán read-only qua endpoint calculate.
5. Trang liên quan
- Configuration
/runbook/— runbook trung tâm cho sự cố xuyên service- Decisions