Conception de l'application Split Bill : un guide pour créer une expérience transparente de type Splitwise
Si vous vivez avec des colocataires qui partagent le coût des services publics, de l'épicerie et du loyer, vous devrez peut-être suivre manuellement chaque dépense et calculer le montant que chaque personne doit. Cela peut impliquer de suivre les reçus, de consigner les dépenses dans une feuille de calcul et d'effectuer manuellement des calculs pour répartir les coûts.
Ce processus manuel peut entraîner des erreurs et des incohérences, en particulier si certaines personnes oublient d'enregistrer les dépenses ou s'il y a des différends sur le montant que chaque personne doit. Le suivi et la gestion manuelle des dépenses peuvent également prendre du temps, en particulier si le groupe est important ou s'il y a plusieurs dépenses à suivre au fil du temps.
L'application Split-bills comme "Splitwise" simplifie le processus de suivi des dépenses partagées en automatisant de nombreux calculs et en fournissant une vue claire du solde de chaque utilisateur. Les utilisateurs peuvent rapidement et facilement ajouter des dépenses à la plateforme, et Splitwise se chargera des calculs pour déterminer combien chaque personne doit. Cela peut aider à réduire les erreurs et les litiges, et faciliter la gestion des dépenses partagées dans le temps.
En tant que praticien du logiciel, comment concevez-vous un tel système à haut niveau ?
Exigences fonctionnelles
- Les utilisateurs doivent pouvoir créer des comptes et se connecter en toute sécurité.
- Les utilisateurs doivent pouvoir créer et gérer des groupes pour le suivi des dépenses.
- Les utilisateurs doivent pouvoir ajouter des dépenses à un groupe et les répartir entre les membres du groupe.
- Les utilisateurs doivent pouvoir visualiser et gérer leurs propres dépenses et soldes.
- Les utilisateurs doivent pouvoir régler leurs dettes avec les autres membres du groupe.
- Le système doit être hautement disponible et capable de gérer les pics de trafic soudains.
- Le système doit avoir une latence et un temps de réponse faibles pour offrir une bonne expérience utilisateur.
- Le système doit être évolutif et capable de gérer un grand nombre d'utilisateurs et de groupes.
- Le système doit être sécurisé, avec un cryptage fort pour les données utilisateur sensibles.
- Le système doit être facile à utiliser et intuitif pour les utilisateurs de tous les horizons techniques.
- Le système sera conçu pour une plate-forme Web/mobile.
- Le système s'intégrera à un service de traitement des paiements tiers pour le règlement des dettes.
- Le système n'inclura pas de fonctionnalités telles que la budgétisation ou le suivi financier au-delà du suivi des dépenses et des soldes.
- Le système sera conçu pour gérer jusqu'à 1 million d'utilisateurs enregistrés et 100 000 groupes actifs.
- Chaque groupe peut compter jusqu'à 100 membres, chaque membre créant en moyenne 10 dépenses par mois.
- Chaque dépense peut avoir jusqu'à 10 transactions pour répartir le coût entre les membres du groupe.

