العودة للمشاريع

الجدولة والإشعارات 2026

تذكيرات التجديد المجدولة

رسائل تذكير بالبريد تُطلق عبر CronJob في Kubernetes يستدعي نقطة الوظيفة مرة واحدة بمفتاح API، فتُنفَّذ مرة واحدة رغم تعدد نسخ الخدمة.

دوري
مطوّر خلفي · مشروع عمل
التقنيات
Java / Spring Boot / Kubernetes

شكل ٠٣ تنفيذ واحد عبر نسخ متعددة

  • N → 1 نسخ متعددة، واستدعاء واحد يصل إلى نسخة واحدة
  • API Key نقطة الوظيفة لا تقبل إلا طلبات الجدولة الموقّعة بالمفتاح
  • Event / Listener الإرسال مفصول عن الجدولة، بقوالب بريد قابلة لإعادة الاستخدام
رسم مبسّط ومعمّم لمشروع عمل — عدد النسخ في المحاكاة توضيحي. اقرأ الرسم
  1. CronJob في Kubernetes: يستدعي نقطة الوظيفة مرة واحدة في موعدها.
  2. مفتاح API: النقطة لا تقبل إلا الطلبات التي تحمل المفتاح المخزّن في Kubernetes — جرّب «طلب بلا مفتاح».
  3. Service في Kubernetes: يوجّه الطلب الواحد إلى نسخة واحدة من الخدمة، فلا تُنفَّذ الوظيفة إلا مرة.
  4. الحدث والمستمع: النسخة المنفّذة تنشر حدثًا، ومستمع منفصل يبني الرسالة من قالب قابل لإعادة الاستخدام.
  5. بريد العميل: رسالة واحدة لكل دورة. بدّل إلى «مُجدول داخل كل نسخة» لترى البديل الذي يتجنّبه التصميم.

مشروع عمل — حُذفت أسماء الجهات والتفاصيل الحساسة.

المشكلة

تذكيرات تجديد تُرسل بالبريد في موعدها. الخدمة تعمل بعدة نسخ داخل Kubernetes، وأي مُجدول داخل كل نسخة يعني أن كل نسخة ستُرسل التذكير نفسه — فيصل العميل البريد مرتين أو ثلاثًا.

دوري

بنيت الميزة: الجدولة، وضمان التنفيذ الواحد، وطبقة الإشعارات وقوالبها.

القرارات

  • الوظائف كنقاط نهاية: كل وظيفة مجدولة مكشوفة كنقطة في الخدمة، بدل مُجدول يعمل داخل كل نسخة.
  • استدعاء واحد لكل موعد: CronJob في Kubernetes يستدعي النقطة مرة واحدة، فيوجّه Service الطلب إلى نسخة واحدة — لا سباق بين النسخ، ولا حاجة إلى قفل.
  • مفتاح API: النقطة محمية بمفتاح مخزّن في Kubernetes، فلا يشغّل الوظيفة إلا الجدولة نفسها.
  • الحدث والمستمع: الوظيفة تنشر حدثًا، والإرسال يتولاه مستمع منفصل — فيمكن تغيير أحدهما دون الآخر.
  • قوالب قابلة لإعادة الاستخدام: محتوى الرسائل في قوالب بريد مستقلة عن منطق الإرسال.

ما يمكن إثباته

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

الحدود والدروس

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