Salut à tous,
C'est après une longue hésitation que je place ce message dans cette rubrique, si ce n'est pas la bonne, veuillez m'excusez et m'indiquer ou poster
Je développe un petit système client-serveur, en C++, via sockets TCP asynchrones (boost asio). La plupart du temps, le fonctionnement de mon application générale colle bien avec le système client serveur, les clients font leur petit bonhomme de chemin et interrogent le serveur quand c'est nécessaire. Le serveur, lui, se contente de répondre aux requêtes des clients.
Mais deux petites choses viennent un peu perturber ce fonctionnement :
- Les requêtes trop longues à exécuter
- La remontée d'infos (maintenance)
Je m'explique. Pour le 1), les requêtes trop longues à éxecuter : ça m'embête un peu de laisser mon client en écoute de la réponse du serveur. Parfois, je demande la réalisation d'une tâche drôlement compliquée au serveur qui peut prendre plusieurs dizaines de minutes. Ce que je fais en ce moment, plutôt que d'attendre la réponse du serveur en écoute bloquante pendant 20 minutes, c'est laisser le serveur faire son calcul, et repasser régulièrement voir si la réponse est sortie ou non. Je reste donc dans un fonctionnement client-serveur, le client interroge le serveur. Mais je me demande si je fais bien. Sachant qu'obtenir la réponse n'est pas une chose urgente pour mon client, dois-je garder un fonctionnement identique à celui-ci ou alors laisser mon serveur prendre la décision d'envoyer au client la réponse. Ce point m'embête car dans ce cas le client/serveur est inversé, c'est le serveur qui devient client et qui "push" la réponse sur le client. Je trouve ça tordu, ça voudrait dire qu'une appli serait en écoute d'une réponse sur le client...
Mon deuxième point rejoint mon premier. Parfois j'aimerai obtenir des infos de mes clients, ou leur envoyer un signal particulier pour de la maintenance. Sachant que j'aurai la main sur le serveur, mais pas sur mes clients. Je vois deux solutions et là encore j'hésite.
Soit je crée une liste de messages sur le serveurs, adressés aux clients et à intervalles réguliers les clients viennent vérifier qu'aucun message ne leur est adressé. C'est pas optimal mais ça me permet de garder un fonctionnement client/serveur classique.
L'autre solution c'est de mettre en écoute une appli sur le client, et ordonner au serveur l'envoi d'un message vers tel client. Ce qui m'embête c'est que j'ai l'impression de détourner le fonctionnement client/serveur.
Qu'en pensez vous ? Suis-je complètement dans le faux avec mes solutions ? Vaut-il mieux avoir un client avec une petite partie en écoute, capable de traiter des messages entrants (et dénaturer ainsi le fonctionnement client serveur) ou alors vaut-il mieux garder un fonctionnement homogène, quitte à faire des requêtes régulières pour rien ?
Merci
Guiz
Partager