𝗖𝗥𝗗𝗧𝘀 𝗶𝗻 𝗞𝗼𝘁𝗹𝗶𝗻 𝗠𝘂𝗹𝘁𝗶𝗽𝗹𝗮𝘁𝗳𝗼𝗿𝗺: 𝗞𝗶𝗹𝗹 𝗬𝗼𝘂𝗿 𝗦𝘆𝗻𝗰 𝗦𝗲𝗿𝘃𝗲𝗿

زیادہ تر ٹیمیں ڈیٹا کے تصادم (conflicts) کو سنبھالنے کے لیے ایک مرکزی سرور بناتی ہیں۔ سرور writes وصول کرتا ہے، ایک فاتح کا انتخاب کرتا ہے، اور بہترین نتیجے کی امید کرتا ہے۔ یہ failure کا ایک واحد نقطہ (single point of failure) پیدا کرتا ہے اور اسے برقرار رکھنے کے لیے پیچیدہ کوڈ کی ضرورت ہوتی ہے۔

Conflict-Free Replicated Data Types (CRDTs) اس صورتحال کو بدل دیتے ہیں۔ ہر ڈیوائس کسی مرکزی سربراہ کے بغیر ایک ہی حالت (state) تک پہنچ جاتی ہے۔ یہ ایک ریاضیاتی ضمانت ہے۔

آپ اپنے sync backend کو سادہ blob storage سے بدل سکتے ہیں۔ آپ کا سرور ایک ریلے (relay) بن جاتا ہے جو ڈیٹا کے blobs کو محفوظ رکھتا ہے۔ اسے آپ کے ڈیٹا کو سمجھنے کی ضرورت نہیں ہوتی۔

اپنی موبائل ایپس کے لیے ان primitives کا استعمال کریں:

• LWW-Register: صارف کے پروفائلز اور سیٹنگز کے لیے استعمال کریں۔ • G-Counter: اینالیٹکس (analytics) یا ویو کاؤنٹ کے لیے استعمال کریں۔ • PN-Counter: انوینٹری یا کارٹ کے ٹوٹل کے لیے استعمال کریں۔ • OR-Set: ٹیگز اور فیورٹ کے لیے استعمال کریں۔

زیادہ تر موبائل ایپس کے لیے، LWW-Registers اور OR-Sets تقریباً ہر چیز کا احاطہ کر لیتے ہیں۔

Implementation Tip: جب آپ LWW-Register بنائیں، تو ہمیشہ ایک nodeId شامل کریں۔ اگر دو updates کا ٹائم اسٹیمپ (timestamp) بالکل ایک جیسا ہو، تو nodeId ٹائی بریکر (tiebreaker) کے طور پر کام کرتا ہے۔ اس کے بغیر، آپ کی ڈیوائسز ایک ہی حالت (state) پر سنک (sync) نہیں ہوں گی۔

State-based بمقابلہ Operation-based:

موبائل کے لیے State-based (CvRDT) کا انتخاب کریں۔ یہ غیر مستحکم نیٹ ورکس پر بھی کام کرتا ہے کیونکہ مرج (merge) کا عمل idempotent ہوتا ہے۔ اگر سنک (sync) آدھے راستے میں ناکام ہو جائے، تو آپ بس دوبارہ کوشش کرتے ہیں۔

شروع میں Operation-based (CmRDT) سے پرہیز کریں۔ اس کے لیے exactly-once delivery کی ضرورت ہوتی ہے۔ موبائل نیٹ ورکس پر ایسا انفراسٹرکچر بنانا مشکل ہے اور یہ اس پیچیدگی کو بڑھاتا ہے جس سے آپ بچنا چاہتے ہیں۔

The Architecture:

  1. اپنے Kotlin Multiplatform پروجیکٹ کے commonMain ماڈیول میں اپنی CRDT لاجک بنائیں۔
  2. ڈیٹا کو مقامی طور پر محفوظ کرنے کے لیے SQLDelight کا استعمال کریں۔
  3. ڈیٹا کے blobs کو S3 یا Cloud Storage جیسی سروس پر سنک کریں۔
  4. آپ کا backend سادہ اور سستا رہتا ہے۔

پیچیدہ sync engines بنانا بند کریں۔ لاجک کو کلائنٹ پر منتقل کرنے کے لیے CRDTs کا استعمال کریں۔ یہ آپ کو سرور روٹیشنز (server rotations) کے انتظام کے بجائے فیچرز بنانے پر توجہ مرکوز کرنے کی اجازت دیتا ہے۔

Source: https://dev.to/software_mvp-factory/crdts-in-kotlin-multiplatform-kill-your-sync-server-28n8