API Events
Bề mặt async duy nhất là một CDC consumer. Không có Kafka producer, BullMQ queue, hay WebSocket emission.
1. Inbound — Kafka
| Topic | Producer | Handler | Idempotency Key | Failure Mode |
|---|---|---|---|---|
public.Product (CDCKafkaTopics.PRODUCT) | Debezium (commerce) | TaxationWorkerService.handleProductCDC | (productId, taxGroupId, op) — provision idempotent | log + skip (autocommit; không DLQ) |
Config consumer (ApplicationKafkaComponent):
| Setting | Giá trị |
|---|---|
| Client ID | APP_ENV_KAFKA_CLIENT_ID (mặc định SVC-00130-TAXATION_CONSUMER) |
| Group ID | APP_ENV_KAFKA_GROUP_ID (mặc định SVC-00130-TAXATION_CONSUMER_GROUP) |
| Key deserializer | stringDeserializer |
| Value deserializer | jsonDeserializer |
fallbackMode | latest (không backfill lịch sử) |
autocommit | true |
requestTimeout / connectTimeout / maxWaitTime | 60000 / 30000 / 5000 ms |
Route theo op:
Debezium op | Action |
|---|---|
c, u, r | _reconcileTaxProvisions(after) |
d | deprovisionForProduct(before.id ?? after.id) |
| other | bỏ qua |
Nhánh reconcile (c/u/r):
| State sản phẩm | Action |
|---|---|
deletedAt set | deprovision |
không có taxGroupId | deprovision |
có taxGroupId | provision (idempotent) |
2. Outbound — Kafka
Không. Taxation không tạo event. Các dòng
TaxSet/Taxđã provision được pricing đọc trực tiếp từ shared DB.
3. Inbound — BullMQ
Không.
4. Outbound — BullMQ
Không.
5. WebSocket Emissions
Không.
6. Payload Schemas
Payload inbound là một Debezium envelope quanh một dòng
Product. Type từ@nx/core(TDebeziumMessage,TDebeziumPayload,TProductPgRow). Key dòng snake_case được convert quatoCamelCaseKeystrước khi dùng.
ts
// CDCKafkaTopics.PRODUCT — message.value
interface TDebeziumMessage<TProductPgRow> {
payload: TDebeziumPayload<TProductPgRow>;
}
interface TDebeziumPayload<T> {
op: 'c' | 'u' | 'r' | 'd';
before: T | null; // snake_case
after: T | null; // snake_case
}
// Các trường worker đọc (sau toCamelCaseKeys):
// id: string
// taxGroupId: string | null
// deletedAt: string | null7. Idempotency & Ordering
| Topic | Delivery | Ordering | Recovery |
|---|---|---|---|
public.Product | at-least-once (autocommit) | per-partition (theo từng product key) | re-deliver replay reconcile; provision skip khi đã provision với cùng TaxGroup |
Không DLQ:
onMessageErrorchỉ log.fallbackMode: latestnghĩa là các dòng thay đổi khi consumer down trước cửa sổ offset không được reprocess — không có backfill job (ADR-0001).