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

تقوم معظم الفرق ببناء خادم مركزي للتعامل مع تعارض البيانات. يستقبل الخادم عمليات الكتابة، ويختار "الفائز"، ويأمل في أفضل النتائج. يؤدي هذا إلى خلق نقطة فشل واحدة (single point of failure) وكود معقد يتطلب الصيانة.

تغير أنواع البيانات المكررة الخالية من التعارض (CRDTs) هذا الواقع؛ حيث تصل كل أداة إلى نفس الحالة دون الحاجة إلى مدير مركزي، وهذا ضمان رياضي.

يمكنك استبدال الواجهة الخلفية للمزامنة (sync backend) بتخزين كتل بيانات (blob storage) بسيط. سيصبح خادمك مجرد وسيط يحمل كتل البيانات، ولا يحتاج إلى فهم بياناتك.

استخدم هذه العناصر الأساسية (primitives) لتطبيقات الهاتف المحمول الخاصة بك:

• LWW-Register: استخدمه لملفات تعريف المستخدمين والإعدادات. • G-Counter: استخدمه للتحليلات أو عدد المشاهدات. • PN-Counter: استخدمه للمخزون أو إجمالي سلة التسوق. • OR-Set: استخدمه للوسوم (tags) والمفضلة.

بالنسبة لمعظم تطبيقات الهاتف المحمول، تغطي LWW-Registers و OR-Sets كل شيء تقريبًا.

نصيحة للتنفيذ: عند بناء LWW-Register، قم دائمًا بتضمين nodeId. إذا كان لتحديثين نفس الطابع الزمني (timestamp) تمامًا، سيعمل الـ nodeId كفاصل لفك التعادل (tiebreaker). بدون ذلك، لن تتزامن أجهزتك للوصول إلى نفس الحالة.

القائم على الحالة (State-based) مقابل القائم على العمليات (Operation-based):

اختر النوع القائم على الحالة (CvRDT) للهواتف المحمولة. فهو يعمل على الشبكات غير المستقرة لأن عملية الدمج هي عملية idempotent (أي أن تكرار العملية لا يغير النتيجة). إذا فشلت المزامنة في منتصف الطريق، ما عليك سوى المحاولة مرة أخرى.

تجنب النوع القائم على العمليات (CmRDT) في البداية. فهو يتطلب تسليم البيانات "مرة واحدة فقط" (exactly-once delivery). بناء هذه البنية التحتية على شبكات الهاتف المحمول أمر صعب ويضيف التعقيد الذي تريد تجنبه.

البنية التحتية (The Architecture):

  1. قم ببناء منطق CRDT الخاص بك في وحدة commonMain في مشروع Kotlin Multiplatform الخاص بك.
  2. استخدم SQLDelight لتخزين البيانات محليًا.
  3. قم بمزامنة كتل البيانات (data blobs) مع خدمة مثل S3 أو Cloud Storage.
  4. ستظل الواجهة الخلفية (backend) بسيطة وغير مكلفة.

توقف عن بناء محركات مزامنة معقدة. استخدم CRDTs لنقل المنطق إلى العميل (client). يتيح لك ذلك التركيز على بناء الميزات بدلاً من إدارة تدوير الخوادم (server rotations).

المصدر: https://dev.to/software_mvp-factory/crdts-in-kotlin-multiplatform-kill-your-sync-server-28n8