الجواب القصير. كل ما يجب ألا يعطّل الشاشة، إرسالات وتصديرات وإعادة حسابات وتقارير وتذكيرات، يصير مهمة في طابور عمل مخزَّن في قاعدة البيانات، بأولوية واستحقاق وحمولة ومفتاح عدم تكرار. يأخذ منفّذ المهمة بقفلها بعقد بضع دقائق يجدده ما دام يتقدم ويسقط إن مات؛ ومنفّذان لا يأخذان المهمة نفسها أبداً. وحين تخفق المهمة تعيد المحاولة بعد انتظار يتضاعف، مسحوب عشوائياً في نافذة كي لا تنطلق ألف مهمة في الثانية نفسها، ومسقوف؛ والمفتاح يجعل ما أُنجز لا يُعاد. وبعد آخر محاولة تذهب المهمة إلى طابور إخفاقات بتنبيه، ويقرؤه إنسان كل صباح. وللمهام ذات الساعة الثابتة مستدرِك عند الإقلاع للساعات الفائتة، ومعدل للإرسالات، وسجل يقرؤه المسيّر عند 07:00. ستة أسابيع، أولها بلا كود.
يتوجه هذا الدليل إلى المسيّر الذي تخرج تذكيراته مرتين أو لا تخرج، وإلى المؤسس المقيم في فرنسا الذي ينتظر تقرير ليل لم يعد يصل، وإلى المسؤول الذي رأى تصدير المحاسبة يسقط ثلاث مرات متتالية. لا يعيد شرح أي قناة تحمل أي رسالة، الموصوف في دليل الإشعارات، ولا كيف يضع تطبيق ميداني كتاباته في طابور بلا شبكة، الموصوف في دليل العمل دون اتصال؛ بل يصف الآلة التي تشغّل من جهة الخادم كل ما لا شاشة له، ويمتد من صفحتنا عن هندسة البرمجيات.
مهام خلفية تصمد، في خمس طبقات
نص برمجي يطلقه النظام في منتصف الليل طبقة من خمس. والأربع الأخرى هي ما يجعله ينجح، أو يُعلمنا حين يخفق.
الطلبات. كل ما يجب ألا يعطّل الشاشة: إرسال 1200 تذكير، تصدير 50000 سطر، إعادة حساب المخزون، تقرير الاثنين، تذكيرات الدفع؛ تجيب الشاشة في ثانية بإنشاء مهمة بأولوية واستحقاق، وتنجز المهمة العمل خلفها. طابور العمل. جدول مهام في قاعدة البيانات بحالة وأولوية واستحقاق وحمولة ومفتاح عدم تكرار وعدد محاولات وعقد؛ يُنسخ الطابور مع القاعدة وفق دليل النسخ الاحتياطي، وهو ظاهر في التطبيق. التنفيذ. يقفل المنفّذ المهمة بعقد بضع دقائق، وينفذها بمدة قصوى، ويجدد العقد ما دام يتقدم، ويحرره إن مات؛ ومنفّذان لا يأخذان المهمة نفسها أبداً لأن قاعدة البيانات تمسك القفل.
الإعادات والإخفاقات. وهي الطبقة المميزة: الإخفاق يطلق إعادة بعد انتظار يتضاعف، مسحوب عشوائياً، مسقوف؛ ومفتاح عدم التكرار يجعل ما أُنجز لا يُعاد؛ وبعد آخر محاولة تذهب المهمة إلى طابور الإخفاقات ويُنبَّه أحد. الجدولة والقياس. للمهام ذات الساعة الثابتة مستدرِك عند الإقلاع؛ وللإرسالات معدل ممهَّد؛ وسجل يقول ما عمل، ولوحة تُظهر المهام المتأخرة والمخفقة والمنتظرة، وتنبيه ينطلق إن كبر الطابور، بروح دليل المراقبة.
ما يجب أن تجيده المهمة
ست خصائص لمهمة مبنية جيداً، والثالثة هي التي تجنّب الأسوأ.
أن تكون صغيرة: 1200 إرسال اثنتا عشرة مهمة من مئة؛ والتصدير دفعات؛ والمهمة القصيرة تُعاد بسرعة وتعيد القليل. أن تحمل مفتاحها: المهمة نفسها مأخوذة مرتين تنجز العمل مرة، والرسالة المرسلة لا تخرج ثانية، بالآلية الموصوفة في دليل العمل دون اتصال. أن تقفل نفسها: عقد يُجدَّد ويُحرَّر إن مات المنفّذ؛ وهذا ما يجنّب تذكيرين لكل زبون. أن تخفق بنظافة: السبب مكتوب، والانتظار قبل المحاولة التالية يتضاعف بعشوائية وسقف.
أن تحترم معدلاً: رسالة في الثانية نحو مزوّد الرسائل، تسع دفعات للتصدير، لا دفقة أبداً، لأن المزوّد يقطع الحساب الذي يرسل 1200 رسالة في عشر ثوانٍ؛ وتفصيل القنوات في دليل وكيل WhatsApp. أن تترك أثراً: بداية ونهاية ونتيجة ومحاولات يقرؤها المسيّر لا المطوّر وحده.
مهمة واحدة، من الطابور إلى النجاح أو إلى طابور الإخفاقات
يتتبع الشكل مهمة «إرسال 1200 تذكير WhatsApp» بينما مزوّد الرسائل غير متاح.
تُؤخذ المهمة وتُقفل؛ تخفق المحاولة الأولى لأن المزوّد يجيب بأنه غير متاح، لكن 380 رسالة كانت قد خرجت. تنتظر المحاولة الثانية ثلاثين ثانية زائد أو ناقص عشر عشوائياً؛ والثالثة دقيقتين زائد أو ناقص ثلاثين ثانية؛ والرابعة ثماني دقائق زائد أو ناقص دقيقتين وتنجح: 1200 أُرسلت، صفر تكرار، لأن مفتاح عدم التكرار، تذكير زائد موعد زائد تاريخ، يتخطى الـ 380 المرسلة. ولو لزمت محاولة خامسة لسُقف الانتظار عند ثلاثين دقيقة، وبعدها لذهبت المهمة إلى طابور الإخفاقات بتنبيه للمسؤول.
والعشوائية في الانتظار ليست تفصيلاً: حين يسقط مزوّد تخفق ألف مهمة في الثانية نفسها، وبلا عشوائية تعيد كلها المحاولة في الثانية نفسها فتُسقطه ثانية. وقد نشر فريق الهندسة المعمارية في Amazon Web Services توصية في هذا الشأن: انتظار أسي مسقوف مع عشوائية يفرّق الإعادات ويقلص عدد النداءات بوضوح. وطابور الإخفاقات يقرؤه إنسان كل صباح فيعيد أو يصحح؛ ولا يُفرَّغ بصمت أبداً. ومدد الشكل مثال مبني.
«المهمة التي تخفق لا تضيع ولا تُعاد إلى ما لا نهاية: تعيد المحاولة على فترات تتضاعف، مسحوبة عشوائياً، مسقوفة، وتنتهي في طابور يقرؤه إنسان.»
ست حالات حقيقية، وما يفعله التطبيق
الحالات الست التي نجدها في كل التطبيقات التي نستلمها تقريباً، والبناء الذي يحلها.
السطران الأولان يُحلان بالمستدرِك عند الإقلاع وبالقفل بعقد؛ والثاني الأكثر كلفة لأن تذكيرين لكل زبون يراهما 1200 زبون. والتاليان بالدفعات والإعادات: تصدير خلفي بدفعات يودع ملفاً ويرسل رابطاً، وانقطاع المزوّد يصير تأخر عشر دقائق لا خسارة. والأخيران بالمعدل الممهَّد والمدة القصوى بعقد منتهٍ. ولا واحد يُحل بمطوّر ينهض ليلاً ليعيد إطلاق نص.
ليلة خادم، على منفّذين
يُظهر الشكل ما يعمل بين 22:00 و07:00 على خادم مؤسسة صغيرة، على منفّذين، وثلاثة أشياء كانت ستسوء بلا الطابور.
ينجز المنفّذ أ المهام الثقيلة واحدة واحدة: النسخ الاحتياطي للقاعدة عند 22:00 الذي يمسك قفل «القاعدة»؛ إعادة حساب المخزون بعده مباشرة وفق دليل المخزون؛ التصدير المحاسبي بدفعات عند منتصف الليل نحو الصيغة التي ينتظرها المكتب وفق دليل الدمج؛ تحضير تقرير الاثنين عند 02:00، الفائت لأن الخادم أعاد التشغيل عند 02:04 والمستدرَك عند 02:15؛ تذكيرات مواعيد اليوم الـ 1200 عند 06:30 بدفعات من مئة، رسالة في الثانية، وفق دليل الحجز؛ التقرير المرسل إلى المسيّر عند 07:00. وينجز المنفّذ ب المهام القصيرة بالتوازي: تنظيف الملفات المؤقتة الذي ينتظر انتهاء النسخ الاحتياطي لأن القفل مأخوذ؛ تذكيرات الدفع عند 23:30؛ إعادة حساب مواعيد الأسبوع المقبل عند 05:30.
ثلاثة أشياء كانت ستسوء بلا الطابور: تقرير 02:00 لم يكن ليوجد ولا أحد كان ليعلم؛ التنظيف كان ليعمل أثناء النسخ الاحتياطي؛ التذكيرات الـ 1200 كانت لتخرج في عشر ثوانٍ ويُحجب الحساب. وكم منفّذاً وعلى أي آلة وأين قرار موصوف في دليل الاستضافة؛ وأوقات الشكل مثال مبني.
«للمهمة المجدولة ساعة، لكن أيضاً مستدرِك إن كان الخادم مطفأً، وقفل كي لا تعمل مرتين، ومعدل كي لا تُقطع، وسجل يقول عند 07:00 ما عمل.»
ما رأيناه في مكان آخر: توصية AWS حول الإعادات، وما ينتقل
ثلاث حقائق تنتقل كما هي. الانتظار الأسي مع العشوائية: أظهر فريق الهندسة المعمارية في Amazon Web Services بالمحاكاة أن مضاعفة الانتظار بين المحاولات تقلل التزاحم قليلاً ما دام العملاء يعيدون في الوقت نفسه، وأن العلاج إضافة العشوائية، وهو ما قسم عدد النداءات على أكثر من اثنين في محاكاتهم بمئة عميل؛ وما ينتقل هو جدول انتظار بعشوائية وسقف يُكتب في الأسبوع الأول. التسليم مرة على الأقل: طابور يضمن تنفيذ مهمة يضمن بذلك أنها قد تُنفَّذ مرتين بعد انقطاع في اللحظة الخطأ؛ وما ينتقل هو أن تحمل كل مهمة مفتاحاً ويكون عملها غير مكرِّر، مثل webhooks الدفع الموصوفة في دليل الدفع الإلكتروني. طابور الإخفاقات، أو الرسالة الميتة، الموجود في كل أنظمة الرسائل؛ وما ينتقل هو أن يقرأه إنسان لا أن يُخزَّن فقط.
ما لا تقرره هذه الحقائق عنكم: كم محاولة وأي سقف وأي معدل نحو مزوّدكم ومن يُنبَّه ومتى ينطلق التقرير؛ الأسبوع الأول من المشروع يجيب، والمسيّر يوقّع.
قواعد مهام خلفية تصمد
ست قواعد تُكتب في الأسبوع الأول. لا شيء طويل يعمل في الشاشة: كل شيء يصير مهمة. كل مهمة تحمل مفتاحاً وعملها غير مكرِّر. المهمة مقفولة بعقد يُجدَّد أو يُحرَّر. للإخفاق جدول: انتظار يتضاعف، عشوائية، سقف، ثم طابور إخفاقات وتنبيه. للإرسالات معدل مكتوب لكل مزوّد. ما عمل مقروء للمسيّر عند 07:00 مع ما لم يعمل.
وقاعدة منهج: نصوص الليل الموجودة لا تُعاد كتابتها دفعة واحدة؛ تصير مهاماً واحدةً واحدة بدءاً بالتي يكلّف إخفاقها الأكثر، وكل انتقال بسجله وفق دليل التسليم دون كسر.
ست شركات، والمهمة التي كانت ناقصة
ست حالات مركَّبة من مشاريع نصادفها؛ الأسماء عامة والأرقام أمثلة.
- عيادة طبية في الجزائر العاصمة، تذكيرات مواعيد. كانت التذكيرات تخرج مرتين بعض الصباحات لأن خادمين أطلقا النص نفسه. البناء: مهام من مئة إرسال، قفل بعقد، مفتاح لكل تذكير. توقف التكرار من اليوم الأول.
- تاجر جملة في سطيف، تصدير محاسبي. كان تصدير آخر الشهر يسقط في المتصفح فوق عشرة آلاف سطر. البناء: مهمة خلفية بدفعات، ملف مودَع، رابط مرسل إلى المكتب، استئناف عند الدفعة؛ والصيغة تتبع دليل الدمج.
- مؤسس في ليون، متجر إلكتروني في الجزائر. لم يعد تقرير الليل يصل بعد تحديث الخادم، واكتشف ذلك بعد ثلاثة أسابيع. البناء: مستدرِك عند الإقلاع، تنبيه إن لم ينطلق التقرير عند 07:15؛ والتسيير عن بعد يتبع دليل التجارة من فرنسا.
- منصة توصيل في وهران، إشعارات. قطع مزوّد SMS الحساب بعد دفقة من ألفي رسالة. البناء: معدل ممهَّد لكل مزوّد، دفعات، إعادات بعشوائية حين يكون غير متاح.
- موزع في قسنطينة، إعادة حساب المخزون. كانت إعادة حساب عالقة تمسك الطابور طوال الليل ولا شيء آخر يعمل. البناء: مدة قصوى، عقد منتهٍ يحرر المهمة ويسمها، طابور يتقدم.
- مؤسسة في عنابة، استيرادات الموردين. كانت استيرادات الأسعار تعمل في الشاشة وتسقط عند الانقطاع. البناء: استيراد مهمةً بدفعات باستئناف ومفتاح وفق دليل استيراد Excel.
تقويم 2027
ستة أسابيع لتطبيق له نصوص ليل وإرسالات أصلاً؛ والأسبوع الأول يمر بلا كود.
الأسبوع 1، جرد المهام: كل ما يعمل بلا شاشة، إرسالات وتصديرات وإعادة حسابات وتقارير وتذكيرات، بأولوية واستحقاق ومعدل ومدة قصوى ومن يُنبَّه؛ يوقّعه المسيّر. الأسبوع 2، الطابور والمنفّذون: جدول مهام في القاعدة، منفّذون، قفل بعقد، مدة قصوى، لوحة المهام في التطبيق. الأسبوع 3، الإعادات والإخفاقات: جدول انتظار بعشوائية وسقف، مفتاح عدم تكرار، طابور إخفاقات، تنبيه، إعادة يدوية.
الأسبوع 4، الجدولة: مهام بساعة ثابتة، مستدرِك عند الإقلاع، أقفال بين المهام، معدل ممهَّد للإرسالات. الأسبوع 5، ترحيل النصوص: نصوص الليل الموجودة تصير مهاماً واحدةً واحدة بسجلها؛ والإرسالات تمر بالطابور. الأسبوع 6، القياس: سجل الصباح، مهام متأخرة ومخفقة، حجم الطابور، سبب الإخفاق الأول للأسبوع، على لوحة القيادة وفق دليل لوحة القيادة الآنية. وكل أسبوع ينتهي بعرض.
ما يُفشل مهام الخلفية
خمسة أسباب رأيناها في تطبيقات نستلمها. نص منتصف الليل بلا أثر: يخفق بصمت ثلاثة أسابيع. الإرسال بنقرة: ينقر الموظف مرتين، أو ينقر موظفان. التصدير في المتصفح: ينقطع الاتصال ويضيع كل شيء. الإعادة الفورية اللانهائية: المزوّد الساقط يُطرق حتى يحجب الحساب. الطابور بلا إنسان: يكبر طابور الإخفاقات ولا أحد يقرؤه.
وسبب منهجي: معاملة كل مهمة حالة فريدة بنصها ومنطق إعادتها. طابور العمل آلة تُبنى مرة وتستعملها كل المهام.
أسئلة شائعة
الأسئلة التي يطرحها المسيّرون والمؤسسون حين يصفون لنا إرسالات تخرج مرتين وتقارير لا تخرج.
- لماذا لم ينطلق تقرير الليل؟
- غالباً لأن نصاً برمجياً يُطلق في ساعة ثابتة من النظام وكان الخادم يعيد التشغيل، أو لأن النص أخفق دون أن يُنبَّه أحد. والبناء الذي يحل ذلك: مهمة مجدولة في طابور، ومستدرِك عند الإقلاع يعيد الساعات الفائتة، وتنبيه إن لم ينطلق التقرير في الوقت المقرر زائد مهلة.
- لماذا خرجت الرسائل مرتين؟
- لأن خادمين أو نقرتين أطلقا الإرسال نفسه، أو لأن إعادة أرسلت رسائل خرجت أصلاً. والبناء: قفل بعقد في قاعدة البيانات كي لا تُؤخذ المهمة إلا مرة، ومفتاح عدم تكرار لكل رسالة كي لا تخرج رسالة مرسلة ثانية أبداً حتى بعد إعادة.
- ما طابور العمل؟
- جدول مهام في قاعدة البيانات بحالة وأولوية واستحقاق وحمولة ومفتاح وعقد، ومنفّذون يأخذون المهمة التالية ويقفلونها وينفذونها ويسجلون النتيجة. وكل ما يجب ألا يعطّل الشاشة يمر به: إرسالات، تصديرات، إعادة حسابات، تقارير، تذكيرات، استيرادات.
- كيف نعيد المحاولة دون تفاقم انقطاع المزوّد؟
- بانتظار يتضاعف بين المحاولات، مسحوب عشوائياً في نافذة كي لا تنطلق ألف مهمة في الثانية نفسها، ومسقوف. وهي التوصية التي نشرها فريق الهندسة المعمارية في Amazon Web Services. وبعد آخر محاولة تذهب المهمة إلى طابور الإخفاقات بتنبيه.
- ماذا يحل بمهمة تخفق نهائياً؟
- تذهب إلى طابور الإخفاقات بسببها وحمولتها وعدد محاولاتها، وينطلق تنبيه إلى المسؤول. ويقرأ إنسان هذا الطابور كل صباح فيعيد أو يصحح. ولا تُحذف بصمت أبداً.
- كم منفّذاً يلزم؟
- لمعظم المؤسسات الصغيرة يكفي اثنان: واحد للمهام الثقيلة واحدة واحدة، وواحد للمهام القصيرة بالتوازي؛ ونضيف حين يكبر الطابور، وهو رقم يُقاس لا يُخمَّن. وأين يعمل هؤلاء المنفّذون يتوقف على الاستضافة المختارة.
- كم من الوقت لإقامة ذلك؟
- ستة أسابيع في التقويم النموذجي: واحد لجرد المهام، وواحد للطابور والمنفّذين، وواحد للإعادات وطابور الإخفاقات، وواحد للجدولة، وواحد لترحيل النصوص الموجودة، وواحد للقياس. وتتوقف المدة على عدد النصوص الموجودة ومزوّدي الإرسال.