Supposons un jeu client / serveur standard simple. Pour le serveur, est-il utile d'avoir un processus distinct qui écoute les connexions et les messages des clients et envoie les données via des sockets locaux ou stdin à un autre processus qui exécute le serveur de jeu réel?
L'autre option consisterait à faire les deux choses en un seul processus. La mise en file d'attente des messages entrants et leur exécution dans le bon ordre ne devrait pas poser de problème d'arrêt.
Je me demande si les ressources supplémentaires pour séparer les deux "activités" en valent vraiment la peine. Comment dois-je décider? J'aimerais entendre tous les avantages / inconvénients.
Réponses:
Du point de vue de la conception de l'API, lorsque vous décidez de créer plusieurs programmes de communication distincts ou un seul, la question est: chaque programme peut-il fonctionner de manière significative sans les autres? La réponse variera en fonction de votre projet et de vos préférences.
S'ils ne le peuvent pas , cela ne vaut pas la peine d'y penser. De toute évidence, ils sont si étroitement liés qu'ils ne sont pas vraiment des processus distincts.
S'ils le peuvent et que vous pouvez vous imaginer vouloir ajouter différents composants pour les remplacer à l'avenir, une abstraction de processus fournie par le système d'exploitation pourrait vous aider.
Comment bien cela aide dépend du reste de votre pile de technologie bien. Par exemple, Erlang modélise déjà les choses en tant que processus, de sorte que vous ne gagnerez pas beaucoup d'avantages conceptuels en le divisant également en processus OS. À moins que vous ne songiez à réécrire ces parties du serveur dans une langue différente. Les composants internes d'un programme C ++ sont généralement couplés beaucoup plus serrés et donc plus difficiles à échanger, donc les diviser en différents processus de système d'exploitation peut vous faire économiser du travail plus tard si vous pouvez prévoir de tels réarrangements.
la source
Pour savoir si cela en vaut la peine, vous devez d'abord vous demander quel est le problème que vous essayez de résoudre en ajoutant un service de mise en file d'attente dédié. S'il résout ce problème, cela en vaut la peine; si cela ne résout pas un problème ou si vous n'avez pas de problème à résoudre pour commencer, ce n'est probablement pas le cas.
Voyons quelques raisons pour lesquelles certains serveurs utilisent une architecture à plusieurs niveaux:
la source
Je suis d'accord avec le monstre à cliquet. Tant que vous n'avez qu'un seul serveur de jeux, cela ne vaut pas la peine.
Cependant, cette architecture peut s'avérer utile lorsque vous devez évoluer horizontalement. Lorsqu'un serveur de jeux ne suffit plus et que vous devez distribuer votre jeu sur plusieurs serveurs de jeux pour des raisons de performances, l'architecture du "serveur de socket" pourrait très facilement être adaptée pour transformer le serveur de socket en un équilibreur de charge qui achemine automatiquement les connexions vers l'un des nombreux backend serveur.
Mais lorsque vous n'êtes pas sûr d'en avoir besoin, il est probablement trop complexe de développer deux applications serveur distinctes à ce stade.
la source
Ce n'est probablement pas le cas, la plupart des langues ont des sockets asynchrones qui vous permettent d'utiliser plusieurs connexions à la fois sans bloquer pendant que les données sont en attente. Cela déplace la partie "socket server" vers le système d'exploitation / noyau.
Avec un serveur de socket explicite, vous encourrez le coût de quelques copies supplémentaires lorsque vous passez les données via le socket local; une chose qui va tuer l'évolutivité est des copies supplémentaires où vous n'en avez pas besoin.
la source