حول المحتوى:
شرح عملي لبناء نظام إشعارات لحظية باستخدام RabbitMQ وربطه مع WebSockets لإرسال التنبيهات فورياً للمستخدمين.
في هذا المقال سنبني نظام إشعارات لحظي (Real-Time Notifications) باستخدام RabbitMQ كـ Message Broker، وWebSockets كقناة اتصال مستمرة مع المتصفح، بحيث تصل التنبيهات فورياً للمستخدمين بدون إعادة تحميل الصفحة.
المقال موجه للمطورين الذين لديهم معرفة أساسية بالباك إند (Python/Node.js/غيرها)، ويريدون فهم كيفية ربط RabbitMQ real time notifications مع WebSockets في بنية منظمة وقابلة للتوسع.
إذا كنت مهتماً أكثر بتكامل RabbitMQ مع FastAPI أو العمل مع WebSockets في FastAPI، يمكنك لاحقاً الرجوع إلى:
قبل الدخول في التفاصيل، لنفهم مشكلة الإشعارات اللحظية في الأنظمة الحديثة:
هنا تأتي فكرة الجمع بين:
النتيجة: بنية نظيفة، فيها فصل واضح بين توليد الإشعار (من أي خدمة) وإرسال الإشعار فعلياً للمستخدم عبر WebSocket.
لنصمم أولاً المعمارية (Architecture) قبل كتابة أي كود. الفكرة الأساسية:
يمكن الاستفادة من البنية العامة لأنظمة Real-Time الموضحة في مقال: بنية أنظمة الدردشة اللحظية: من WebSockets إلى Message Queues، فهي مشابهة جداً لما نريده هنا.
أول خطوة عملية هي تعريف كيفية تمرير رسائل الإشعار داخل RabbitMQ. غالباً سنحتاج:
notifications.exchange.أكثر الأنواع شيوعاً لحالة الإشعارات:
user.123 أو email.notifications.user.123 أو notifications.group.admins.في أنظمة الإشعارات المتوسطة إلى الكبيرة، topic exchange خيار ممتاز. مثلاً:
notifications.exchange من نوع topic.user.<user_id> أو group.<group_name>.الرسالة التي سترسلها الخدمات إلى RabbitMQ يفضل أن تكون JSON موحد الشكل، مثل:
{
"user_id": 123,
"title": "لديك رسالة جديدة",
"body": "قام أحمد بإرسال رسالة لك",
"type": "new_message",
"link": "/messages/456",
"created_at": "2026-04-13T10:00:00Z"
} يمكن أيضاً إضافة حقول أخرى مثل الأولوية، أو بيانات إضافية حسب نوع الإشعار.
هذه الخدمة هي قلب نظام RabbitMQ real time notifications. وظيفتها:
لنفرض أن لدينا Queue اسمها notifications.websocket.queue مربوطة بالـ Exchange باستخدام نمط Routing مثل user.*. منطق العمل:
notifications.websocket.queue.user_id أو قائمة user_ids.يمكن كتابة هذه الخدمة بأي لغة: Python، Node.js، Go، إلخ. المهم هو الحفاظ على:
حتى يستطيع السيرفر إرسال إشعار للمستخدم الصحيح، يجب أن يعرف:
في تطبيق الويب (React/Vue/Angular أو حتى Vanilla JS)، نفتح اتصال WebSocket إلى السيرفر:
const socket = new WebSocket("wss://example.com/ws/notifications");
socket.onopen = () => {
// إرسال توكن JWT أو Session ID للتعريف بالمستخدم
socket.send(JSON.stringify({
type: "auth",
token: "USER_JWT_TOKEN"
}));
};
socket.onmessage = (event) => {
const data = JSON.parse(event.data);
// التعامل مع الإشعار
console.log("New notification:", data);
}; في السيرفر، أول رسالة من العميل ستكون من نوع auth. المنطق:
token (JWT أو Session).user_id.user_id.يمكن تمثيل الخريطة كالتالي (كمبدأ عام):
user_connections = {
123: [ws_connection_1, ws_connection_2],
456: [ws_connection_3]
} هكذا إذا كان المستخدم فاتح التطبيق في تبويبين، سيحصل على الإشعار في الاثنين معاً.
في الأنظمة القابلة للتوسع، ستحتاج بنية أقرب لما شرحناه في: تصميم نظام Notifications قابل للتوسع باستخدام Message Queues.
لنمر على السيناريو كامل خطوة بخطوة، لنفهم كيف يعمل نظام RabbitMQ real time notifications في حالة حقيقية، مثل: وصول رسالة جديدة في نظام دردشة.
{
"user_id": 2001, // سارة
"title": "رسالة جديدة",
"body": "أحمد: كيف حالك؟",
"type": "chat_message",
"link": "/chat/room/123",
"created_at": "2026-04-13T10:20:00Z"
} notifications.exchange مع Routing Key user.2001.notifications.websocket.queue مربوطة مع نمط user.*، فتصلها الرسالة.user_id = 2001.{
"event": "notification",
"data": {
"title": "رسالة جديدة",
"body": "أحمد: كيف حالك؟",
"type": "chat_message",
"link": "/chat/room/123",
"created_at": "2026-04-13T10:20:00Z"
}
} onmessage، يعرض إشعار في الواجهة (Badge، Popup، تغيير لون الأيقونة…).واحدة من أهم مميزات استخدام RabbitMQ في نظام الإشعارات هي تحسين الموثوقية والتعامل مع الفشل الجزئي.
أسباب الفشل قد تكون:
بعض الاستراتيجيات للتعامل مع ذلك:
من ناحية RabbitMQ نفسه، تأكد من:
لأننا نتعامل مع WebSockets وMessages، يجب الانتباه لعدة نقاط أمنية:
user_id من RabbitMQ يتطابق فعلياً مع الاتصال الحالي.عندما يكبر النظام ويبدأ في استقبال آلاف أو ملايين الإشعارات في اليوم، القابلية للتوسع تصبح أولوية.
دائماً اجعل إرسال الإشعار عملية غير متزامنة (Asynchronous) عن منطق الأعمال:
هذا الفصل يسهل صيانة الكود، ويسمح لك بتغيير طريقة الإرسال (WebSockets، Email، Push…) بدون لمس الخدمات الأخرى.
يمكنك توزيع الأحمال هكذا:
notifications.websocket.queue: للإشعارات اللحظية على الويب.notifications.email.queue: للإشعارات عبر البريد.notifications.mobile.queue: لـ Push Notifications.كل Queue يمكن أن تستهلكها خدمة مستقلة، وبذلك يمكن توسيع كل نوع إشعارات بشكل منفصل.
بعض الإشعارات حرجة (Critical) ويجب أن تصل في أعلى أولوية، مثل: عمليات مالية، تنبيهات أمان، إلخ. يمكنك:
بعض المؤشرات المهمة:
الـ Management Plugin في RabbitMQ يقدم واجهة ممتازة للمراقبة، ويمكنك أيضاً إضافة Prometheus + Grafana لو أردت مراقبة أعمق.
بعد فهم فكرة RabbitMQ real time notifications مع WebSockets، تستطيع تطبيقها في عدة سيناريوهات:
لو كنت تعمل مع Django أو FastAPI، يمكنك الجمع بين مقالات:
وتبني منها نظام إشعارات متكامل بالاعتماد على ما شرحناه هنا من معمارية وخطوات.
بناء نظام إشعارات Real-Time باستخدام RabbitMQ وWebSockets يمنحك:
الخطوات الأساسية التي رأيناها:
يمكنك البدء بنسخة مبسطة لهذا النظام في مشروعك التجريبي، ثم تطويره تدريجياً بإضافة التخزين في قاعدة البيانات، دعم قنوات أخرى، وتوسعة البنية لتصبح جاهزة للإنتاج.
شرح عملي لبناء نظام إشعارات لحظية باستخدام RabbitMQ وربطه مع WebSockets لإرسال التنبيهات فورياً للمستخدمين.
مساحة اعلانية