Rejoignez la communauté Développeurweb.com et bénéficiez de l’expérience de membre complète.
Rejoignez gratuitement
Les implémentations populaires du service de covoiturage sont les suivantes :
Exigences
- Le conducteur peut voir tous les conducteurs disponibles à proximité
- Le chauffeur peut accepter une course demandée par le passager
- L’emplacement actuel du passager et du conducteur doit être publié en permanence sur la confirmation de voyage
Stockage de données
Schéma de base de données
- Les principales entités sont les passagers, les chauffeurs, les véhicules et les tables de trajets
- La relation entre les conducteurs et la table des véhicules est de 1 à plusieurs
- La relation entre les conducteurs et la table des trajets est de 1 à plusieurs
- La relation entre le tableau des passagers et des trajets est de 1 à plusieurs
- La table des trajets est une table de jointure pour représenter la relation entre les passagers et les chauffeurs
Type de magasin de données
- Le magasin de données à large colonne (basé sur l’arborescence LSM) tel qu’Apache Cassandra est utilisé pour conserver les données de localisation chronologiques du client (conducteur et conducteur)
- Le serveur de cache tel que Redis est utilisé pour stocker l’emplacement actuel du conducteur et du pilote pour des recherches rapides
- Une file d’attente de messages telle qu’Apache Kafka est utilisée pour gérer le trafic important
- Une base de données relationnelle telle que Postgres stocke les métadonnées des utilisateurs
Conception de haut niveau
- Le DNS redirige les requêtes du client (cavalier et chauffeur) vers les centres de données à proximité
- Le client (coureur et conducteur) met à jour les magasins de données avec Geohash de leur emplacement en temps réel
- WebSocket est utilisé pour la communication bidirectionnelle en temps réel entre le pilote et le conducteur
- Un hachage cohérent est utilisé pour partitionner géographiquement les magasins de données
Chemin d’écriture
- Le client (conducteur) crée une connexion WebSocket sur l’équilibreur de charge pour publier l’emplacement actuel (latitude, longitude) du conducteur en temps réel
- L’équilibreur de charge utilise l’algorithme round-robin pour déléguer la connexion du client à un serveur disposant d’une capacité libre dans le centre de données à proximité
- Le géohash de l’emplacement du conducteur est conservé dans la file d’attente des messages pour gérer le trafic important
- Le géohash de l’emplacement du conducteur est stocké dans le magasin de données à large colonne pour plus de durabilité
- Le Geohash est stocké sur le cache de localisation de points pour fournir des mises à jour de localisation en temps réel
- Le client (cavalier) crée une connexion WebSocket sur l’équilibreur de charge pour publier l’emplacement actuel (latitude, longitude) du cavalier en temps réel
- L’équilibreur de charge utilise l’algorithme round-robin pour déléguer la connexion du client à un serveur disposant d’une capacité libre dans le centre de données à proximité
- Le Geohash de l’emplacement du passager est conservé dans la file d’attente des messages pour gérer le trafic intense
- Le service d’analyse (basé sur MapReduce) interroge le magasin de données à large colonne pour générer des analyses hors ligne sur les données de trajet.
- Le service de contrôleur empêche les points d’accès en repartitionnant automatiquement les services avec état
- Le cache de localisation des points est dénormalisé par la génération de Geohash multi-caractères pour améliorer les performances de lecture (fournit une fonctionnalité de zoom)
- Le serveur détenant la connexion WebSocket du passager interroge le cache de localisation des points pour identifier les chauffeurs disponibles à proximité
- Comme approche naïve, la distance euclidienne peut être utilisée pour trouver les véhicules les plus proches dans un Geohash
- Le partage des services peut être mis en œuvre à plusieurs niveaux, tels que le niveau de la ville, le partage géographique pour plus de granularité et le niveau du produit (capacité du véhicule)
- Les hotspots sont gérés via la réplication et le partitionnement supplémentaire des services avec état par l’ID du pilote
- Le magasin de données à larges colonnes est optimisé pour les écritures, tandis que le serveur de cache est optimisé pour les lectures
- Le magasin de données à larges colonnes est répliqué sur plusieurs centres de données pour plus de durabilité
- La politique LRU est utilisée pour expulser le serveur de cache
Chemin de lecture
Conducteur acceptant une demande de déplacement
- Le client (pilote) crée une connexion WebSocket sur l’équilibreur de charge pour recevoir des mises à jour sur les demandes de trajet en temps réel
- L’équilibreur de charge utilise l’algorithme round-robin pour déléguer la connexion du client à un serveur disposant d’une capacité libre dans le centre de données à proximité
- Le serveur qui détient la connexion WebSocket du conducteur doit acquérir un verrou distribué pour gérer les problèmes de simultanéité lors de l’acceptation des demandes de trajet de passagers uniques simultanés.
- Le serveur détenant la connexion WebSocket du conducteur invoque le service de voyage pour confirmer le voyage
- Le service de voyage interroge le serveur pub-sub pour créer un canal de communication un à un entre le conducteur et le passager
- Le serveur publie les mises à jour de localisation par le pilote sur le serveur pub-sub
- Le serveur pub-sub conserve les données de localisation du conducteur dans le magasin de données de trajet pour plus de durabilité
- Le serveur pub-sub délègue les mises à jour de localisation par le conducteur au serveur qui détient la connexion WebSocket du conducteur en utilisant le modèle de publication-abonnement
- Le serveur délègue la mise à jour de l’emplacement du conducteur à l’équilibreur de charge qui détient la connexion WebSocket du conducteur
- Les mises à jour de l’emplacement du conducteur sont publiées pour le passager
- L’état du trajet est mis en cache sur le client (passager et conducteur) pour un repli vers un autre centre de données
- Chaos Engineering peut être utilisé pour les tests de résilience
- Services gossip protocol l’état pour une haute disponibilité
Magasin de données
Base de données
Base de données relationnelle
Stockage de données
Conception de systèmes