خادم المستندات:التعامل مع عمليات الحفظ المتزامنة

StackOverflow https://stackoverflow.com/questions/9675

  •  08-06-2019
  •  | 
  •  

سؤال

أقوم بتنفيذ خادم المستندات.حاليًا، إذا فتح مستخدمان نفس المستند، ثم قاما بتعديله وحفظ التغييرات، فستكون حالة المستند غير محددة (إما أن يتم حفظ تغييرات المستخدم الأول بشكل دائم، أو تغييرات المستخدم الثاني).وهذا غير مرض تماما.لقد فكرت في احتمالين لحل هذه المشكلة:

الأول هو قفل المستند عندما يفتحه شخص ما للمرة الأولى، وفتحه عند إغلاقه.ولكن إذا انقطع اتصال الشبكة بالخادم فجأة، فسيظل المستند في حالة مقفلة إلى الأبد.الحل الواضح هو إرسال أصوات منتظمة إلى الخادم.إذا لم يتلق الخادم أصوات K على التوالي (K > 1) من عميل معين، فسيتم إلغاء قفل المستندات التي تم قفلها بواسطة هذا العميل.إذا ظهر هذا العميل مرة أخرى، فسيتم قفل المستندات مرة أخرى، إذا لم يكن شخص ما قد قام بقفلها بالفعل.يمكن أن يساعد هذا أيضًا في حالة إنهاء تطبيق العميل (الذي يعمل في متصفح الويب) بشكل غير متوقع، مما يجعل من المستحيل إرسال إشارة "إنهاء، فتح مستنداتي" إلى الخادم.

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

ما هي الطريقة التي يجب أن أختارها، مع الأخذ في الاعتبار أن الاتصال بالخادم قد يكون كذلك أحيانا تكون بطيئة وغير مستجيبة؟كيف ينبغي تحديد المعلمات (فاصل ping، فاصل التعاقب السريع)؟

ملاحظة.لسوء الحظ، لا أستطيع تخزين المستندات في قاعدة البيانات.

هل كانت مفيدة؟

المحلول

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

إذا فتح المستخدم الثاني (كيت) المستند بينما كان بوب لديه القفل، فستتلقى كيت رسالة تفيد بأن المستند غير قابل للتحرير ولكن يمكنها قراءته حتى يتم تحرير القفل.

فماذا يحدث عندما يحصل بوب على القفل، ربما يحفظ المستند مرة أو مرتين ثم يخرج من التطبيق ويترك القفل معلقًا؟

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

يمكن أن يحتوي اختبار ping على اسم المستند الذي قام العميل بقفله، ويمكن للخادم حساب وقت تلقي آخر اختبار ping لذلك المستند.

نصائح أخرى

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

بافتراض أن التنافس منخفض نسبيًا و/أو أن حجم كل تغيير صغير إلى حد ما، فمن المحتمل أن أختار نموذجًا متفائلًا يعمل على حل التعارضات باستخدام الدمج التلقائي أو اليدوي.يمكن استخدام رقم الإصدار أو المجموع الاختباري لمحتويات المستند لتحديد ما إذا كان الدمج مطلوبًا.

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

عند الحديث عن النموذج المتشائم، يمكن تجنب سيناريو "العميل الأيسر المتصل لمدة N من الأيام" عن طريق تعيين تاريخ انتهاء القفل، على سبيل المثال، قبل يوم واحد من تاريخ بدء القفل.نظرًا لأن المستندات التي يتم تحريرها ليست مهمة بأي حال من الأحوال، ويتم تعديلها بواسطة مستخدمين متعددين نادرًا جدًا، فقد يكون ذلك كافيًا.

والآن فكر في النموذج المتفائل.كيف ينبغي اكتشاف الاختلافات، إذا كانت المستندات تحتوي على بنية منتظمة (على سبيل المثال، هرمية)؟ان لم؟ما هي فرص نجاح الدمج التلقائي في هذه الحالات؟

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

ماذا تعتقد؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top