Un serveur Pub/Sub WebSocket simple, robuste et prêt pour la production, construit avec Flask, Socket.IO et utilisant SQLite pour la persistance des données.
- 📢 Diffusion par Sujets (Topics) : Publiez des messages dans des canaux spécifiques.
- 📡 Abonnement en Temps Réel : Les clients s'abonnent via WebSocket pour recevoir les messages instantanément.
- 💾 Persistance des Données : Utilise SQLite pour sauvegarder les messages, les abonnements des clients et les confirmations de consommation.
- 🔌 Double Interface : Une API HTTP RESTful pour publier des messages et des points d'accès pour le monitoring, et des événements Socket.IO pour la communication temps réel.
- 📊 Monitoring Intégré : Points d'accès API pour lister les clients connectés, l'historique des messages et les événements de consommation.
- 📝 Journalisation Complète : Logging détaillé pour le débogage et le suivi de l'activité du serveur.
- 🧪 Suite de Tests Complète : Tests unitaires et d'intégration utilisant
pytestpour assurer la fiabilité.
git clone https://github.com/votre-repo/Python.PubSub.Server.git
cd Python.PubSub.Server
# Il est recommandé d'utiliser un environnement virtuel
python -m venv .venv
source .venv/bin/activate # Sur Windows: .venv\Scripts\activate
# Installer les dépendances
pip install -r requirements.txtUne fois les dépendances installées, vous pouvez démarrer le serveur :
python -m python_pubsub_server.pubsub_wsLe serveur démarrera et écoutera sur http://0.0.0.0:5000. La première fois, il créera et initialisera une base de données SQLite nommée pubsub.db.
Vous pouvez accéder au panneau de contrôle en ouvrant http://localhost:5000/ dans votre navigateur.
Le serveur expose à la fois des points d'accès HTTP et des événements WebSocket.
Publie un message sur un sujet spécifique. Le corps de la requête doit être un JSON.
Corps JSON :
{
"topic": "notifications",
"message_id": "msg-unique-001",
"message": {
"type": "alert",
"content": "Maintenance système à 22h."
},
"producer": "admin-script"
}- Succès (200) :
{"status": "ok"} - Erreur (400) :
{"status": "error", "message": "Missing required field"}
Retourne la liste de tous les abonnements de clients actuellement actifs.
Réponse :
[
{
"consumer": "dashboard-ui",
"topic": "metrics",
"connected_at": 1678886400.123
}
]Retourne la liste de tous les messages qui ont été publiés, triés par ordre antéchronologique.
Réponse :
[
{
"topic": "notifications",
"message_id": "msg-unique-001",
"message": {
"type": "alert",
"content": "Maintenance système à 22h."
},
"producer": "admin-script",
"timestamp": 1678886500.456
}
]Retourne la liste de tous les événements de consommation enregistrés.
Réponse :
[
{
"consumer": "mobile-app-user-123",
"topic": "notifications",
"message_id": "msg-unique-001",
"message": "{'type': 'alert', 'content': 'Maintenance système à 22h.'}",
"timestamp": 1678886505.789
}
]Les clients communiquent avec le serveur via un client Socket.IO.
Un client s'abonne à un ou plusieurs sujets.
// Exemple côté client
socket.emit('subscribe', {
consumer: 'mobile-app-user-123',
topics: ['notifications', 'private-messages']
});Le serveur envoie cet événement aux clients abonnés lorsqu'un nouveau message est publié sur un sujet correspondant.
// Exemple côté client
socket.on('message', (data) => {
console.log(`Nouveau message sur le sujet ${data.topic}:`, data.message);
// Le client peut ensuite notifier le serveur de la consommation
socket.emit('consumed', {
consumer: 'mobile-app-user-123',
topic: data.topic,
message_id: data.message_id,
message: data.message
});
});Un client notifie le serveur qu'il a bien reçu et traité un message.
Géré automatiquement lorsque le client se déconnecte. Le serveur supprime l'abonnement du client de la base de données.
- Python 3.9 ou supérieur
- pip et virtualenv
Suivez les mêmes étapes que pour l'installation, mais installez les dépendances de développement si un fichier requirements-dev.txt est disponible.
# Cloner le dépôt
git clone https://github.com/votre-repo/Python.PubSub.Server.git
cd Python.PubSub.Server
# Créer l'environnement virtuel
python -m venv .venv
source .venv/bin/activate
# Installer les dépendances
pip install -r requirements.txt
# pip install -r requirements-dev.txt # Si applicableLe projet utilise pytest pour les tests. Assurez-vous d'installer pytest et les autres dépendances de test.
# Lancer tous les tests
pytest -vPython.PubSub.Server/
├── src/
│ └── python_pubsub_server/ # Package principal
│ ├── pubsub_ws.py # Implémentation du serveur
│ ├── migrations/ # Scripts de migration (inclus dans le package)
│ │ └── 001_...sql
│ ├── *.html # Interfaces web (control-panel, activity-map, circular-graph, etc.)
│ └── static/ # Fichiers statiques (CSS, JS)
├── migrations/ # Copie des migrations (pour référence)
│ └── 001_...sql
├── tests/ # Suite de tests
│ ├── test_pubsub_ws.py
│ └── ...
├── requirements.txt # Dépendances du projet
└── README.md # Ce fichier
Les contributions sont les bienvenues ! Veuillez suivre ces étapes :
- Forkez le dépôt
- Créez une branche pour votre fonctionnalité (
git checkout -b feature/nouvelle-feature) - Commitez vos changements (
git commit -m 'Ajout de ma nouvelle feature') - Poussez vers la branche (
git push origin feature/nouvelle-feature) - Ouvrez une Pull Request
Veuillez vous assurer que tous les tests passent et que la documentation est mise à jour si nécessaire.
Ce projet est sous licence MIT - voir le fichier LICENSE pour plus de détails.
- Auteur : venantvr
- Email : venantvr@gmail.com
- GitHub : @venantvr