Skip to content

ADR-0001. Provisioning thuế điều khiển bởi CDC với reconcile idempotent

FieldValue
StatusAccepted
Date2026-04-01
Deciderstaxation-team
Supersedes

Bối cảnh

  • Commerce sở hữu Product (gồm taxGroupId của nó); taxation không được gọi commerce đồng bộ trên mỗi lần ghi sản phẩm.
  • Thuế phải giữ nhất quán khi sản phẩm được tạo, đổi tax group, mất tax group, hoặc bị xóa.
  • Debezium đã stream thay đổi public.Product; tái dùng stream đó tránh một API contract mới.
  • Delivery at-least-once + restart consumer nghĩa là cùng một thay đổi có thể được xử lý nhiều lần.

Quyết định

Chúng tôi consume topic Debezium public.Product trong một ApplicationKafkaComponent duy nhất và route mọi thay đổi tới TaxationWorkerService.handleProductCDC, vốn reconcile thay vì áp delta: c/u/r → provision khi taxGroupId được set (ngược lại deprovision), d → deprovision. Provisioning idempotent — TaxProvisioningService skip khi một TaxSet ACTIVATED đã tồn tại với sourceType = TaxGroupsourceId khớp.

Hệ quả

ƯuNhược
Không coupling đồng bộ với commerceKhông backfill: fallbackMode: latest skip thay đổi trước offset
Reconcile tự chữa lành khi redeliverTaxSet DEACTIVATED tích lũy (không bao giờ hard-delete)
Một topic, một consumer — bề mặt tối thiểuKhông DLQ; onMessageError chỉ log
Idempotency key (sourceType, sourceId) tránh TaxSet trùngMột Snowflake worker id hardcode chặn horizontal scale

Các phương án đã cân nhắc

Phương ánƯuNhượcLý do loại bỏ
Commerce gọi taxation REST khi ghi sản phẩmTức thì, không KafkaCoupling đồng bộ; commerce phải biết taxation; phức tạp retryGhép write path; CDC đã sẵn có
Xử lý dựa-delta (chỉ áp diff)Ít việc hơn mỗi messageMong manh khi redeliver / sai thứ tựReconcile đơn giản hơn và tự chữa lành
fallbackMode: earliest + backfillBắt được dòng lịch sửReplay toàn bộ lịch sử mỗi lần reset groupNặng về vận hành; endpoint provision thủ công là đủ

Tham chiếu

  • packages/taxation/src/components/kafka/component.ts
  • packages/taxation/src/services/taxation-worker.service.ts
  • packages/taxation/src/services/tax-provisioning.service.ts:provisionForProduct
  • packages/core/src/common/kafka/topics.ts:CDCKafkaTopics.PRODUCT

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