---
title: "Kafka acks=0 vs acks=1 vs acks=all on a degraded ISR"
description: "One Kafka partition below min.insync.replicas: acks=all gets NOT_ENOUGH_REPLICAS, acks=1 is acked by the leader alone, acks=0 is lost once the leader dies."
url: https://monedula.dev/kafka-simulator/scenarios/acks-tradeoff/
---

# Kafka acks=0 vs acks=1 vs acks=all on a degraded ISR

Scenario 01.1.3 · acks trade-off. Producers & EOS · Intermediate · about 2 min · Apache Kafka 4.3.

Same degraded ISR: acks=all refuses to commit; acks=1 acks on the leader alone; acks=0 fire-and-forget, silently lost once the leader dies.

Run it: https://monedula.dev/kafka-simulator/playground/?scenario=01.1.3

## What you start with

This scenario puts all three acks levels side by side against the SAME degraded cluster. After two brokers are killed the ISR drops below min.insync.replicas, then the producer writes a record at acks=all, is switched to acks=1, then to acks=0 (the simulator changes acks live; a real producer is recreated with the new setting) - so you can compare how each setting reacts to a partition that can no longer satisfy durability.

## Step by step

1. **Cluster ready - acks=all, RF=3, min.ISR=2** (t+0.000s) [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=01.1.3&t=0)
2. **broker-3 down - ISR shrinks to 2** (t+3.050s) [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=01.1.3&t=1)
3. **broker-2 down - ISR shrinks to 1 (below min.ISR)** (t+6.050s) [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=01.1.3&t=2)
4. **acks=all produce blocked - NotEnoughReplicas** (t+9.200s): Durability wins: acks=all refuses to ack below min.insync.replicas. [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=01.1.3&t=3)
5. **acks lowered to 1 (a real producer is recreated)** (t+12.100s) [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=01.1.3&t=4)
6. **acks=1 acks on the leader alone** (t+13.200s): Availability wins: acked, but the record sits only on the leader (HW pinned) - lost if the leader fails. [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=01.1.3&t=5)
7. **acks=0 fire-and-forget - sent, never acknowledged** (t+16.200s): Speed wins: acks=0 gets no acknowledgement at all. The leader appended the record, but the producer never waits to hear - status is "sent", not acked. [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=01.1.3&t=6)
8. **broker-1 down - partition leaderless (no replica left to elect)** (t+19.600s) [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=01.1.3&t=7)
9. **acks=0 into a leaderless partition - lost** (t+22.200s): Data loss: with no leader, A4 never leaves the producer. The simulator drops it and still shows "sent"; a real producer holds it in its buffer and fails it with a TimeoutException after delivery.timeout.ms (120 s), even at acks=0. [Open at this step](https://monedula.dev/kafka-simulator/playground/?scenario=01.1.3&t=8)

## The takeaway

acks is a sliding durability-vs-latency dial: acks=all refuses to commit when the ISR is too small, acks=1 acknowledges on the leader alone without committing, and acks=0 never waits and loses the write silently once that leader dies.

## Configs in this scenario

- [`acks`](https://kafka.apache.org/43/configuration/producer-configs/#producerconfigs_acks): How many replicas must have a write before the producer counts it as sent: 0 (none), 1 (the leader only) or all (every in-sync replica, the default, and required for idempotence). [How acks works](https://monedula.dev/kafka-simulator/configs/acks/)
- [`min.insync.replicas`](https://kafka.apache.org/43/configuration/topic-configs/#topicconfigs_min.insync.replicas): The fewest in-sync replicas, leader included, that must have a write for an acks=all produce to succeed (default 1); with fewer in the ISR the leader rejects the write with NOT_ENOUGH_REPLICAS. [How min.insync.replicas works](https://monedula.dev/kafka-simulator/configs/min-insync-replicas/)
- [`delivery.timeout.ms`](https://kafka.apache.org/43/configuration/producer-configs/#producerconfigs_delivery.timeout.ms): The upper bound on reporting success or failure after send() returns, covering the wait in a batch, the wait for the acknowledgement and every retry (default 120000, 2 minutes); it should be at least request.timeout.ms plus linger.ms.

## Further reading

- [Apache Kafka documentation](https://kafka.apache.org/43/configuration/producer-configs/#producerconfigs_acks)

## Troubleshooting

- [NotEnoughReplicasException in Kafka: causes and fixes](https://monedula.dev/kafka-simulator/troubleshooting/not-enough-replicas/)
- [Kafka offline partitions with no leader: causes and fixes](https://monedula.dev/kafka-simulator/troubleshooting/offline-partitions-no-leader/)
