De nombreux tutoriels sur la communication socket que je vois semblent utiliser 1 thread par socket. Mais sur un serveur utilisé pour les jeux en ligne, vous pourriez avoir 10k utilisateurs simultanés - 10k threads n'est pas une idée merveilleuse. Je suis tombé sur un outil (SmartFox) qui prétend utiliser un seul thread pour surveiller toutes les connexions socket, potentiellement des milliers d'entre eux. Cette application se trouve être en Java, mais je pense que C++ ou C# pourrait faire la même chose ... comment y arriveriez-vous?Maintien de nombreuses connexions socket avec un seul thread
Répondre
Implémentez un en file d'attente système avec un thread interrogeant le réseau et x threads agissant en tant que travailleurs. Vous devrez implémenter une section critique autour du code qui supprime et met en file d'attente les connexions.
Ah, oui ce vieux modèle. Une solution évidente, j'aurais dû voir cela vu que je l'ai utilisé dans le passé. –
Découvrez java.nio.channels.Selector pour l'utiliser dans le thread qui interroge les sockets. –
Si vous utilisez C++, regardez boost :: asio.
Faire le vôtre est amusant, bien sûr.
The C10K problem parle de cette question.
Puisque vous avez mentionné C++ ...
Si vous êtes sur une plate-forme Windows, alors vous devriez regarder dans les ports d'achèvement d'E/S pour ce genre d'évolutivité. Les ports d'achèvement d'E/S vous permettent d'effectuer des E/S asynchrones sur des sockets (et d'autres périphériques) en utilisant un petit nombre de threads pour gérer plusieurs milliers d'opérations d'E/S (connexions). La façon dont cela fonctionne est que le port d'achèvement d'E/S est essentiellement une file d'attente mais le système d'exploitation optimise la façon dont les threads sont libérés pour travailler sur les éléments de travail dans cette file d'attente afin d'éviter que trop de threads soient libérés simultanément. Assurez-vous qu'un thread qui vient d'être utilisé est plus susceptible d'être utilisé à nouveau. Voir ici: http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx pour les informations MSDN sur IOCP et ici: http://www.serverframework.com/products---the-free-framework.html pour le code source de mon infrastructure client/serveur gratuit qui utilise IOCP sous les couvertures. Comme exemple de l'évolutivité possible, dans ce blog (http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html), je détaillerai comment j'ai pu réaliser plus de 70 000 connexions simultanées sur une machine Windows Server 2003 avec seulement 760 Mo de RAM. Notez que les opérations de socket async C# utilisent des IOCP sous le capot.
- 1. Comment concevoir un serveur avec de nombreuses connexions persistantes
- 2. Plusieurs connexions de socket
- 3. Empêcher le débordement de la pile pour de nombreuses connexions Silverlight Socket non fermées
- 4. Maintien de l'intégrité des entités de données principales avec de nombreuses relations un-à-plusieurs entrantes
- 5. log4net est un seul thread?
- 6. Java socketserver: Comment gérer de nombreuses connexions entrantes?
- 7. De nombreuses applications utilisant un seul magasin dans les iOs
- 8. Nombreuses connexions vs requêtes big data
- 9. Socket Thread et PyGTK
- 10. Comment créer une socket serveur et client sur un seul thread différent
- 11. Interface graphique avec socket dans un autre thread
- 12. Serveur de comète à un seul thread rapide, possible?
- 13. Restreindre certaines URL à un seul thread
- 14. Un UIViewController avec de nombreuses UIViews
- 15. Async Socket Listener sur thread séparé - VB.net
- 16. Un thread d'écriture, un thread de lecture sur le même socket?
- 17. Socket Server: Gérer les connexions client
- 18. Exécution d'un flux de socket dans un thread
- 19. Blocage dans un programme java à un seul thread
- 20. Pourquoi mon script de serveur Perl TCP se bloque-t-il avec de nombreuses connexions TCP?
- 21. Workflow 4.0 dans un appartement à un seul thread?
- 22. Android: connexion Bluetooth, socket et thread
- 23. Lecture à partir de plusieurs BlockingQueues dans un seul thread
- 24. DataSet avec de nombreuses clauses
- 25. Android: Un seul Looper peut être créé par thread
- 26. Nouveau thread par connexion client dans le serveur socket?
- 27. Tuer un thread qui attend la sortie du socket
- 28. Socket ReceiveFromAsync est-il implicitement multi-thread?
- 29. Est .NET Socket Send()/Receive() thread-safe?
- 30. Non-blocage Socket Polling vs Blocage socket
Super lien, je vais le lire en détail plus tard. Pourquoi avez-vous ajouté ceci comme commentaire, pas une réponse? –