Files
tripz-llc/docs/09-realtime.md
T
HamzaandClaude Opus 4.8 95fea546f5 first commit: منصة Tripz — خطط كاملة + سكافولد باك إند NestJS/Docker
- 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>
2026-07-16 15:22:06 +03:00

3.3 KiB
Raw Blame History

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.
  • كل انتقال حالة يُكتب في trip_events 08 قبل البث — مصدر الحقيقة أولاً، ثم الإشعار.

المهام غير المتزامنة (BullMQ)

تُشغّل خارج مسار الـ realtime لتخفيف الضغط:

  • انتهاء صلاحية العروض غير المقبولة (timeout).
  • الإشعارات (FCM/SMS).
  • التسويات، تجميع usage للفوترة، التقارير.

قواعد

  • الخادم مصدر الحقيقة للحالة — العميل يعرض ما يصله، لا يقرر.
  • تجميع مواقع السائقين (batch) لتقليل الضغط — لا بث لكل إحداثية.
  • إعادة المحاولة والانقطاع الآمن — الشبكات الإقليمية متقلبة؛ تصميم offline-tolerant.

← السابق: 08-data-model · التالي: 10-roadmap