عادت البرمجيات المحلية أولاً، وتتولى محركات المزامنة العبء الأكبر

مشاركة:
عادت البرمجيات المحلية أولاً، وتتولى محركات المزامنة العبء الأكبر

معظم البرمجيات التي نستخدمها اليوم ما تزال تعامل الخادم بوصفه النسخة الحقيقية الوحيدة لبياناتنا. الهاتف والحاسوب مجرد نوافذ رفيعة على قاعدة بيانات في مكان آخر، وحين ينقطع الاتصال تصبح النافذة فارغة. تقول حركة البرمجيات المحلية أولاً إن هذا مقلوب. ينبغي أن يحتفظ الجهاز بنسخة العمل، وأن تكون الشبكة وسيلة للمزامنة، وأن يستمر التطبيق في العمل حين تغيب الشبكة.

الفكرة ليست جديدة، لكنها أصبحت عملية أخيراً. ما تغيّر ليس تحولاً فلسفياً بين المطورين، بل أن محركات المزامنة وأنواع البيانات المتكررة بلا تعارض (CRDT) نضجت بما يكفي لمعالجة الجزء الأصعب: دمج تعديلين أُجريا على جهازين دون فقدان أيٍّ منهما. إذا كنت تبني برمجيات تعاونية اليوم، فلم تعد المزامنة تفصيلاً بنية تحتية تسلّمه لفريق الخلفية، بل قرار منتج له آثار على نموذج بياناتك وصلاحياتك وتكاليف الدعم.

بيان 2019 ولماذا استغرق الأمر سبع سنوات

نشرت مجموعة الأبحاث Ink & Switch عام 2019 مقالاً بعنوان «البرمجيات المحلية أولاً: امتلك بياناتك رغم السحابة». عدّد المقال سبعة مثل: استجابة سريعة دون دوّارات انتظار، وعمل يصمد أمام انقطاع الشبكة، والتعاون عبر الأجهزة والأشخاص، وبيانات تعيش أطول من الشركة التي صنعت التطبيق، والأمان والخصوصية افتراضياً، ومستخدمون يتحكمون في ملفاتهم. لم يعترض أحد تقريباً على القائمة. كانت المشكلة كلفة التنفيذ.

كان بناء تطبيق محلي أولاً يعني كتابة منطق الدمج وطبقة التخزين وبروتوكول النسخ بأنفسكم. اختارت معظم الفرق المسار السحابي وحده لأنه أبسط، وتقبّل المستخدمون دوّارات الانتظار. تغيّر هذا الحساب مع مكتبات مثل Automerge وYjs التي جعلت CRDT قابلة للاستخدام في JavaScript، ومع تولي محركات المزامنة بقية الأنابيب.

ما الذي يفعله محرك المزامنة فعلاً

CRDT بنية بيانات مصممة بحيث يمكن دمج النسخ بأي ترتيب والوصول إلى النتيجة نفسها دون حكم مركزي. يمكن نمذجة النصوص والقوائم والخرائط بهذه الطريقة. يقع محرك المزامنة فوقها ويتولى العمل المملّ: نقل التغييرات بين العميل والخادم، ونسخ الجزء المسموح لكل مستخدم برؤيته فقط، والاحتفاظ بالحالة بعد إعادة التشغيل، والمطابقة مع قاعدة البيانات المعتمدة.

تعمل عدة منتجات إنتاجية على هذا النمط. كتبت Linear علناً عن مخزنها في جانب العميل، ما يتيح لمتعقب المهام أن يستجيب فوراً بينما تتزامن التغييرات في الخلفية. يُعد التحرير المتزامن في Figma حالة معروفة أخرى لعملاء متعددين يحررون المستند نفسه في وقت واحد. الدرس من هذه المنتجات أن النسخة المحلية هي ما يتعامل معه المستخدم، وأن الخادم يصبح منسقاً لا عنق زجاجة.

أين ينكسر النموذج

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

ترحيل المخطط هو المشكلة الثانية التي تستهين بها الفرق. حين يعود عميل متأخر ثلاثة أشهر عن الإصدار الحالي، يجب أن يفهم بيانات كتبها إصدار أحدث، ويجب على الإصدار الأحدث أن يتحمل بيانات كتبها إصدار قديم. يتطلب ذلك بوابات إصدار في العميل، وإهمالاً حذراً للحقول، وخطة لعملاء لن يُحدَّثوا أبداً. التخزين هو المشكلة الثالثة. للهاتف مساحة وبطارية محدودتان، لذا تحتاج إلى سياسات إخلاء وتكرار جزئي وإجابة واضحة عما يحدث حين تتجاوز قاعدة البيانات المحلية سعة الجهاز.

إطار قرار بسيط

قبل اختيار معمارية محلية أولاً، اطرح ثلاثة أسئلة على كل نوع بيانات في منتجك. أولاً: هل يحتاج هذا النوع إلى العمل دون اتصال أو الاستجابة في أقل من نحو 100 ميلي ثانية؟ ثانياً: هل يحرر أكثر من شخص الكائن نفسه في وقت واحد؟ ثالثاً: إذا فقد المستخدم الوصول إلى المزوّد، هل تصبح البيانات عديمة الفائدة له؟

إذا كانت إجابة الأسئلة الثلاثة نعم، فلديك حجة قوية للمحلي أولاً، كما في الملاحظات ومديري المهام وأدوات التصميم. وإذا كانت الإجابتان الأوليان لا، فالنموذج التقليدي المعتمد على الخادم غالباً أرخص وأسهل في الفهم. معظم المنتجات تنتهي إلى نموذج مختلط: المسودات والمحتوى التعاوني يتزامنان محلياً، بينما تبقى المدفوعات والأدوار والفوترة تحت سلطة الخادم.

خلاصات عملية

  • صنّف كل كيان في نموذج بياناتك بوصفه مدمجاً بـ CRDT أو معتمداً على الخادم أو للقراءة فقط، ودوّن هذا التصنيف قبل كتابة الكود.
  • ضع نسخاً للمخطط من اليوم الأول وأضف فحوصات لإصدار العميل كي تفشل العملاء القديمة بسلاسة بدلاً من إفساد البيانات.
  • اختبر على أجهزة أندرويد منخفضة المواصفات ذات مساحة تخزين محدودة، لا على أحدث آيفون فقط.
  • أجرِ تجربة داخلية بلا اتصال لمدة أسبوع. استخدم وضع الطيران في العمل المعتاد وسجّل كل موضع يمنعك فيه التطبيق. هذه متطلباتك الحقيقية.

البرمجيات المحلية أولاً ليست بديلاً عن السحابة، بل إعادة توزيع للعمل: يقوم الجهاز بقدر أكبر من العمل الذي يهم المستخدم، ويقوم الخادم بالتنسيق الذي يتقنه. الفرق التي تحسن هذا ستطلق تطبيقات تبدو أسرع وتصمد أمام الشبكات الرديئة، أما التي تعامل المزامنة كفكرة لاحقة فستظل تعرض دوّارات الانتظار.

مشاركة:
البرمجيات المحلية أولاً ومحركات المزامنة: دليل عملي | IRCNF | AIO APEX