- 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>
52 lines
3.3 KiB
Markdown
52 lines
3.3 KiB
Markdown
# 09 — الطبقة الحية (Realtime)
|
|
|
|
## التقنية
|
|
- **Socket.IO** عبر `@nestjs/websockets` Gateway.
|
|
- **`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](03-mobile-plan.md).
|
|
- كل انتقال حالة يُكتب في `trip_events` [08](08-data-model.md) قبل البث — مصدر الحقيقة أولاً، ثم الإشعار.
|
|
|
|
## المهام غير المتزامنة (BullMQ)
|
|
تُشغّل خارج مسار الـ realtime لتخفيف الضغط:
|
|
- انتهاء صلاحية العروض غير المقبولة (timeout).
|
|
- الإشعارات (FCM/SMS).
|
|
- التسويات، تجميع usage للفوترة، التقارير.
|
|
|
|
## قواعد
|
|
- **الخادم مصدر الحقيقة للحالة** — العميل يعرض ما يصله، لا يقرر.
|
|
- **تجميع مواقع السائقين** (batch) لتقليل الضغط — لا بث لكل إحداثية.
|
|
- **إعادة المحاولة والانقطاع الآمن** — الشبكات الإقليمية متقلبة؛ تصميم offline-tolerant.
|
|
|
|
← السابق: [08-data-model](08-data-model.md) · التالي: [10-roadmap](10-roadmap.md)
|