# Retention और Log Compaction — Apache Kafka: बुनियाद से Production तक Event Streaming

Source: https://www.geekswithgeeks.com/hi/kafka/td-retention-compaction

> डेटा कितनी देर रहे यह नियंत्रित करें और "प्रति key ताज़ा मान" topics के लिए compaction उपयोग करें।

## उम्र से हटाएँ या ताज़ा रखें

डिफ़ॉल्ट **`cleanup.policy=delete`** के साथ पुराने log segments `retention.ms` (डिफ़ॉल्ट 7 दिन) के बाद या partition के `retention.bytes` पार करने पर हटाए जाते हैं। **`cleanup.policy=compact`** के साथ Kafka कम से कम **हर key का ताज़ा record** रखता है और अंततः पुराने हटाता है; key वाला और **null value** वाला record (एक "tombstone") उस key को हटाता है। Compaction स्थिति-जैसे topics (user profiles, configuration, किसी table का changelog) के लिए ठीक है। Retention प्रति topic है और `kafka-configs.sh` से कभी भी बदली जा सकती है। याद रखें: storage = प्रतिदिन डेटा × retention दिन × replication factor।

## Retention बदलना और compacted topic बनाना, चलाकर

मैंने ये असली broker पर चलाए। पहला `orders` पर 24 घंटे की retention तय करता है; दूसरा `cleanup.policy=compact` के साथ `user-profile` बनाता है और describe output पुष्टि करता है।

```bash
kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics \
  --entity-name orders --alter --add-config retention.ms=86400000
kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --entity-name orders --describe

kafka-topics.sh --bootstrap-server localhost:9092 --create --topic user-profile \
  --partitions 1 --replication-factor 1 --config cleanup.policy=compact
```

Output:

```
Completed updating config for topic orders.
Dynamic configs for topic orders are:
  retention.ms=86400000 sensitive=false synonyms={DYNAMIC_TOPIC_CONFIG:retention.ms=86400000}
Created topic user-profile.
```

## Compaction क्या रखती है, और storage का आकार, चलाकर

Compaction प्रति key ताज़ा मान रखती है और जिन keys का ताज़ा मान tombstone (`None`) है उन्हें हटाती है: यहाँ `u2` हटता है और `u1`, `u3` अपने आख़िरी मान रखते हैं। आख़िरी पंक्ति: प्रतिदिन 40 GB, 7 दिन, 3 replicas के लिए 840 GB चाहिए।

```python
from collections import OrderedDict
log = [("u1", "a"), ("u2", "b"), ("u1", "c"), ("u3", "d"), ("u2", None), ("u1", "e")]
latest = OrderedDict()
for k, v in log:
    latest.pop(k, None)
    latest[k] = v
print({k: v for k, v in latest.items() if v is not None})

daily_gb, days, rf = 40, 7, 3
print(daily_gb * days * rf, "GB")
```

Output:

```
{'u3': 'd', 'u1': 'e'}
840 GB
```

**Quiz:** Compacted topic पर key और null value वाला record क्या करता है?

- [ ] कुछ नहीं करता
- [ ] Key की प्रतिलिपि बनाता है
- [ ] Topic हटाता है
- [x] उस key को हटाने के लिए चिह्नित करता है (tombstone)

*Answer:* उस key को हटाने के लिए चिह्नित करता है (tombstone). Tombstone compaction को बताता है कि अंततः उस key को पूरी तरह हटाना है।
