Decision 1Log-based CDC instead of polling
Alternatives consideredScheduled polling queries; timestamp-column diffing.
WhyPolling runs repeatedly whether or not anything changed, and can miss intermediate states between runs. Reading committed changes from the database log captures every change, in commit order, without extra query load on the tables.
Decision 2CDC instead of dual writes
Alternatives consideredHave each service write to the database and publish an event.
WhyA dual write can succeed in one place and fail in the other, leaving the database and the event stream disagreeing. Capturing from the log means an event exists only if the change actually committed.
Decision 3Kafka between producers and consumers
WhyConsumers are decoupled from the source and from each other. Each tracks its own offset, so a slow or restarted service catches up instead of losing data, and new consumers can be added without touching the source.