Поддержание множества сокетных соединений одним потоком - PullRequest
1 голос
/ 18 ноября 2009

Многие учебники по взаимодействию с сокетами, которые я вижу, используют 1 поток на сокет. Но на сервере, используемом для онлайн-игр, у вас может быть 10 000 одновременно работающих пользователей - 10 000 потоков, вероятно, не прекрасная идея. Я наткнулся на инструмент (SmartFox), который утверждает, что использует один поток для мониторинга всех соединений сокетов, возможно тысяч. Это приложение работает на Java, но я думаю, что C ++ или C # могли бы сделать то же самое ... как бы вы достигли этого?

Ответы [ 4 ]

4 голосов
/ 18 ноября 2009

Проблема C10K говорит об этом вопросе.

0 голосов
/ 18 ноября 2009

Так как вы упомянули C ++ ...

Если вы работаете на платформе Windows, вы должны искать порты завершения ввода / вывода для такого рода масштабируемости. Порты завершения ввода / вывода позволяют выполнять асинхронный ввод / вывод на сокетах (и других устройствах) с использованием небольшого количества потоков для обслуживания многих тысяч операций ввода / вывода (т.е. соединений).

Способ, которым это работает, заключается в том, что порт завершения ввода / вывода, по сути, является очередью, но операционная система оптимизирует способ освобождения потоков для работы с рабочими элементами в этой очереди, чтобы предотвратить одновременное освобождение слишком большого количества потоков и обеспечить что поток, который только что использовался, более вероятно, будет использоваться снова. См. Здесь: http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx для информации MSDN о IOCP и здесь: http://www.serverframework.com/products---the-free-framework.html для исходного кода моей бесплатной клиент-серверной платформы, которая использует IOCP под прикрытием.

В качестве примера возможной масштабируемости в этой публикации блога (http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html) я подробно описываю, как мне удалось добиться более 70 000 одновременных подключений на компьютере под управлением Windows Server 2003 с оперативной памятью всего 760 МБ.

Обратите внимание, что операции асинхронного сокета C # используют IOCP под капотом.

0 голосов
/ 18 ноября 2009

Если вы используете C ++, взгляните на boost :: asio.

Конечно, делать свое дело тоже весело.

0 голосов
/ 18 ноября 2009

Реализация системы с очередями с одним потоком, опрашивающим сеть, и x потоками, выступающими в качестве рабочих. Вам потребуется реализовать критический раздел вокруг кода, который удаляет и ставит в очередь соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...