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

دلالات الساعة يجب أن تكون صريحة

أول قرار هو أيّ ساعة تستعمل ولماذا. ساعة الحائط تمثّل الوقت المدنيّ لكنها قد تقفز للأمام أو للخلف عند المزامنة. والساعة الرتيبة تتقدّم دائمًا للأمام لكنها لا تمثّل وقتًا مدنيًّا. استعمال الساعة الخطأ لمهمّة ما مصدر علل خبيثة.

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

انحراف الساعة بين الأنظمة

في النظام الموزّع، لكل آلة ساعتها، وهذه الساعات لا تتطابق تمامًا. الفرق بينها، أي الانحراف، قد يكون صغيرًا لكنه كافٍ لكسر الافتراضات. حدث وقع «بعد» آخر وفق ساعة قد يبدو «قبله» وفق ساعة أخرى. الاعتماد على تزامن مثاليّ وهم.

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

الانتهاء يحتاج إلى هامش تسامح

الأنظمة التي تعتمد على انتهاء الصلاحية، مثل الرموز والجلسات والذاكرة المؤقّتة، يجب أن تتسامح مع انحراف الساعة. فرمز يُعتبَر منتهيًا على خادم وصالحًا على آخر بسبب فرق ثوانٍ في الساعة يولّد سلوكًا متذبذبًا يصعب تعقّبه.

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

الجدولة يجب أن تتوقّع التأخير

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

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

إعادة المحاولة تتطلّب عدم التأثّر بالتكرار

في الأنظمة الموزّعة، إعادة المحاولة حتمية. فرسالة قد تُرسَل مرّتين، ومهمّة قد تُنفَّذ أكثر من مرة بسبب فشل غامض في التأكيد. لذا يجب أن تكون العمليات غير متأثّرة بالتكرار، بحيث ينتج تنفيذها مرّتين النتيجة نفسها كأنها نُفِّذت مرة واحدة.

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

المهل والتراجع عند الفشل

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

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

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

المراقبة والتسجيل بوقت موحّد

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

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

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

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

ترتيب الأحداث في عالم غير متزامن

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

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