حول المحتوى:
شرح نمط Publish/Subscribe في RabbitMQ وكيف يستخدم لإرسال إشعارات إلى عدة خدمات في نفس الوقت.
نمط Publish/Subscribe في RabbitMQ من أقوى الأنماط لبناء أنظمة إشعارات مرنة وقابلة للتوسع. في هذا المقال سنشرح كيف تستخدم rabbitmq pub sub notifications لبناء نظام Broadcast يرسل إشعارات جماعية لعدة خدمات أو تطبيقات في نفس الوقت، مع توضيح الفكرة عمليًا من منظور هندسة البرمجيات.
إذا كنت مهتمًا بأنظمة الإشعارات يمكنك أيضًا الاطلاع على: تصميم نظام Notifications قابل للتوسع باستخدام Message Queues، وبناء نظام إشعارات Real-Time باستخدام RabbitMQ وWebSockets خطوة بخطوة.
نمط Publish/Subscribe (اختصارًا Pub/Sub) هو أسلوب تواصل في الأنظمة الموزعة يعتمد على فصل المرسل (Publisher) عن المستقبل (Subscriber). في RabbitMQ يتحقق هذا النمط من خلال:
في حالة الإشعارات الجماعية، نريد أن تُرسل رسالة واحدة (مثلاً: “تم إنشاء طلب جديد”) إلى عدة Queues في نفس اللحظة، وكل Queue تستهلكها خدمة مختلفة (إشعارات Email، إشعارات Push، Logging، Analytics...). هذا بالضبط ما يتيحه لنا نمط rabbitmq pub sub notifications.
استخدام RabbitMQ لنظام إشعارات جماعية يعطينا عدة فوائد مهمة:
لمن يريد التعمّق في التعامل مع الأخطاء، يُنصح بقراءة: كيفية التعامل مع الرسائل الفاشلة في Kafka وRabbitMQ باستخدام Dead Letter Queue.
في RabbitMQ يوجد عدة أنواع من Exchanges، أهمها في سياق Broadcast للإشعارات:
notifications.order.*.لنظام إشعارات جماعية بسيط (Broadcast لكل المستهلكين)، سنستخدم fanout exchange.
افترض أننا نريد بناء نظام إشعارات عند إنشاء طلب جديد في نظام E-commerce:
order.notifications من نوع fanout.email_notifications_queue مربوطة بـ order.notifications.push_notifications_queue مربوطة بنفس Exchange.analytics_notifications_queue تستقبل نفس الأحداث لأغراض التحليل.بهذا التصميم، رسالة واحدة منشورة من Order Service سيتم نسخها وتوزيعها (Broadcast) إلى جميع الـ Queues المربوطة بالـ Exchange، وكل خدمة تتصرف بحسب منطقها.
أول خطوة في نمط rabbitmq pub sub notifications هي تعريف Exchange من نوع fanout. يمكن ذلك من خلال واجهة الإدارة في RabbitMQ أو برمجيًا.
خصائص أساسية:
notifications.exchangefanouttrue حتى لا يختفي بعد إعادة تشغيل السيرفر.لكل خدمة تحتاج استقبال الإشعارات، ننشئ Queue خاصة بها:
email_notifications_queue للخدمة التي ترسل Emails.push_notifications_queue للخدمة التي ترسل Push Notifications.logging_notifications_queue أو analytics_notifications_queue لخدمات الـ Logging/Analytics.نراعي الآتي في تعريف الـ Queues:
بما أننا نستخدم fanout exchange، فلن نحتاج إلى Routing Key محدد؛ أي Binding بدون شرط. هذا يعني أن أي رسالة تصل للـ Exchange سيتم إرسالها لكل Queue مربوطة به.
email_notifications_queue بـ notifications.exchange.push_notifications_queue بـ notifications.exchange.analytics_notifications_queue بـ notifications.exchange.الـ Publisher هنا قد يكون أي خدمة أو API يقوم بإرسال إشعارات، مثلاً: خدمة تقوم بنشر إشعار عند تسجيل مستخدم جديد، أو عند إنشاء طلب، أو عند حدوث خطأ.
منطق الـ Publisher يكون على النحو التالي:
notifications.exchange.مثال لهيكل الرسالة:
{ "event": "order_created", "order_id": 12345, "user_id": 789, "created_at": "2026-04-14T12:00:00Z" }
لكل Queue نكتب Consumer متخصص في نوع معين من الإشعارات:
email_notifications_queue.push_notifications_queue.هذه المرونة تجعل إضافة Feature جديدة مثل “إرسال إشعار إلى Slack” مجرد إنشاء Queue جديدة وخدمة جديدة بدون تعديل الكود الموجود في الـ Publisher أو المستهلكين الآخرين.
في بعض الأحيان لا ترغب أن تستقبل كل الخدمات كل أنواع الإشعارات. هنا يأتي دور topic exchange في نمط rabbitmq pub sub notifications.
افترض أنواع إشعارات مختلفة:
notifications.order.creatednotifications.order.cancelednotifications.user.registerednotifications.user.password_resetيمكننا تعريف:
notifications.topic.exchange من نوع topic.email_notifications_queue مربوطة بالنمط notifications.user.* (فقط إشعارات المستخدمين).order_notifications_queue مربوطة بالنمط notifications.order.*.all_notifications_queue مربوطة بالنمط notifications.# لتستقبل كل شيء.بهذه الطريقة تحافظ على نمط Pub/Sub، لكن مع تحكم أدق في توزيع الرسائل؛ وهو مفيد جداً في الأنظمة الكبيرة متعددة المجالات (Domains).
نظام الإشعارات من الأنظمة الحساسة من حيث تجربة المستخدم، لذلك:
لأن نفس الرسالة قد يستخدمها أكثر من Consumer، يجب تصميم Message Schema جيد:
لضمان عمل نظام rabbitmq pub sub notifications بشكل مستقر يجب مراقبة:
يمكن استخدام RabbitMQ Management Plugin، أو حلول خارجية مثل Prometheus + Grafana لعرض Dashboard لحالة النظام.
نظام Broadcast للإشعارات غالبًا يكون جزءًا من منظومة أكبر: API، قاعدة بيانات، واجهات أمامية Web / Mobile، وخدمات خلفية (Microservices).
فكرة Pub/Sub تجعل إضافة قنوات جديدة (Email، SMS، Push، WebSocket، Slack…) مجرد خطوة في الـ Backend بدون أي تعديل في الكود الذي يقوم بنشر الإشعارات الأساسية.
نمط rabbitmq pub sub notifications مناسب في الحالات التالية:
أما إذا كان لديك فقط Service واحدة تحتاج الإشعار، ولا تخطط للتوسع، فربما لا تحتاج نمط Pub/Sub مع Exchange من نوع fanout ويمكنك الاكتفاء بـ Queue واحدة وDirect Exchange. لكن في الأغلب أنظمة الإشعارات بطبيعتها تتوسع وتتنوع، لذلك يعتبر Pub/Sub استثمارًا جيدًا على المدى الطويل.
باستخدام نمط Publish/Subscribe في RabbitMQ يمكنك بناء نظام Broadcast قوي ومرن للإشعارات الجماعية. الفكرة الأساسية هي نشر رسالة واحدة على Exchange من نوع fanout أو topic، وترك RabbitMQ يتكفّل بتوزيعها على عدة Queues، وكل Queue تخدم خدمة مختلفة (Email، Push، Analytics…).
هذا التصميم يوفّر:
إذا كنت تبني نظام إشعارات جديًّا، فاعتماد rabbitmq pub sub notifications كمعمارية أساسية سيسهّل عليك التطوير مستقبلاً، سواءً أضفت قنوات جديدة، أو خدمات تحليل، أو أنظمة مراقبة، أو حتى الانتقال إلى بنية Microservices كاملة.
شرح نمط Publish/Subscribe في RabbitMQ وكيف يستخدم لإرسال إشعارات إلى عدة خدمات في نفس الوقت.
مساحة اعلانية