Vous modifiez le projet existant.
Ce projet contient actuellement deux workers qui communiquent via RabbitMQ :
- country-worker : récupère la capitale d'un pays via l'API restcountries.com
- capital-worker : traite les messages contenant des capitales
Accéder à la documentation du projet
Vous devez étendre ce système en ajoutant deux nouveaux workers et en créant une API météo personnalisée.
Technologies : PHP (framework Symfony autorisé)
Endpoints à implémenter :
GET /api/weather/{city}
GET /healthSpécifications de l'API météo :
- L'API doit retourner des données météo aléatoires pour les tests
- Format de réponse JSON :
{
"city": "Paris",
"temperature": 15,
"condition": "cloudy",
"humidity": 65,
"wind_speed": 12,
"timestamp": "2024-01-15T10:30:00Z"
}- Conditions météo possibles :
sunny,cloudy,rainy,snowy,stormy - Température : entre -10°C et 35°C
- Humidité : entre 20% et 90%
- Vitesse du vent : entre 0 et 50 km/h
Rôle : Point d'entrée du système avec routage intelligent
Input : Messages JSON avec une valeur simple :
{
"value": "France"
}ou
{
"value": "Paris"
}Traitement :
- Valider le format du message
- Stratégie de routage :
- Essayer d'abord comme nom de pays → publier sur queue
countries - Si le country-worker échoue → republier comme capitale sur queue
capitals
- Essayer d'abord comme nom de pays → publier sur queue
Queues de sortie : countries puis capitals en cas d'échec
Rôle : Enrichir les données avec la météo
Input : Messages JSON avec :
{
"capital": "Paris",
"country": "France"
}Traitement :
- Appeler l'API météo avec le nom de la capitale
- Enrichir le message avec les données météo
Queue d'entrée : capitals
Queue de sortie : weather_results
Format de sortie :
{
"capital": "Paris",
"country": "France",
"weather": {
"city": "Paris",
"temperature": 15,
"condition": "cloudy",
"humidity": 65,
"wind_speed": 12,
"timestamp": "2024-01-15T10:30:00Z"
}
}Modification requise :
- Au lieu de simplement logger le message, publier sur la queue
weather_results - Conserver le message original et ajouter un champ
processed: true
Rôle : Finaliser le traitement et afficher les résultats
Input : Messages enrichis avec la météo
Traitement :
- Logger le message final
modules/
├── input-worker/
│ ├── src/
│ │ ├── index.php
│ │ └── MessageHandler.php
│ ├── Dockerfile
│ └── composer.json
├── weather-worker/
│ ├── src/
│ │ ├── index.php
│ │ └── MessageHandler.php
│ ├── Dockerfile
│ └── composer.json
├── output-worker/
│ ├── src/
│ │ ├── index.php
│ │ └── MessageHandler.php
│ ├── Dockerfile
│ └── composer.json
└── api-weather/
├── src/
│ ├── Controllers/
│ ├── Services/
│ └── index.php
├── tests/
├── Dockerfile
└── composer.json
Ajouter les nouveaux services dans docker-compose.dev.yml pour :
- input-worker
- weather-worker
- output-worker
- api-weather (port 8080)
# Démarrer l'environnement
make up
# Envoyer un message de test
make test-message
# Arrêter l'environnement
make down- Démarrer tous les services :
make up - Envoyer un message de test :
make test-message - Vérifier dans les logs que le message traverse tous les workers
- Vérifier que le message final contient les données météo
Alternative : Envoyer manuellement via l'interface RabbitMQ (Exchange amq.default, routing key input) :
{
"value": "France"
}# Test direct de l'API
curl http://localhost:8080/api/weather/Paris
curl http://localhost:8080/health- API météo fonctionnelle avec endpoints demandés
- Workers implémentés selon les spécifications
- Pipeline complet fonctionnel
- Gestion d'erreurs basique
- Code propre et bien structuré
- Respect des conventions PHP
- Documentation des fonctions importantes
- Séparation des responsabilités
- Réutilisation du package RabbitMQ existant
- Configuration Docker cohérente
- Gestion des variables d'environnement
- Structure de fichiers logique
- Tests unitaires pour l'API météo
- Gestion des cas d'erreur (API indisponible, message malformé)
- Logs informatifs
- Health checks
- Proxy météo : Créer un endpoint proxy dans l'API météo qui appelle une vraie API météo externe (ex: OpenWeatherMap) et mappe le retour vers le format attendu.
- Code source : Tous les fichiers modifiés et nouveaux
- Documentation : README mis à jour avec les nouvelles instructions & divers documentations
- Tests : Au minimum des tests pour l'API météo
- Démonstration : Pipeline fonctionnel avec un exemple de message
Bon courage ! 🚀