- CRDT(Conflict-free Replicated Data Type, टकराव-मुक्त प्रतिकृत डेटा प्रकार) एक ऐसी वितरित डेटा संरचना है जो नेटवर्क विभाजन या समवर्ती संशोधनों की स्थिति में भी समन्वय के बिना सुसंगत डेटा मर्ज को संभव बनाती है
- यदि डेटा मर्ज विनिमेयता, संयोजकता और idempotence को संतुष्ट करता है, तो सभी replicas अंततः एक ही स्थिति में converge हो जाते हैं
- प्रमुख रूपों में G-Counter, PN-Counter, G-Set, 2P-Set, OR-Set, LWW-Register, MV-Register, RGA, WOOT, Logoot आदि शामिल हैं, और ये अलग-अलग जोड़ना, हटाना, दोबारा जोड़ना, और क्रम बनाए रखना जैसी आवश्यकताओं को संभालते हैं
- Delta CRDT पूरी state के बजाय केवल बदलाव भेजकर दक्षता बढ़ाता है, और Garbage Collection metadata के लगातार बढ़ने की समस्या को हल करने के लिए एक प्रमुख चुनौती है
- CRDT कोई परिपूर्ण समाधान नहीं है, लेकिन ऐसे सिस्टम में जहाँ availability तत्काल consistency से अधिक महत्वपूर्ण है, इसे एक शक्तिशाली विकल्प माना जाता है
CRDT की मूल अवधारणा
- CRDT एक ऐसी डेटा संरचना है जिसे वितरित वातावरण में समवर्ती संशोधन होने पर भी बिना समन्वय के मर्ज किया जा सकता है
- यदि merge operation commutative, associative, और idempotent हो, तो सभी replicas एक ही स्थिति में converge हो जाते हैं
- यह Lattice(जालक) की अवधारणा पर आधारित है, जहाँ state को इस तरह डिज़ाइन किया जाता है कि वह हमेशा केवल “ऊपर” की ओर बढ़े
- उदाहरण: G-Counter प्रत्येक replica के count को
max से मर्ज करके बिना नुकसान के कुल योग सुनिश्चित करता है
- CRDT के दो प्रमुख approaches हैं: State-based(CvRDT) और Operation-based(CmRDT)
- CvRDT पूरी state को मर्ज करता है, जबकि CmRDT operations को propagate करता है
प्रमुख CRDT प्रकार
- G-Counter: केवल बढ़ने वाला counter, प्रत्येक replica के मान का योग
- PN-Counter: बढ़ाने और घटाने वाले G-Counter को जोड़कर द्विदिश count का समर्थन
- G-Set: केवल जोड़ने योग्य set
- 2P-Set: जोड़ना और हटाना संभव, लेकिन दोबारा जोड़ना संभव नहीं
- LWW-Element-Set: timestamp आधारित, जिसमें सबसे हाल की operation जीतती है
- OR-Set: unique tags का उपयोग करके समवर्ती add के समय डेटा हानि के बिना मर्ज करता है, add-wins व्यवहार
- LWW-Register / MV-Register: एकल मान संग्रहित करने के लिए; LWW में एक ही विजेता, MV में सभी समवर्ती मान संरक्षित रहते हैं
- OR-Map: key-वार OR-Set को संयोजित करने वाली map संरचना
- RGA / WOOT / Logoot / LSEQ: क्रमबद्ध sequence डेटा के लिए CRDT
- RGA tree-आधारित है, WOOT द्विदिश references पर आधारित है, और Logoot/LSEQ position identifiers पर आधारित हैं
उन्नत CRDT अवधारणाएँ
- Causal CRDTs: version vectors का उपयोग करके causal संबंधों को ट्रैक करते हैं, जिससे अधिक सटीक conflict detection संभव होता है
- Delta CRDTs: पूरी state के बजाय केवल बदलाव(डेल्टा) भेजकर network efficiency बढ़ाते हैं
- Tree CRDTs: hierarchical data (जैसे file systems) की replication का समर्थन करते हैं, जहाँ parent-child संबंध बनाए रखना आवश्यक है
- Observed-Remove Shopping Cart: OR-Set और PN-Counter को मिलाकर बना e-commerce shopping cart का उदाहरण
Garbage Collection की समस्या
- CRDT convergence के लिए metadata को लगातार जमा करते रहते हैं, इसलिए अनंत वृद्धि की समस्या उत्पन्न होती है
- उदाहरण: OR-Set के tags, RGA के tombstones
- समय-आधारित expiration, consensus-आधारित deletion, version vector-आधारित causal tracking, metadata की ऊपरी सीमा तय करना, checkpoint/rebase जैसी कई रणनीतियाँ मौजूद हैं
- हर तरीका सुरक्षा (zombie restoration को रोकना) और स्थान दक्षता के बीच समझौता मांगता है
प्रदर्शन और चयन गाइड
- अलग-अलग CRDT प्रकारों की space और time complexity replicas की संख्या, elements की संख्या, और tags की संख्या पर निर्भर करती है
- G/PN-Counter replicas की संख्या के अनुपात में, OR-Set tags की संख्या के अनुपात में, और RGA tombstones के संचय से प्रभावित होता है
- Delta CRDT merge performance को काफी बेहतर बनाता है
- चयन मानदंड:
- केवल add की आवश्यकता → G-Counter, G-Set
- deletion की आवश्यकता, re-add की आवश्यकता नहीं → 2P-Set
- LWW स्वीकार्य हो → LWW-Set/Register
- समवर्ती संशोधनों को संरक्षित रखना हो → OR-Set, MV-Register
- क्रम बनाए रखना हो → RGA, Logoot
- nested संरचना → OR-Map
निष्कर्ष
- CRDT बिना समन्वय के convergence सुनिश्चित करते हैं, लेकिन metadata की वृद्धि और जटिलता उनकी कमजोरियाँ हैं
- ये availability-प्राथमिकता वाले सिस्टम में उपयोगी हैं, और प्रत्येक CRDT किसी विशेष समस्या प्रकार के लिए अनुकूलित होता है
- व्यवहारिक उपयोग में इन्हें पारंपरिक databases के साथ मिलाकर इस्तेमाल किया जाता है, और garbage collection रणनीति अनिवार्य होती है
- कोई “परफेक्ट CRDT” नहीं है; अनुप्रयोग की आवश्यकताओं के अनुसार सही चयन ही मुख्य बात है
1 टिप्पणियां
Hacker News राय
CRDT की दिलचस्प बातों में से एक यह है कि यह सिर्फ कई low-level CRDTs को जोड़ने वाली लाइब्रेरी नहीं है
उदाहरण के लिए, Automerge अपने आप में एक पूर्ण CRDT है, और गणितीय प्रमाण के माध्यम से concurrency के दौरान भी consistency की गारंटी देता है
Automerge टीम Isabelle जैसे theorem proving tools से डिज़ाइन को सत्यापित करती है, और database दुनिया की नवीनतम performance techniques लागू करके तेज़ और सटीक implementation का लक्ष्य रखती है
अगर आप real-time collaboration की ज़रूरत वाला SaaS बना रहे हैं, जैसे Notion या Figma, तो जटिल theory जाने बिना भी collaborative data structures को सीधे लागू कर सकते हैं
backend के लिए साधारण key-value storage काफ़ी है, और frontend के लिए एक लाइब्रेरी ही पर्याप्त है
मैंने भी Redis-आधारित automerge लाइब्रेरी बनाई थी, जिसमें pub/sub का उपयोग करके एक पूर्ण persistent sync server लागू कर सका
Webdis की websocket क्षमता का उपयोग करके कई browsers के बीच document sync का demo भी जल्दी पूरा किया
अगर बेहतर DX और CRDT-आधारित full-stack DB चाहिए, तो Triplit.dev की सिफारिश करता हूँ। विकास की गति कुछ धीमी हुई है, लेकिन features काफ़ी mature हैं
निजी तौर पर मुझे Loro भी पसंद है, लेकिन यह अब भी document-based structure है, इसलिए query engine की कमी है। मनचाहा data पाने के लिए खास nested items को सीधे निर्दिष्ट करना पड़ता है
यह लेख CRDT की बुनियाद से लेकर advanced concepts तक अच्छी तरह व्यवस्थित था
जानकारी के लिए, Riak अब भी OpenRiak के रूप में maintain किया जा रहा है
पिछले 2 वर्षों में मैंने खुद CRDT विकसित किया, लेकिन महसूस हुआ कि इसमें बहुत सारे trade-offs हैं, इसलिए अंततः ID-आधारित OT framework पर शिफ्ट कर गया
इस मंगलवार Docnode.dev लॉन्च करने वाला हूँ। फीडबैक सुनना चाहूँगा
आगे चलकर, जहाँ P2P की ज़रूरत हो, वहाँ के लिए CRDT mode भी जोड़ने की योजना है
CRDT या OT ऐसे ढाँचे हैं जो उस स्थिति को हल करने के लिए बनाए गए हैं जब लोग एक ही paragraph को एक साथ edit करते हैं, लेकिन वास्तव में ऐसी स्थिति बहुत कम होती है
इस लेख में जिस OR-Set का ज़िक्र है, वह Monotone द्वारा 2005 से इस्तेमाल किए जा रहे merge approach जैसा है
संबंधित सामग्री MarkMerge दस्तावेज़ में देखी जा सकती है
CRDT अब भी ऐसा क्षेत्र है जिसे खुद implement करना पड़ता है
मैंने भी दो महीने पहले diamond types से प्रेरित होकर sequence-based CRDT engine बनाया था
AI से मदद मांगी थी, लेकिन ऐसे logic-केंद्रित problems में वह बिल्कुल मददगार नहीं था
लगा कि LLM नए logic को समझ सकते हैं या नहीं, यह परखने के लिए black-box tests की ज़रूरत है
लेख शानदार था, लेकिन मुझे लगता है कि glossary में index ज़रूर होना चाहिए
लगता है कि CRDT आख़िरकार merge conflicts को DB से निकालकर application logic में धकेलने जैसा है
अगर सही तरह लिखा जाए, तो किसी भी layer में होने पर automatic merge resolution संभव है
सबसे बड़ी समस्या UNIQUE/PRIMARY KEY conflicts को संभालना था
हर server को एक ID namespace बाँटकर, first-create-wins नियम लागू करके, और conflict होने पर नाम बदलने या delete करने जैसे तरीकों से इसे हल किया जा सकता है
EAV schema इस्तेमाल करने पर SQL में recursive CTE के साथ graph traversal को आसानी से लागू किया जा सकता है
हालांकि PostgreSQL में ANY type नहीं है, इसलिए अलग-अलग properties वाले objects को व्यक्त करना मुश्किल है, और FOREIGN KEY functionality भी खुद लागू करनी पड़ती है
फिर भी EAV structure, inheritance जैसी meta-schema design के लिए फ़ायदेमंद है
अच्छा होता अगर PostgreSQL में CRDT types सीधे define किए जा सकते, लेकिन अभी monoid operations पर restrictions लगाना संभव नहीं है
अंततः non-key columns के लिए CRDT को application layer में संभालना पड़ता है
संक्षेप में, CRDT को RDBMS के भीतर भी implement किया जा सकता है, लेकिन business logic कहाँ रखा जाए इसके अनुसार approach बदलती है