Description de la conception
Le système sera basé sur une architecture client-serveur, avec une application web ou mobile servant de client et un ensemble de serveurs fournissant les services back-end. L'équilibreur de charge répartira les demandes entrantes de manière uniforme sur un ensemble de serveurs Web pour garantir une haute disponibilité et une évolutivité. Les serveurs Web traiteront les requêtes HTTP entrantes et renverront la réponse appropriée au client. Le serveur d'applications gérera la logique métier du système, y compris le traitement des transactions, la gestion des comptes d'utilisateurs et l'envoi de notifications. La base de données stockera les données de l'utilisateur, y compris les informations sur le compte de l'utilisateur, les détails des transactions et l'historique des règlements.
- Le client peut être une application Web ou mobile qui communiquera avec le serveur via une requête HTTP.
- En utilisant une passerelle API, Application peut simplifier la gestion de son trafic API et fournir une couche de sécurité et de contrôle sur les interactions entre les différents composants du système. Il fournit un point de contrôle central pour la gestion des demandes et des réponses API entre le client frontal, les serveurs principaux et le cache. Il exécute des fonctions telles que l'authentification et l'autorisation de haut niveau, la limitation du débit et la traduction de protocole.
- L'équilibreur de charge est chargé de distribuer les requêtes entrantes aux serveurs Web pour garantir une haute disponibilité et une évolutivité.
- Les serveurs Web gèrent les requêtes HTTP entrantes du client et envoient les requêtes API au serveur d'applications.
- Le serveur d'applications gère la logique métier du système et interagit avec la base de données pour récupérer ou stocker les données utilisateur.
- La base de données stocke les données des utilisateurs, y compris les informations de compte d'utilisateur, les détails des transactions et l'historique des règlements.
- L'utilisation d'un cache comme Redis peut grandement améliorer les performances de cette application en réduisant le nombre de requêtes de base de données. Cependant, cela ajoute de la complexité au système, car le cache doit être synchronisé avec la base de données, et le cache peut devenir une source de données obsolètes s'il n'est pas correctement géré. Dans l'ensemble, l'ajout d'un cache comme Redis peut être un bon compromis pour les performances, tant que les avantages sont mis en balance avec la complexité supplémentaire et les frais de gestion.
- Cache-Aside : il s'agit d'un modèle courant dans lequel le serveur d'applications vérifie d'abord dans le cache les données dont il a besoin. Si les données ne sont pas trouvées dans le cache, le serveur d'applications les récupère de la base de données, met à jour le cache avec les nouvelles données, puis renvoie les données au client. Cela garantit que les données dans le cache sont toujours à jour.
- Écriture immédiate : dans ce modèle, le serveur d'applications met à jour le cache et la base de données en même temps. Cela garantit que les données des deux emplacements sont toujours synchronisées. Cependant, cette approche peut introduire une latence supplémentaire en raison de la nécessité d'écrire aux deux emplacements.
- Invalidation du cache : dans ce modèle, le serveur d'applications met à jour la base de données comme d'habitude, mais au lieu de mettre à jour le cache directement, il marque les données mises en cache comme non valides. La prochaine fois que les données sont demandées, le serveur d'application les récupère de la base de données et met à jour le cache avec les nouvelles données. Cette approche garantit que les données dans le cache sont toujours à jour, mais peut entraîner des requêtes de base de données supplémentaires si les données mises en cache sont fréquemment invalidées.
Business Logic (Plus d'informations dans le LLD à venir - Lien à déterminer)
- Les utilisateurs peuvent créer un compte et rejoindre des groupes.
- Les utilisateurs peuvent ajouter des transactions à des groupes et spécifier comment elles doivent être réparties entre les membres du groupe.
- Le système calculera la part des dépenses de chaque membre et mettra à jour leurs soldes en conséquence.
- Les utilisateurs peuvent régler leurs dettes entre eux en lançant un paiement via une passerelle de paiement ou en transférant de l'argent
- Pour le backend, nous utiliserons Node.js, un environnement d'exécution JavaScript populaire et évolutif. Nous utiliserons également Express, un framework d'application Web léger, pour gérer les requêtes et les réponses HTTP.
- Pour la base de données, nous utiliserons PostgreSQL, un système de gestion de base de données relationnelle robuste et évolutif. PostgreSQL prend en charge les requêtes complexes et peut gérer un grand nombre de transactions.
- Nous utiliserons Sequelize, une bibliothèque de mappage objet-relationnel (ORM) pour Node.js, pour simplifier l'interaction entre le backend Node.js et la base de données PostgreSQL. Sequelize fournit une API simple et intuitive pour créer et gérer des schémas et des modèles de base de données.
- Pour le frontend, nous utiliserons React Native, une bibliothèque JavaScript populaire et évolutive pour créer des interfaces utilisateur. React permet un rendu rapide et efficace d'interfaces utilisateur complexes et fournit un riche ensemble de composants et d'outils intégrés pour la création d'applications Web.