पाठ 6 / 25

Acknowledgements, Retries और 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 तक होने पर क्रम बना रहता है।

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 है।

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']

त्वरित जाँच: कौन-सा setting producer को सभी in-sync replicas का इंतज़ार कराता है?

  • compression.type=none
  • acks=0
  • linger.ms=0
  • acks=all
Answer

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