- docs/00-15: دراسة، بنية، محرك تعرفة، تسعير، نموذج استئجار، تكاملات، بيانات، realtime، خطة، devops، لاندنج، مخاطر، اصطلاحات سيرفر، تدفق نشر - backend/: NestJS 11 على Docker (health + tenants + عزل tenant_id + بادئة tripz_ + Redis DB 3) - apps/rider, apps/driver, dashboards/admin-web, dashboards/superadmin-web (هياكل) - sync-to-server.sh + .gitignore Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3.3 KiB
3.3 KiB
09 — الطبقة الحية (Realtime)
التقنية
- Socket.IO عبر
@nestjs/websocketsGateway. socket.io-redis-adapterللتوسع الأفقي (عدة نسخ من الباك إند تتشارك الحالة).- Redis للحضور (presence) والمطابقة الجغرافية (GEO commands).
المصادقة على الاتصال
- كل socket يحمل JWT +
tenant_id→ يُتحقق فيhandleConnection. - ينضم تلقائياً لغرف مُنطَّقة بالمستأجر:
tenant:{id}:...— لا تسريب بين المستأجرين.
القنوات (Namespaces / Rooms)
| القناة | من ← إلى | المحتوى | التردد |
|---|---|---|---|
driver:location |
السائق → الخادم | إحداثيات السائق | مجمّع كل 3–5 ثوانٍ |
trip:offers |
الخادم → السائقين المرشحين | عرض طلب جديد + مؤقت | عند الطلب |
trip:track |
الخادم → الراكب | موقع السائق + حالة الرحلة | عند التحديث |
dispatch:live |
الخادم → لوحة المشغّل | كل الطلبات/السائقين النشطين | مستمر |
trip:chat |
ثنائي | رسائل الدردشة | فوري |
المطابقة (Matching) — أقرب سائق مؤهل
1. موقع كل سائق متصل → Redis: GEOADD tenant:{id}:drivers
2. عند طلب: GEOSEARCH ضمن نصف قطر متزايد
3. فلترة: service_class مطابق + متصل + غير مشغول + مؤهل
4. ترتيب: الأقرب زمنياً (ETA من routing انطلق) لا مسافة خطية
5. بث العرض تسلسلياً/بالدفعات عبر trip:offers مع مؤقت قبول
6. أول قبول يفوز → trip.assign() → إلغاء بقية العروض
الحضور (Presence)
is_onlineوموقع السائق الجاري في Redis فقط (TTL) — لا Postgres.- عند الفصل: تنظيف من فهرس GEO ومن غرف الرحلة النشطة.
- إعادة الاتصال: يستعيد الحالة من مصدر الحقيقة (Postgres) + يعيد الانضمام للغرف.
التكامل مع آلة حالة الرحلة
- أحداث الـ socket تُترجم لأحداث في TripBloc (راكب) وOffersBloc (سائق) على الموبايل — 03.
- كل انتقال حالة يُكتب في
trip_events08 قبل البث — مصدر الحقيقة أولاً، ثم الإشعار.
المهام غير المتزامنة (BullMQ)
تُشغّل خارج مسار الـ realtime لتخفيف الضغط:
- انتهاء صلاحية العروض غير المقبولة (timeout).
- الإشعارات (FCM/SMS).
- التسويات، تجميع usage للفوترة، التقارير.
قواعد
- الخادم مصدر الحقيقة للحالة — العميل يعرض ما يصله، لا يقرر.
- تجميع مواقع السائقين (batch) لتقليل الضغط — لا بث لكل إحداثية.
- إعادة المحاولة والانقطاع الآمن — الشبكات الإقليمية متقلبة؛ تصميم offline-tolerant.
← السابق: 08-data-model · التالي: 10-roadmap