What Is At-Most-Once Delivery in Kafka?
A beginner-friendly guide to the delivery promise that never repeats an event but may lose one: how it happens on the producer and consumer sides, when it is a smart choice, and when it quietly becomes a costly mistake.
Imagine a postman who is told: “Never deliver the same letter twice, no matter what.” To follow this rule, the postman ticks a letter off his list the moment he picks it up, before walking to the house. If he trips on the way and drops the letter in a puddle, the letter is lost, but at least nobody ever receives a duplicate. Some businesses are happy with this rule. A weather station that sends a temperature every second does not mind losing one reading, because another arrives a second later. A bank sending a payment instruction would be horrified. In Apache Kafka, this “never twice, but maybe never” promise is called at-most-once delivery. This guide explains what it means, how it arises, and how to decide whether it suits your data.
1Why Delivery Guarantees Exist
Before meeting at-most-once, we need to see the problem that delivery guarantees solve.
Kafka in a nutshell
Apache Kafka stores streams of events, such as orders, payments, clicks, or sensor readings, in topics. Producers are the applications that write events, and consumers are the applications that read them. Between them sit the Kafka servers, called brokers, which store and copy the events safely.
Failures are normal
In any real system, things go wrong. A network cable is unplugged. A broker restarts. A producer crashes in the middle of sending. A consumer is killed by its host after reading an event but before finishing its work. When something fails at the wrong moment, the two sides may disagree about what has happened. Did the broker receive the event? Did the consumer finish processing it? Nobody knows for sure.
Two ways to react to doubt
When in doubt, a system can choose between two natural reactions. It can try again, which risks doing the same thing twice. Or it can give up, which risks doing the thing zero times. Delivery guarantees are the names for these choices, and Kafka lets you choose on purpose.
You send an important text message and see no reply. You can send it again, which might annoy the receiver if the first one arrived after all. Or you can decide the first one was enough and move on, which might leave them never knowing. Delivery guarantees are the rules for what to do in that moment of doubt.
There are three classic guarantees: at-most-once, at-least-once, and exactly-once. Understanding all three side by side is the fastest way to understand each of them.
2What Is At-Most-Once?
At-most-once means each event is delivered zero times or one time, never more than once.
The simple definition
Under at-most-once delivery, the system never repeats an event. If everything goes well, the event is delivered once. If something goes wrong at the wrong moment, the event may not be delivered at all, and the system does not try again. Duplicates are impossible, but loss is possible.
The three guarantees side by side
| Guarantee | Can an Event Be Lost? | Can an Event Be Repeated? | Main Idea |
|---|---|---|---|
| At-most-once | Yes | No | Never retry; prefer loss to duplicates |
| At-least-once | No | Yes | Always retry; prefer duplicates to loss |
| Exactly-once | No | No visible duplicates | Retry safely so the effect happens once |
What the name really says
The words are literal. “At most once” means the number of deliveries is at most one: it could be one, and it could be zero, but it can never be two. Compare this with “at least once”, where the count is one or more, and “exactly once”, where the count is precisely one.
Think of a lottery ticket that can be used only once. If you scratch it and it is torn, you cannot use it again, so you might miss a prize, but nobody can win twice with the same ticket. The ticket is at-most-once: never twice, sometimes not at all.
Reading “at most once” as “once, guaranteed”. It is not a promise of delivery. It is a promise of no repeats, and the price is that some events may silently vanish.
3Two Places Where It Can Happen
An event’s journey has two legs, and at-most-once behaviour can appear on either.
Leg one: producer to Kafka
The producer sends an event to the broker. If the send fails or the confirmation is lost, the producer must decide whether to retry. A producer that never retries, or that never waits for confirmation, behaves at-most-once on this leg.
Leg two: Kafka to consumer
The consumer reads the event and processes it, and saves its bookmark, called the committed offset, which records how far it has read. The order of “process” and “save the bookmark” decides the guarantee on this leg. Saving the bookmark first and processing afterwards behaves at-most-once.
flowchart LR
P["Producer"] -->|"Leg 1: send and confirm"| K["Kafka Cluster"]
K -->|"Leg 2: fetch, process, commit bookmark"| C["Consumer"]
The overall guarantee is the weakest leg
The guarantee of the whole journey is only as strong as its weakest leg. If the producer leg is at-least-once but the consumer leg is at-most-once, then events may still be lost between reading and processing. Likewise, if the producer loses events, no consumer setting can bring them back. To claim a guarantee for a pipeline, both legs must support it.
A relay race is only as safe as its riskiest baton hand-over. If the runners are careful in the first hand-over but careless in the second, the baton can still be dropped. Each hand-over needs its own rule.
When people say “this Kafka pipeline is at-most-once”, ask which leg they mean. It may be the producer, the consumer, or both.
4At-Most-Once on the Producer Side
A producer becomes at-most-once when it sends an event and never checks or never repeats.
Fire and forget with no confirmation
A producer can be set to wait for no confirmation at all. It hands the event to the network and moves on immediately. It never learns whether the broker received it. If the broker was down, the network dropped the packet, or the leader changed at that moment, the event is gone, and the producer has no idea. This is the fastest but riskiest setting.
Confirmation from the leader only
A producer can wait until the leader broker has written the event, but not until the followers have copied it. This is safer, but if the leader fails just after confirming and before the followers copy the event, the event can be lost when a follower becomes the new leader. Loss is possible, though less likely than with no confirmation.
Retries turned off
Even with strong confirmations, a producer that is told never to retry will give up on the first failure. Because it never resends, it cannot create duplicates, but any temporary hiccup, such as a leader election lasting a second, causes the event to be dropped and reported as failed. If the application ignores that failure report, the event is lost silently.
| Producer Setup | Behaviour | Guarantee |
|---|---|---|
| No confirmation, no retries | Sends and forgets; failures are invisible | At-most-once, with a high chance of loss |
| Leader confirmation, retries off | Failures are reported but not retried | At-most-once, with smaller chance of loss |
| Full confirmation, retries off | Safe writes, but temporary errors drop the event | At-most-once in effect, since no resend happens |
| Full confirmation, retries on, duplicate protection on | Resends safely after trouble | Strong: no loss and no duplicates within a partition |
sequenceDiagram
participant P as Producer
participant L as Leader Broker
P->>L: Send event
Note over P,L: Network drops the event
Note over P: Producer expects no confirmation, does not retry
Note over L: Event was never stored
Dropping a letter into a street postbox without a tracking number is fire and forget. If the postbox is full or the van crashes, you never find out. Sending by registered post costs more and takes longer, but you know about problems and can send again.
Believing that modern Kafka always protects you. Kafka’s client defaults have grown safer over time, but any team that lowers confirmation levels or disables retries can move a producer back into at-most-once behaviour without noticing.
5At-Most-Once on the Consumer Side
On the reading side, the order of two small actions decides everything.
The two actions
A consumer reads a batch of events, then does two things: it processes the events, for example by saving them to a database or sending an email, and it commits its offset, which saves the bookmark in Kafka. If the consumer crashes, a replacement starts from the last committed bookmark.
Commit first, process later
If the consumer commits the bookmark first and processes afterwards, a crash between the two steps leaves Kafka believing the events are done, even though they were never processed. The replacement consumer starts after them and never sees them again. The events are lost as far as this application is concerned. This is at-most-once on the consumer side.
The consumer fetches a batch
It receives events with offsets 100 to 109.
It commits the bookmark first
Kafka now records that the group has finished up to offset 109, and the next event to read is 110.
It starts processing
The consumer begins to save the events to a database, one by one.
It crashes halfway
Only offsets 100 to 104 have been processed. Offsets 105 to 109 were never handled.
A replacement starts
It reads the bookmark, sees 109, and begins at offset 110. Events 105 to 109 are lost for this application, and no duplicates were ever created.
sequenceDiagram
participant C as Consumer
participant K as Kafka
participant D as Database
K-->>C: Events 100 to 109
C->>K: Commit bookmark 110
C->>D: Save event 100
C->>D: Save event 104
Note over C: Consumer crashes here
Note over K: Bookmark says 110, events 105 to 109 never processed
A postman ticks all ten parcels off his list at the depot, then sets out to deliver them. If his van breaks down after five deliveries, the manager sees ten ticks and assumes all parcels were delivered. The remaining five are never sent again.
Compare this with the safer order: process first, commit afterwards. A crash in between causes repeats instead of loss. That is at-least-once, covered in its own guide.
6The Hidden Route: Accidental At-Most-Once
Many teams end up with at-most-once behaviour without ever choosing it. Knowing the sneaky routes helps you avoid them.
Automatic commits with handed-off work
Consumers can save their bookmarks automatically every few seconds. When processing happens fully inside the reading loop, automatic commits normally give at-least-once behaviour, because the bookmark for a batch is saved only when the consumer comes back for more. But if the application hands events to other threads, queues, or asynchronous tasks and immediately returns to read more, the bookmark can move ahead while the real work is still waiting or in progress. A crash then loses everything queued but unfinished. The behaviour is at-most-once, though nobody meant it.
Committing at the wrong moment
Code that commits immediately after fetching, or commits in a background timer regardless of progress, moves the bookmark ahead of the actual work.
Skipping failed events
A consumer that catches an error for a bad event, logs it, commits, and moves on, deliberately drops that event. Sometimes this is right, but if done broadly, it silently turns the pipeline into at-most-once for every failure.
Lagging beyond retention
A consumer that falls so far behind that unread events expire from Kafka loses them, and its reset rule may skip forward. The application experiences at-most-once loss, caused by slowness and retention rather than by the commit order.
Skipping ahead during recovery
Operators sometimes reset a group to the latest position to “clear a backlog”. Every event in the skipped range is lost to that group.
Handing work to other threads
The bookmark advances while work sits in a queue. A crash drops the queued events.
Commit before processing
The bookmark moves first. A crash loses the events not yet handled.
Swallowing errors
Failures are logged and skipped without a retry or a dead letter topic.
Falling behind retention
Slow consumers see their unread events deleted and jump forward.
Manual offset skips
Resetting to the newest position abandons the backlog by design or by accident.
A waiter writes an order on a pad, hands it to a runner who puts it in a pile, and immediately marks the order “done” on the table chart. If the kitchen catches fire, the chart says everything was served, yet the pile was never cooked.
Assuming that a system with no error messages is a system with no loss. At-most-once failures are silent by nature: an event that never arrives leaves no trace unless you count.
7Choosing At-Most-Once on Purpose
There are honest, sensible reasons to accept possible loss. The key is to choose it deliberately and only for the right data.
Why some teams choose it
Speed and low delay
Not waiting for confirmations and not retrying keeps the producer as fast as possible, which matters when events arrive at extremely high rates.
Simplicity
There is no need to design consumers that survive repeats. Every event is handled at most once, so no duplicate protection is needed.
Low cost per event
Fewer network round trips, less retry traffic, and less coordination reduce the resources used per event.
Duplicates are worse than loss
For some actions, doing them twice is more harmful than skipping them once, such as sending a promotional coupon that must never be sent twice.
Data that suits at-most-once
| Kind of Data | Why Loss Is Acceptable |
|---|---|
| Frequent sensor readings such as temperature every second | The next reading arrives soon and supersedes the lost one |
| Application metrics and health pings | Occasional gaps do not change the overall picture |
| Debug or verbose logs | Missing a few lines rarely matters |
| Live location pings from vehicles | The latest position matters, and older ones are quickly obsolete |
| Click streams used for rough trend analysis | Statistics stay accurate even if a tiny fraction is lost |
| Real-time game or UI state updates | A newer update replaces a missed one |
Data that does not
| Kind of Data | Why Loss Is Dangerous |
|---|---|
| Payments and money movements | A lost payment means wrong balances and angry customers |
| Orders and inventory changes | Lost orders are lost revenue, and stock counts drift |
| Account changes and security events | Missing a password change or a login alert can create real risk |
| Audit and compliance records | Missing records can break legal requirements |
| Anything that others use to rebuild state | One lost change corrupts every copy built from the stream |
A city’s traffic counter that misses one car in a thousand still gives a fine picture of the traffic. A bank’s ledger that misses one deposit in a thousand is a disaster. The same tolerance for loss is fine in one place and unacceptable in the other.
8At-Most-Once Compared with the Other Two
Seeing the neighbours makes the choice clear.
At-least-once: retry until sure
The producer retries until it gets a confirmation. The consumer processes first and commits afterwards. Nothing is lost, but a crash or a lost confirmation can cause events to be handled again. Applications must therefore tolerate repeats, usually by making the processing safe to repeat.
Exactly-once: retry safely
Kafka offers tools so that retries do not create visible duplicates: duplicate protection in the producer, and transactions that tie reading, processing, and writing together inside Kafka. The effect appears once even though internal steps may be repeated. It costs some extra delay and complexity, and it fully applies to processing within Kafka, while effects on outside systems need extra care.
| Question | At-Most-Once | At-Least-Once | Exactly-Once |
|---|---|---|---|
| Producer confirmation | None or minimal | Full, with retries | Full, with retries and duplicate protection |
| Consumer commit order | Commit, then process | Process, then commit | Process and commit together in a transaction |
| Data loss possible | Yes | No | No |
| Duplicates possible | No | Yes | No visible duplicates |
| Speed and simplicity | Highest | High | Lower |
| Typical use | Metrics, telemetry, disposable data | Most business events, with repeat-safe consumers | Stream processing needing precise results |
flowchart TD
Q1{"Is losing an event acceptable?"} -->|"Yes"| A["At-most-once: fastest and simplest"]
Q1 -->|"No"| Q2{"Can consumers safely handle repeats?"}
Q2 -->|"Yes"| B["At-least-once: safe and common"]
Q2 -->|"No"| C["Exactly-once: transactions and duplicate protection"]
Three postmen follow three rules. One posts each letter once and never checks, accepting that some are lost. One posts until a receipt arrives, accepting that a letter may arrive twice. The third uses numbered receipts so the receiver always knows a repeat when he sees it, and discards it.
9How Rebalances and Crashes Interact with At-Most-Once
Consumer groups change over time, and each change is a moment when events can slip through.
What a rebalance does
When a consumer joins or leaves a group, or crashes, the partitions are redistributed among the members. The new owner of a partition starts from the last committed bookmark. If the old owner had already committed a bookmark ahead of its real work, the new owner starts after events that were never processed.
The risky window
The dangerous period is the gap between the bookmark moving forward and the work finishing. The longer the work takes after the bookmark is saved, the wider the window in which a crash or a rebalance causes loss. Large batches and slow processing make the window bigger.
Bookmark moves ahead
The old owner commits offset 500 before finishing the work for events up to 500.
A rebalance happens
The partition is taken away from the old owner, perhaps because it was slow or because a new member joined.
The new owner starts at 500
It continues from the bookmark, unaware of the unfinished work.
The unfinished events are lost
Nobody processes them, and no error is raised anywhere.
A shift worker signs the logbook “all done” at the start of the shift, then works. If the worker is sent home mid-shift, the next worker trusts the logbook and starts from the marked point, leaving the tasks in between forever undone.
If you must accept at-most-once on the consumer side, keep batches small and fast. A narrow risky window means fewer events are exposed to loss each time something fails.
10Measuring Loss You Cannot See
The cruelty of at-most-once is that losses are silent. Good teams find ways to measure them anyway.
Compare counts at both ends
The simplest method is to count events sent and events received over the same period and compare. If a producer reports having sent one million events and consumers processed 999,000, a small loss is happening. Even a rough comparison reveals whether the loss rate is what you expected and accepted.
Sequence numbers in events
Some producers stamp each event with a running number per source. A consumer that notices a gap in the sequence, such as receiving 41 and then 43, knows that 42 is missing. This gives an exact count of losses and their timing.
Watch the producer’s error signals
Even at-most-once producers can report errors through callbacks or metrics. Counting these errors reveals loss on the sending side, provided the confirmation setting is not so low that the producer learns nothing.
Watch the consumer’s lag and resets
Unexpected jumps in a group’s position, out-of-range errors, and manual resets all signal potential loss on the reading side.
A cinema that gives numbered tickets can tell at the end of the night whether any numbers are missing from the box. Without numbers, it can only guess. Sequence numbers are the numbered tickets of an event stream.
Accepting “some loss is fine” without ever measuring how much. A tolerable one percent can quietly become ten percent after a change, and nobody notices until a report looks strange.
11Moving Away from At-Most-Once
Many systems start as at-most-once and later need something stronger. The path upward is well known.
Strengthen the producer
Wait for confirmation from all in-sync copies, turn retries on with a sensible time limit, and enable the duplicate protection that lets retries be safe.
Check every send result
Use callbacks to log and count failures and to decide on a fallback such as storing failed events for later.
Fix the consumer’s commit order
Process first, then commit, and turn off automatic commits when work is handed to other threads.
Make processing repeat-safe
Design the work so that seeing an event twice does no harm, for example by recording which events were already handled.
Handle bad events properly
Retry a few times, then send the event to a dead letter topic instead of dropping it silently.
Consider transactions where needed
For pipelines that read from Kafka and write back to Kafka, use transactions to make results appear once.
Upgrading from a plain postbox to registered post means adding tracking numbers, waiting for receipts, and teaching the receiver to recognise repeats. Each step costs a little effort and buys a lot of safety.
12Advantages and Trade-offs
At-most-once is a bargain of speed for certainty.
Advantages
- Never produces duplicate events
- Highest speed and lowest delay
- Simplest consumer design, with no repeat handling needed
- Lowest resource use per event
- Good fit when newer data replaces older data
Disadvantages / Trade-offs
- Events can be lost, often silently
- Losses are hard to notice and hard to measure without extra work
- Unsuitable for money, orders, security, or audit data
- Recovery after a failure cannot restore what was dropped
- Can arise by accident through careless commit or retry settings
13Security and Privacy Angles
A delivery guarantee may look purely technical, but it touches safety and trust too.
Lost security events
Security and access events, such as failed logins or permission changes, are exactly the events an attacker hopes will go missing. Sending them with at-most-once behaviour can leave gaps in the very records that investigators rely on. Treat security telemetry as data that needs at-least-once handling.
Lost deletions and consent changes
Events that record a customer’s request to delete their data or withdraw consent must not be dropped. A lost event of this kind can mean that personal data remains in some downstream system when it should have been removed.
Audit trails
Audit records are evidence. A gap in an audit trail may itself be treated as a failure of control. If some data is both noisy and audited, split it into two topics with different guarantees.
A shop’s camera footage may be recorded at a lower quality for general views, but the footage of the cash register is recorded in full and stored carefully. Different parts of the shop need different levels of care.
It is perfectly reasonable to use different guarantees for different topics in one system. Classify your data by how painful loss would be, and choose accordingly.
14Anti-Patterns and Best Practices
Most trouble comes from the same few mistakes.
Problem
Using at-most-once settings for payments, orders, or other business-critical events because they were fastest in a benchmark.
Why It’s Harmful
Events are lost silently, balances and stock counts drift, and nobody knows until customers complain.
Correct Approach
Classify data by the cost of loss, and use full confirmations, retries, duplicate protection, and repeat-safe consumers for anything important.
Problem
Handing events to background threads or queues and returning to read more, while bookmarks are saved automatically.
Why It’s Harmful
The bookmark moves ahead of the real work, and a crash or rebalance discards the queued events.
Correct Approach
Commit only after the background work for those events has finished, or keep processing inside the reading loop.
Problem
Catching every processing error, logging it, and moving on without any retry or set-aside.
Why It’s Harmful
Every temporary failure becomes permanent loss, and the logs quickly become too noisy to review.
Correct Approach
Retry a limited number of times, then send the event and error details to a dead letter topic, and alert.
Problem
Accepting loss without measuring it.
Why It’s Harmful
The real loss rate is unknown and may grow after a change. Decisions based on incomplete data go wrong.
Correct Approach
Add sequence numbers or compare sent and processed counts, and set an alert for loss above the accepted level.
Problem
Resetting a consumer group to the newest position to “clear a backlog” without considering what is skipped.
Why It’s Harmful
Everything in the skipped range is lost for that group, sometimes including important events.
Correct Approach
Decide explicitly what may be discarded, prefer catching up by scaling out, and record any deliberate skip.
Best practices at a glance
Choose the guarantee per topic
Match it to how painful loss would be for that data.
Write the choice down
Document which topics accept loss and why, so nobody assumes otherwise.
Keep the risky window small
Use small, fast batches if commits happen before processing.
Measure the loss
Use sequence numbers or count comparisons to know the real rate.
Avoid accidental at-most-once
Review commit settings and any asynchronous hand-offs in consumers.
Separate critical from disposable
Use different topics for data with different guarantees.
Protect security and audit data
Never allow loss for security, consent, or audit events.
Revisit as the business grows
Data that was once disposable may become important later.
15A Real-World Walk-Through
Let us see how a delivery company might decide which topics can be at-most-once.
List the data flows
The company has vehicle location pings every two seconds, engine health readings, delivery confirmations, customer payments, and security logs.
Ask how painful a loss would be
Losing one location ping is harmless, since another arrives in two seconds. Losing a delivery confirmation or payment is serious. Losing a security log line is unacceptable.
Choose at-most-once for pings
Location pings are sent with minimal confirmation and no retries, keeping delay tiny for the live map. The map service reads them with a fast loop and small batches.
Measure the loss
Each vehicle numbers its pings. The consumer counts gaps, and a dashboard shows a loss rate around a fraction of one percent, which the team has agreed is acceptable.
Choose at-least-once for confirmations and payments
These topics use full confirmations, retries, and duplicate protection on the producer, and consumers that process first, commit afterwards, and tolerate repeats.
Protect security logs
Security logs use the safest settings and long retention, and a dead letter topic catches events that fail.
Document and review
The team records each topic’s guarantee in a catalogue and reviews it every quarter, upgrading any topic whose importance has grown.
flowchart LR
V["Vehicle location pings"] -->|"At-most-once: fast, no retries"| T1["Locations topic"]
E["Engine health readings"] -->|"At-most-once with sequence numbers"| T2["Health topic"]
D["Delivery confirmations"] -->|"At-least-once with repeat-safe consumers"| T3["Deliveries topic"]
Y["Customer payments"] -->|"At-least-once or exactly-once"| T4["Payments topic"]
S["Security logs"] -->|"At-least-once with dead letter topic"| T5["Security topic"]
16Frequently Asked Questions
It is a delivery guarantee under which each event is delivered zero times or one time, never repeated, so duplicates are impossible but loss is possible.
No. Modern Kafka clients default to safer producer settings, and consumers that process before committing behave at-least-once. At-most-once appears when settings or code are chosen or written in a way that skips confirmations, retries, or the safe commit order.
By not waiting for confirmations or by not retrying after failure. The producer sends and moves on, so an event that fails to arrive is never resent.
By saving its bookmark before finishing the work, or by letting bookmarks advance while work is still queued elsewhere. A crash then leaves those events unprocessed and unrepeated.
Not through the delivery mechanism itself when configured correctly. You can still lose events through other causes, such as falling behind the retention period, so retention and monitoring remain important.
For data where a newer event replaces an older one or where occasional gaps do not matter, such as frequent sensor readings, metrics, and rough analytics, especially when speed and low delay matter most.
Compare the number of events sent with the number processed, add running sequence numbers to spot gaps, and watch producer errors and consumer out-of-range or reset events.
Fire and forget is the most extreme producer form of it. At-most-once is broader and also covers consumers that commit before processing, and producers that report failures but never retry.
Not literally. Exactly-once means the effect appears once, even though internal retries may occur. Duplicate protection and transactions make the repeats invisible.
Yes, and they should. Match each topic’s guarantee to how costly a loss or a duplicate would be for that data.
17Summary and Key Takeaways
We began with a postman who ticks each letter off his list before delivering it, so that no letter is ever delivered twice, at the price of losing any letter he drops on the way. At-most-once delivery in Kafka is that rule. On the producer side, it appears when events are sent without waiting for confirmation or without retrying. On the consumer side, it appears when the bookmark is committed before the work is done, or when work is handed to other threads while bookmarks race ahead. It never repeats an event, but it can silently lose one, and the loss is invisible unless you count or number your events. It is a sensible choice for disposable data such as frequent sensor readings, metrics, and rough analytics, where speed and simplicity matter more than completeness, and a dangerous choice for payments, orders, security events, and audit records. It can also arise by accident through careless settings, so review commit order, retries, confirmations, and error handling. Choose the guarantee topic by topic, measure the loss you accept, document the decision, and move to at-least-once or exactly-once as soon as the data becomes too valuable to lose.
Key Takeaways
- At-most-once means zero or one delivery — never repeated, but possibly lost, which is the opposite trade to at-least-once.
- Two legs, two risks — producers become at-most-once by skipping confirmations or retries, and consumers by committing bookmarks before processing.
- It often happens by accident — automatic commits with handed-off work, swallowed errors, falling behind retention, and manual position skips all create silent loss.
- The weakest leg decides — a pipeline’s guarantee is only as strong as its producer and consumer sides together.
- Use it for disposable data — frequent readings, metrics, and rough analytics where the next event replaces a lost one and speed matters.
- Never use it for critical data — payments, orders, security, consent, and audit events need at-least-once or exactly-once handling.
- Measure and document the loss — use sequence numbers or count comparisons, record the decision per topic, and upgrade the guarantee when the data grows in importance.