- Local-first apps तेज़ response speed और डिफ़ॉल्ट privacy का वादा करते हैं, लेकिन व्यवहार में offline support को लागू करना बहुत कठिन होता है
- सबसे बड़ा कारण synchronization की जटिलता है; जब कई devices पर एक साथ data बदला जाता है, तो अंततः वह ठीक उसी समान state पर converge होना चाहिए
- इसमें दो बड़े technical challenges हैं: समय-क्रम की अनिश्चितता और conflicts
- इस समस्या को हल करने के लिए Hybrid Logical Clocks(HLCs) और CRDTs जैसी distributed systems design तकनीकों को लागू करना ज़रूरी है
- SQLite आधारित extension capabilities का उपयोग करके विश्वसनीय और सरल synchronization architecture दिया जा सकता है, और इसे सभी platforms पर इस्तेमाल किया जा सकता है
Offline-first apps का वादा और वास्तविकता
- Offline-first apps तुरंत response, डिफ़ॉल्ट privacy, और अस्थिर network environment में भी बिना loading wait के उपयोग की बात करते हैं
- लेकिन वास्तव में ज़्यादातर apps offline support को सही तरह से लागू नहीं कर पाते; अधिकांश सिर्फ changes को local में अस्थायी रूप से save करके बाद में network जुड़ने पर भेजने का तरीका अपनाते हैं
- ऐसी implementation की reliability कम होती है, और अंत में "हो सकता है कि changes save न हुए हों" जैसे warning messages दिखाई देते हैं
Synchronization की मूलभूत कठिनाई
- Local-first app बनाते समय अनिवार्य रूप से एक distributed system बन जाता है
- कई devices offline environment में एक-दूसरे से स्वतंत्र रूप से data बदल सकते हैं, और बाद में दोबारा connect होने पर उन्हें ठीक उसी समान state पर सही ढंग से converge करना चाहिए
- इसके लिए दो बड़ी चुनौतियाँ मौजूद हैं
- events के क्रम की अनिश्चितता
- एक ही data पर conflicts
1. Event order की अनिश्चितता
- कई devices पर events अलग-अलग समय पर होते हैं, और उनके क्रम के अनुसार state बदल सकती है
- उदाहरण: device A ने x=3 सेट किया, device B ने x=5 सेट किया → दोनों ने offline रहते हुए बदलाव किए, फिर sync के समय अलग-अलग परिणाम संभव हैं
- पारंपरिक centralized databases इसे strong consistency से हल करते हैं, लेकिन इसके लिए global synchronization चाहिए, इसलिए यह local-first systems के लिए उपयुक्त नहीं है
- अंततः हर event के लिए उचित क्रम को dynamic और distributed environment में भी तय करना पड़ता है; यानी central clock के बिना order तय करने का तरीका चाहिए
Hybrid Logical Clocks(HLCs) का उपयोग
- Hybrid Logical Clocks(HLCs) एक सरल लेकिन प्रभावी algorithm हैं, जो अलग-अलग devices के बीच events के क्रम पर व्यावहारिक सहमति बनाने में मदद करते हैं
- HLC physical time information और logical counter को मिलाकर काम करता है
- उदाहरण के लिए:
- device A ने 10:00:00.100 पर event रिकॉर्ड किया, HLC होगा (10:00:00.100, 0)
- message पाने वाला device B, भले उसकी clock पीछे हो, HLC को (10:00:00.100, 1) तक बढ़ा देता है
- इससे दोनों devices की physical clock में अंतर होने पर भी event order को सही तरीके से तय किया जा सकता है
2. Conflict की समस्या
- सिर्फ सही order लागू करना काफ़ी नहीं है; अगर अलग-अलग devices एक ही data को स्वतंत्र रूप से edit करें, तो conflict होना अनिवार्य है
- ज़्यादातर systems developers से conflict resolution code manually लिखने की अपेक्षा करते हैं, लेकिन इससे errors का जोखिम और maintenance burden बढ़ता है
CRDTs का उपयोग
- Conflict-Free Replicated Data Types(CRDTs) को लागू करना सबसे अच्छा तरीका है
- CRDTs यह गारंटी देते हैं कि sync किसी भी order में हो, या duplicate apply हो जाए, तब भी हर device की state अंत में हमेशा समान रहेगी
- सबसे सरल CRDT strategy है Last-Write-Wins(LWW)
- हर update को एक timestamp दिया जाता है
- sync के समय नया timestamp वाला value चुना जाता है
SQLite के फ़ायदे
- Local-first apps बनाते समय विश्वसनीय और हल्का local DB अनिवार्य है, और SQLite सबसे उपयुक्त विकल्प है
- SQLite आधारित framework extension के ज़रिए synchronization लागू करने पर ये फ़ायदे मिलते हैं
- message apply करना सरल है: current value पढ़ो → अगर नया timestamp अधिक recent है तो overwrite करो → नहीं तो ignore करो
- यह तरीका sync order से स्वतंत्र होकर सभी devices पर state convergence की गारंटी देता है
Architecture का महत्व
- यह संरचना सरल और विश्वसनीय synchronization को संभव बनाती है
- कई हफ़्तों तक offline रहने पर भी data loss के बिना reliability
- हमेशा अंतिम state पर converge होने वाली deterministic property
- भारी dependencies के बिना सिर्फ lightweight SQLite extension से समाधान
- iOS, Android, macOS, Windows, Linux, WASM जैसे सभी प्रमुख platforms का support
Developers के लिए सुझाव
- सिर्फ request queue के सहारे offline mode का 'दिखावा' करने वाले तरीकों से बचने की ज़रूरत है
- eventual consistency की अवधारणा को अपनाकर HLC और CRDT जैसी साबित distributed systems techniques का उपयोग करना चाहिए
- बड़े और जटिल frameworks की बजाय छोटी और dependency-free structure का लक्ष्य रखना बेहतर है
- इसका परिणाम यह होगा कि apps को तुरंत चलना, offline उपयोग, और डिफ़ॉल्ट privacy जैसे लाभ मिल सकेंगे
Open source SQLite-Sync संदर्भ
- अगर आप production में तुरंत इस्तेमाल किए जा सकने वाले cross-platform offline-first engine में रुचि रखते हैं, तो open source SQLite-Sync extension को देख सकते हैं
1 टिप्पणियां
Hacker News राय