سؤال

أقول لدي العميل العداد متغير.عند إرسال طلب إلى الخادم, أرسل هذا المتغير قيمة ، ثم زيادة من (التالي طلب إلى الخادم).الخادم بتتبع هذا العداد independantly و التحقق للتأكد من أن العد المرسلة من قبل العميل هو 1 أكثر من نفسه (server-side) نسخة من العد.هذا هو كل شيء على ما يرام ومدهش ، ولكن النظر في الحالة التالية:

  1. يرسل العميل, يقول, 23 إلى الملقم.
  2. الملقم يتلقى 23, يؤكد, و الزيادات الخاصة العداد 23.
  3. الملقم بإرجاع كل شيء-حسنا التعليمات البرمجية العميل

-ولكن-

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

لا أحد يعرف أي قوة المخططات التي من شأنها العمل في مواجهة هذا الفساد ممكن/الأخطاء ؟

شكرا
كاميرون

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

المحلول

بدلا من استخدام خطيا زيادة العداد ، يمكنك استخدام عشوائي "حالية" قيمة جيدة 64 بت من الكون أو أكثر.عندما يستلم الملقم طلب من العميل الملقم التحقق لمعرفة ما إذا كانت حالية المباريات الأخير أرسل العميل.إذا كان الأمر كذلك, ثم معالجة الطلب و ينشئ ملقم جديد عشوائية قيمة حالية لإرسال في الاستجابة.

الخادم يمكن أن تبقي الماضيين حالية القيم أن ترسل إلى العميل.إذا كان العميل يرسل القيمة القديمة ، ثم الملقم يفترض أن أحدث رسالة إلى العميل قد فقدت.

الأسلوب أعلاه يفترض أن هدفك هو منع اثنين من مختلف العملاء من استخدام نفس بيانات الاعتماد إلى التواصل مع الخادم.وميزة استخدام حالية الأسلوب هو أن القيمة التالية لا يمكن بسهولة توقع.

نصائح أخرى

الجواب السهل هو جعل العميل أو الخادم صاحب المورد, بدلا من جعل كلا الخاصة نسخته من الموارد.

إذا كنت تستخدم موثوقة مثل بروتوكول TCP على الرغم من أنك لا داعي للقلق حول رسالة عدم الحصول على العميل.

شيء جيد أن تتبع عند القيام العميل/الخادم العمل على الرغم من أن كل العمليات idempotent.وهذا هو القول كل وظيفة يمكن أن يسمى واحدة أو عدة مرات دون أي آثار جانبية.في هذه الحالة لن يكون 'زيادة' وظيفة على الإطلاق.بدلا من ذلك سيكون لديك 'set' وظيفة.

ماذا عن عدم وجود العميل تحديث النسخة المحلية حتى تسلم الخادم تحديث الخادم العداد.

لذلك:

العميل بحساب القيمة التالية يرسل العميل القيمة التالية إلى الملقم يتحقق الملقم التالية قيمة صالحة (لا ينظر بالفعل) Server التحديثات العداد إلى القيمة التالية (إذا لزم الأمر) خادم بإعلام العميل أن القيمة قد تلقى عميل التحديثات المحلية العداد إلى القيمة التالية

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

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

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