خط الدفع الذي لم يُحظر

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

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

المعمارية: الحملات مهام دفعات مجدولة

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

قطعتان كانتا بنيويتين لا خاصتين بحملة:

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

البوابات التي أدّت العمل

  1. الأهلية تُقيَّم وقت الإرسال. استعلام الجمهور يعمل حين تعمل المهمة — الانسحابات والحجوزات المكتملة والملفات المتقادمة تسقط طبيعيًا. الشروط المقيَّمة وقت الإدراج تتعفن؛ التقييم عند البوابة يعني ألا تراسل أحدًا عن شيء لم يعد صحيحًا.
  2. إزالة التكرار مدفوعة إلى استعلام الجمهور. «أُرسل من قبل» لم يكن فحصًا في التطبيق — بل بند NOT EXISTS مقابل جدول الإرسالات السابقة، فالمستخدم الذي استلم هذه الحملة لا يدخل الدفعة أصلًا. أرخص رفض ممكن: يُرشَّح التكرار قبل إنجاز سطر عمل واحد.
  3. سجل الإرسال نقطةَ استئناف. سجّلت المهام حالة كل إشعار ولم تنتقِ إلا الصفوف غير المكتملة. الحملة التي تموت في منتصف التشغيل يمكن إعادة تشغيلها دون إعادة الإرسال إلى نصف الجمهور الأول — أمان إعادة التشغيل خاصيةً للاستعلام، لا إجراءَ تعافٍ. مهام الدفعات تفشل؛ والخطوط التي تفترض العكس توقظك في أسوأ ساعة.
  4. خنق مقابل حصة المنصة، بهامش أمان. جرت الحملة الثقيلة على تجمع عمال محدود وتوقفت عمدًا بعد كل ألف دفعة، باقيةً بأريحية داخل حد المعدل المعلن لمنصة المراسلة، بدل الارتطام بالحد وابتلاع الأخطاء في منتصف الدفعة.

نالت القوالب الانضباط نفسه المعمول به في بقية المنصة: تُؤلَّف على الخادم وتُدار إصداراتها كالكود — رسالة حملة برابط عميق مكسور لا تُرقَّع، بل يُتحسَّر عليها.

البوابتان اللتان سأضيفهما اليوم

قسم الصراحة. حمايتان لم يمتلكهما هذا الخط، ودرس التصميم في كل منهما:

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

لم تحرقنا أي من الفجوتين فعليًا — الإيقاعات كانت محافظة والجماهير مقصوصة بعناية — لكن كلتيهما من نوع الضوابط التي تريدها قبل الحادثة التي تثبت أنك احتجتها.

النموذج الذهني

الدرس الباقي: عامل قناة المراسلة كميزانية عملتها صبرُ المستخدمين، تُنفَق عبر حصص المنصة. الحصص هي المنصة تخبرك بالسقف الصلب؛ وزر الحظر هو المستخدمون يخبرونك بالسقف الحقيقي، وهو أخفض. كل بوابة أعلاه — والبوابتان الغائبتان — وُجدت لإبقاء الإنفاق تحت السقف الثاني، لا الأول.

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