Start here. This is the direct spoken answer to practice first.
Why this question matters
Exactly-once guarantees apply only inside a defined broker or transactional boundary. Database writes, payments, email, caches, and acknowledgements still create failure windows that application idempotency must handle.
I would ask exactly-once for what boundary. A broker may provide strong guarantees inside its own log or producer-consumer protocol, but the application still writes to databases, sends emails, calls payment providers, and updates caches. Those side effects can succeed or fail around the broker acknowledgement. I would still design handlers to be idempotent.