# Acknowledgements, Retries और Idempotence — Apache Kafka: बुनियाद से Production तक Event Streaming

Source: https://www.geekswithgeeks.com/hi/kafka/kp-acks-idempotence

> हानि और दोहराव से बचने के लिए acks, retries और idempotent producer configure करें।

## आप कितने निश्चित होना चाहते हैं?

**`acks`** setting तय करता है कि write कब सफल गिना जाए: `0` (इंतज़ार नहीं; सबसे तेज़, डेटा खो सकता है), `1` (सिर्फ़ leader का इंतज़ार), `all` (सभी in-sync replicas का इंतज़ार; सबसे मज़बूत)। Topic setting `min.insync.replicas` के साथ `acks=all` स्वीकृत डेटा को broker विफलता से बचाता है। Producer अस्थायी errors को **retry** करता है, जो तब **दोहराव** बना सकता है जब retry ऐसे write के बाद हो जो असल में सफल था। **`enable.idempotence=true`** हर producer को ID और sequence numbers देता है ताकि broker एक partition के भीतर दोहराव हटा दे; मौजूदा Kafka clients में यह `acks=all` के साथ डिफ़ॉल्ट रूप से चालू है। Retry पर बिताए कुल समय को सीमित करने के लिए `delivery.timeout.ms` उपयोग करें।

## टिकाऊ producer config

Java/librdkafka clients के property नाम (उदाहरण)। Idempotence के साथ `max.in.flight.requests.per.connection` 5 तक होने पर क्रम बना रहता है।

```properties
acks=all
enable.idempotence=true
retries=2147483647
delivery.timeout.ms=120000
max.in.flight.requests.per.connection=5
linger.ms=10
compression.type=lz4
```

## Broker दोहराव कैसे हटाता है, चलाकर

मैंने sequence जाँच का छोटा मॉडल चलाया: हर producer ID को sequence numbers 0, 1, 2… भेजने होते हैं; दोहराया गया नंबर दोहराव मानकर अनदेखा होता है और बीच का अंतर error है।

```python
seen = {}
def accept(pid, seq):
    last = seen.get(pid, -1)
    if seq == last + 1:
        seen[pid] = seq
        return "append"
    if seq <= last:
        return "duplicate-ignored"
    return "out-of-order-error"

print([accept(7, s) for s in (0, 1, 1, 2, 4)])
```

Output:

```
['append', 'append', 'duplicate-ignored', 'append', 'out-of-order-error']
```

**Quiz:** कौन-सा setting producer को सभी in-sync replicas का इंतज़ार कराता है?

- [ ] compression.type=none
- [ ] acks=0
- [ ] linger.ms=0
- [x] acks=all

*Answer:* acks=all. acks=all तब स्वीकार करता है जब हर in-sync replica के पास record हो।
