What Is At-Most-Once Delivery in Kafka?

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.

Simple Analogy

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.

i
Helpful Note

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

GuaranteeCan an Event Be Lost?Can an Event Be Repeated?Main Idea
At-most-onceYesNoNever retry; prefer loss to duplicates
At-least-onceNoYesAlways retry; prefer duplicates to loss
Exactly-onceNoNo visible duplicatesRetry 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.

Simple Analogy

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.

!
Common Mistake

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"]
        
FIG 1 — Two legs where a delivery guarantee is decided

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.

Simple Analogy

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.

i
Helpful Note

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 SetupBehaviourGuarantee
No confirmation, no retriesSends and forgets; failures are invisibleAt-most-once, with a high chance of loss
Leader confirmation, retries offFailures are reported but not retriedAt-most-once, with smaller chance of loss
Full confirmation, retries offSafe writes, but temporary errors drop the eventAt-most-once in effect, since no resend happens
Full confirmation, retries on, duplicate protection onResends safely after troubleStrong: 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
        
FIG 2 — An event lost on the producer side with no confirmation and no retry
Simple Analogy

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.

!
Common Mistake

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.

1

The consumer fetches a batch

It receives events with offsets 100 to 109.

2

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.

3

It starts processing

The consumer begins to save the events to a database, one by one.

4

It crashes halfway

Only offsets 100 to 104 have been processed. Offsets 105 to 109 were never handled.

5

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
        
FIG 3 — Committing before processing loses the events not yet handled
Simple Analogy

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.

i
Helpful Note

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.

Route 1

Handing work to other threads

The bookmark advances while work sits in a queue. A crash drops the queued events.

Route 2

Commit before processing

The bookmark moves first. A crash loses the events not yet handled.

Route 3

Swallowing errors

Failures are logged and skipped without a retry or a dead letter topic.

Route 4

Falling behind retention

Slow consumers see their unread events deleted and jump forward.

Route 5

Manual offset skips

Resetting to the newest position abandons the backlog by design or by accident.

Simple Analogy

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.

!
Common Mistake

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 DataWhy Loss Is Acceptable
Frequent sensor readings such as temperature every secondThe next reading arrives soon and supersedes the lost one
Application metrics and health pingsOccasional gaps do not change the overall picture
Debug or verbose logsMissing a few lines rarely matters
Live location pings from vehiclesThe latest position matters, and older ones are quickly obsolete
Click streams used for rough trend analysisStatistics stay accurate even if a tiny fraction is lost
Real-time game or UI state updatesA newer update replaces a missed one

Data that does not

Kind of DataWhy Loss Is Dangerous
Payments and money movementsA lost payment means wrong balances and angry customers
Orders and inventory changesLost orders are lost revenue, and stock counts drift
Account changes and security eventsMissing a password change or a login alert can create real risk
Audit and compliance recordsMissing records can break legal requirements
Anything that others use to rebuild stateOne lost change corrupts every copy built from the stream
Simple Analogy

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.

QuestionAt-Most-OnceAt-Least-OnceExactly-Once
Producer confirmationNone or minimalFull, with retriesFull, with retries and duplicate protection
Consumer commit orderCommit, then processProcess, then commitProcess and commit together in a transaction
Data loss possibleYesNoNo
Duplicates possibleNoYesNo visible duplicates
Speed and simplicityHighestHighLower
Typical useMetrics, telemetry, disposable dataMost business events, with repeat-safe consumersStream 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"]
        
FIG 4 — A simple way to choose a delivery guarantee
Simple Analogy

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.

1

Bookmark moves ahead

The old owner commits offset 500 before finishing the work for events up to 500.

2

A rebalance happens

The partition is taken away from the old owner, perhaps because it was slow or because a new member joined.

3

The new owner starts at 500

It continues from the bookmark, unaware of the unfinished work.

4

The unfinished events are lost

Nobody processes them, and no error is raised anywhere.

Simple Analogy

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.

i
Helpful Note

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.

Counts
Events sent versus events processed
Gaps
Missing sequence numbers in the stream
Errors
Producer failures and consumer out-of-range events
Simple Analogy

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.

!
Common Mistake

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.

1

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.

2

Check every send result

Use callbacks to log and count failures and to decide on a fallback such as storing failed events for later.

3

Fix the consumer’s commit order

Process first, then commit, and turn off automatic commits when work is handed to other threads.

4

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.

5

Handle bad events properly

Retry a few times, then send the event to a dead letter topic instead of dropping it silently.

6

Consider transactions where needed

For pipelines that read from Kafka and write back to Kafka, use transactions to make results appear once.

Simple Analogy

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.

Simple Analogy

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.

i
Helpful Note

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.

ANTI-PATTERN-01 Avoid
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.

ANTI-PATTERN-02 Avoid
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.

ANTI-PATTERN-03 Avoid
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.

ANTI-PATTERN-04 Avoid
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.

ANTI-PATTERN-05 Avoid
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

Habit 1

Choose the guarantee per topic

Match it to how painful loss would be for that data.

Habit 2

Write the choice down

Document which topics accept loss and why, so nobody assumes otherwise.

Habit 3

Keep the risky window small

Use small, fast batches if commits happen before processing.

Habit 4

Measure the loss

Use sequence numbers or count comparisons to know the real rate.

Habit 5

Avoid accidental at-most-once

Review commit settings and any asynchronous hand-offs in consumers.

Habit 6

Separate critical from disposable

Use different topics for data with different guarantees.

Habit 7

Protect security and audit data

Never allow loss for security, consent, or audit events.

Habit 8

Revisit as the business grows

Data that was once disposable may become important later.

“At-most-once is a fine promise for a thermometer and a terrible one for a bank.”

15A Real-World Walk-Through

Let us see how a delivery company might decide which topics can be at-most-once.

1

List the data flows

The company has vehicle location pings every two seconds, engine health readings, delivery confirmations, customer payments, and security logs.

2

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.

3

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.

4

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.

5

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.

6

Protect security logs

Security logs use the safest settings and long retention, and a dead letter topic catches events that fail.

7

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"]
        
FIG 5 — Different guarantees for different data in one company

16Frequently Asked Questions

Q1What is at-most-once in one sentence?

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.

Q2Is at-most-once the default in Kafka?

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.

Q3How does a producer become at-most-once?

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.

Q4How does a consumer become at-most-once?

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.

Q5Can I lose events with at-least-once?

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.

Q6When is at-most-once a good choice?

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.

Q7How can I tell whether I am losing events?

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.

Q8Is at-most-once the same as fire and forget?

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.

Q9Does exactly-once mean events are only sent once?

Not literally. Exactly-once means the effect appears once, even though internal retries may occur. Duplicate protection and transactions make the repeats invisible.

Q10Can different topics use different guarantees?

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.