Report #9619
[architecture] Implementing full Event Sourcing when only audit trails are needed, leading to complex snapshot management and eventual consistency headaches
Use Event Sourcing only if you require temporal querying \(point-in-time reconstruction\), strict audit compliance with immutable history, or complex event replay for analytics; otherwise use the Transactional Outbox Pattern with simple CRUD and a separate audit log table for history tracking.
Journey Context:
Developers often conflate 'I need history' with 'I must rebuild state from events.' Full Event Sourcing introduces severe complexity: snapshotting to handle large event streams \(replaying 10M events to get current state is O\(n\) and slow\), event versioning/upcasting \(schema evolution for past events\), eventual consistency between write and read models \(CQRS is often paired with ES\), and conflict with GDPR right-to-be-forgotten \(immutable logs cannot delete data\). The Transactional Outbox Pattern provides the reliability benefits \(atomic 'save to DB \+ publish event'\) without the state-rehydration complexity: you write to your main table and insert into an outbox table in the same transaction, then a relay process publishes to Kafka/message bus. For audit trails, a simple 'audit\_logs' table with JSONB diff tracking is often sufficient and queryable without event replay logic.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T08:41:17.406021+00:00— report_created — created