Ce projet implémente un système de recommandation de profils utilisateur utilisant une architecture microservices. Le système permet aux utilisateurs de consulter des profils recommandés et d'interagir avec eux (like, dislike, superlike).
Le système est composé de plusieurs services interconnectés :
- API Gateway : Point d'entrée unique pour toutes les requêtes
- Redis : Cache et stockage des templates (port 6380)
- Dragonfly : Cache haute performance Redis-compatible (port 6379, mode host)
- Kafka : Messagerie asynchrone pour les événements
- PostgreSQL : Base de données principale
- OpenSearch : Moteur de recherche et indexation
- Gemini : Service de traitement et analyse
L'environnement de développement utilise une segmentation réseau logique pour une meilleure organisation et sécurité :
-
tinder-data : Services de stockage et données
postgres+postgres-mcp: Base de données principale et interface MCPredis: Cache Redis sur port 6380opensearch: Moteur de recherche et indexation
-
tinder-messaging : Écosystème de messagerie asynchrone
zookeeper: Coordination et configuration Kafkakafka: Broker de messages pour les événements
-
tinder-monitoring : Interfaces de monitoring et administration
opensearch-dashboards: Interface de gestion OpenSearchkafka-ui: Interface de gestion Kafka
- opensearch-dashboards : Connecté à
tinder-dataettinder-monitoring - kafka-ui : Connecté à
tinder-messagingettinder-monitoring
- Dragonfly : Utilise le mode
hostpour des performances optimales- Accès direct au réseau de l'hôte (pas de NAT Docker)
- Port 6379 accessible directement sur localhost
- Recommandé pour les workloads haute performance
- Demande et récupération de profils utilisateur
- Stockage et mise en cache des données de profil
- Recherche et filtrage de profils
- Calcul des prochains profils à présenter
- Prise en compte des interactions précédentes
- Mise à jour en temps réel des recommandations
- Like : Marquer un profil comme apprécié
- Dislike : Marquer un profil comme non apprécié
- Superlike : Interaction premium pour montrer un intérêt particulier
- Détection automatique des matches mutuels
- Notification en temps réel via Kafka
- Sauvegarde des matches dans PostgreSQL
User → API → Redis (Template) → Kafka → PostgreSQL → OpenSearch → Gemini
User → API → Redis (Cache) → Kafka (Async) → PostgreSQL (Match Detection)
Kafka → PostgreSQL → Score Calculation → Database Update
- Backend : API REST
- Cache : Redis pour le stockage temporaire et les templates
- Message Queue : Apache Kafka pour les événements asynchrones
- Base de données : PostgreSQL pour la persistance
- Recherche : OpenSearch pour l'indexation et la recherche
- IA/ML : Gemini pour l'analyse et les recommandations
- Docker et Docker Compose
- Redis
- PostgreSQL
- Apache Kafka
- OpenSearch
- Accès à l'API Gemini
REDIS_URL=redis://localhost:6379
POSTGRES_URL=postgresql://user:password@localhost:5432/dbname
KAFKA_BROKERS=localhost:9092
OPENSEARCH_URL=https://localhost:9200
GEMINI_API_KEY=your_api_key# Cloner le repository
git clone [repository-url]
cd tinder-match-engine
# Lancer tous les services de développement
docker-compose -f dev/docker-compose.yml up -d
# Ou lancer seulement certains services par réseau
docker-compose -f dev/docker-compose.yml up -d postgres redis opensearch # tinder-data
docker-compose -f dev/docker-compose.yml up -d zookeeper kafka # tinder-messaging
docker-compose -f dev/docker-compose.yml up -d dragonfly # cache haute performance# Vérifier que tous les conteneurs sont démarrés
docker-compose -f dev/docker-compose.yml ps
# Vérifier les logs si nécessaire
docker-compose -f dev/docker-compose.yml logs dragonfly
docker-compose -f dev/docker-compose.yml logs kafka- Application Tinder :
http://localhost:8083 - PostgreSQL :
localhost:5432 - Redis :
localhost:6380 - Dragonfly :
localhost:6379(mode host) - Kafka :
localhost:9092 - OpenSearch :
localhost:9200 - Kafka UI :
http://localhost:8080 - OpenSearch Dashboards :
http://localhost:5601 - PostgreSQL MCP :
http://localhost:8000
# Copier le fichier d'exemple des variables d'environnement
cp .env.example .env
# Éditer .env et renseigner vos clés API (Supabase, Gemini)
nano .env # ou vim, code, etc.
# Démarrer TOUS les services (infrastructure + application)
docker-compose -f dev/docker-compose.yml up -d
# Vérifier les logs de l'application
docker-compose -f dev/docker-compose.yml logs -f tinder-app
# Vérifier la santé de l'application
curl http://localhost:8083/healthL'application sera accessible sur http://localhost:8083
# Démarrer uniquement l'infrastructure (sans l'app)
docker-compose -f dev/docker-compose.yml up -d postgres redis kafka opensearch
# Installer les dépendances Maven
./mvnw clean install
# Démarrer l'application avec profil dev
./mvnw spring-boot:run -Dspring-boot.run.profiles=dev
# Ou avec Maven wrapper pour tests
./mvnw testL'application sera accessible sur http://localhost:8083
Pour tester les fonctionnalités de géolocalisation, un script simple permet de peupler OpenSearch avec les coordonnées GPS des utilisateurs de test.
# Installer requests si nécessaire
pip3 install requests
# Lancer le script (application Spring Boot doit être démarrée)
python3 scripts/simple_populate_locations.pyLes 6 utilisateurs de test seront positionnés dans les grandes villes françaises :
- Alice Martin (Paris), Julien Dubois (Lyon), Marie Bernard (Marseille)
- Pierre Garcia (Bordeaux), Sophie Petit (Nice), Thomas Robert (Toulouse)
Base URL: /api/v1/match/users
POST /{userId}/like/{targetUserId}- Liker un profilPOST /{userId}/superlike/{targetUserId}- SuperLike un profilPOST /{userId}/dislike/{targetUserId}- Dislike un profil
Base URL: /api/user-location
POST /- Sauvegarder une localisation utilisateurGET /{userId}- Récupérer les localisations d'un utilisateurGET /- Récupérer toutes les localisationsGET /{userId}/last- Récupérer la dernière localisationGET /{userId}/nearby?radiusKm={radius}- Trouver les utilisateurs à proximité
Base URL: /api/v1/profiles
GET /users/{userId}/profiles/{viewerUserId}/view- Obtenir les détails d'un profil
Base URL: /api/v1/profiles/discovery
GET /users/{userId}/next- Obtenir le prochain profil à découvrirPOST /users/{userId}/queue/refresh- Rafraîchir la file d'attentePOST /users/{userId}/profiles/{profileId}/viewed- Marquer un profil comme vuGET /users/{userId}/queue/status- Obtenir le statut de la file d'attente
Base URL: /api/user
GET /{uuid}- Récupérer un utilisateur par UUIDGET /- Récupérer tous les utilisateursPOST /- Créer un nouvel utilisateurPUT /{uuid}- Mettre à jour un utilisateurDELETE /{uuid}- Supprimer un utilisateurDELETE /- Supprimer tous les utilisateurs
Base URL: /api/v1/boost/users
POST /{userId}/activate- Activer un boost pour un utilisateurPOST /{userId}/deactivate/{boostId}- Désactiver un boost spécifiqueGET /{userId}/status- Récupérer le statut des boosts actifsGET /{userId}/history- Récupérer l'historique complet des boosts
Types de Boost disponibles:
VISIBILITY- Augmente la visibilité du profilSUPER_LIKES- Boost pour les super likesPROFILE_PRIORITY- Priorité d'affichage du profil
Exemple de requête d'activation:
{
"type": "VISIBILITY",
"durationMinutes": 60,
"purchasePrice": 9.99
}Le système utilise une approche événementielle avec Kafka pour tracer toutes les interactions. Les logs sont centralisés et permettent un monitoring en temps réel des performances du système de recommandation.
L'application complète peut tourner entièrement dans Docker :
┌─────────────────────────────────────────────────────────────┐
│ TINDER MATCH ENGINE │
├─────────────────────────────────────────────────────────────┤
│ tinder-app (Spring Boot) ←→ Port 8083 │
│ ↓ ↓ ↓ │
│ [tinder-data] [tinder-messaging] [host network] │
│ ↓ ↓ ↓ │
│ PostgreSQL Kafka Dragonfly │
│ Redis Zookeeper (port 6379) │
│ OpenSearch │
└─────────────────────────────────────────────────────────────┘
- Environnement Reproductible : Même configuration dev/staging/prod
- Isolation : Chaque service dans son propre conteneur
- Déploiement Simplifié : Un seul
docker-compose up - Scalabilité : Facile de scaler horizontalement avec Kubernetes
- CI/CD Ready : Image Docker buildée et pushée automatiquement
Toutes les variables sensibles sont externalisées dans .env :
- Clés API (Supabase, Gemini, OpenAI)
- Credentials de base de données (si overriding)
- Configuration réseau custom
- Fork le projet
- Créer une branche feature (
git checkout -b feature/nouvelle-fonctionnalite) - Commit les changements (
git commit -am 'Ajout nouvelle fonctionnalité') - Push sur la branche (
git push origin feature/nouvelle-fonctionnalite) - Créer une Pull Request
[Spécifier la license du projet]