Как обрабатывать до 100 тыс. HTTP-соединений в .Net - PullRequest
7 голосов
/ 10 ноября 2010

Я создаю сервер для отслеживания присутствия клиентов в сети на веб-странице.

  • Для одновременного мониторинга будет 80-100 000 (восемьдесят тысяч) клиентов.
  • Я использую .Net, чтобы написать это.

Клиенты свяжутся с (отдельным) сервером, используя JavaScript (на HTML-странице), чтобы сообщить серверу, что они живы / находятся в сети.

Я рассматриваю один из двух подходов:

  1. Постоянные соединения с keep-alive регулярно отправляются. Это даст мне гораздо более высокую точность при отключении клиентов, и мне не нужно слишком часто обновлять структуру памяти (onlineinfo), потому что мы знаем, когда клиент приходит и уходит. Дополнительные преимущества для сетевого оборудования / пропускной способности.

  2. Клиенты (повторно) подключаются через интервалы, чтобы сообщить серверу, что они живы. Это требует много подключений и обязательно снизит точность. Я думаю, что интервалы в 2-3 минуты - это лучшее, что мы можем сделать. 80k / 120 = 660 подключений в секунду ... ASP.Net работает не слишком быстро, поэтому я не уверен в этом. 8-ядерная система = ~ 10 мс на исполнение.

При таком количестве соединений, очевидно, существуют некоторые ограничения. Например, я не могу порождать столько потоков одновременно. 1 запрос к IIS, порождающий приложение ASP.Net, будет использовать 1 поток, пока запрос не будет выполнен.

Является ли лучшим вариантом написать автономный http-сервер? Разве .Nets TcpListener не использует httpd.sys (IIS)?

Буду признателен за любые (конструктивные) мысли по этому вопросу.

Редактировать: Добавление некоторых полезных ссылок к этому сообщению, найденных по ссылкам из ответа Николаса Репикета:

Ответы [ 2 ]

4 голосов
/ 10 ноября 2010

100 000 постоянных соединений - недопустимый вариант.

Отправка HTTP-запросов через определенные промежутки времени более осуществима, и написание выделенного HTTP-сервера является интересным выбором IMO.

Взгляните на этот вопрос для некоторых ориентиров.

0 голосов
/ 15 мая 2012

Я знаю, что вы конкретно говорите .NET, но вам, вероятно, стоит взглянуть на NodeJS, поскольку он делает именно то, что вы пытаетесь сделать, но это серверный JavaScript.

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