Pick at-least-once + idempotent — the only honest answer.
Exactly-once vs At-least-once: pick at-least-once + idempotent
absorb bursts before they become outages
Outbox adds a process and table.
Exactly-once delivery is a marketing claim across most boundaries. The practical pattern is at-least-once delivery plus idempotent consumers, optionally framed by transactional outbox to avoid losing messages on producer crashes.
Network failures imply duplicates; consumers must dedupe by message_id or business key.
Outbox pattern: write business state and outbox row in same DB transaction; a separate process publishes outbox rows to broker.
Kafka transactions provide exactly-once within Kafka; cross-system, you still need idempotency.
Order created → email sent.