Ответ 1
Вкратце: Вы должны иметь возможность достичь порядка миллионов одновременных активных TCP-соединений и HTTP-запросов расширения.
Сегодня я был обеспокоен тем, поддерживает ли IIS с ASP.NET порядка 100 одновременных подключений. Когда я увидел этот вопрос/ответы, я не мог устоять перед ответом, многие ответы на этот вопрос совершенно неверны.
Лучший случай
Ответ на этот вопрос должен касаться только простейшей конфигурации сервера, чтобы отделить от бесчисленных переменных и конфигураций, доступных ниже по течению.
Итак, рассмотрим следующий сценарий для моего ответа:
- Нет трафика на сеансах TCP, за исключением пакетов keep-alive (в противном случае вам, очевидно, потребуется соответствующее количество полосы пропускания сети и других ресурсов компьютера).
- Программное обеспечение, предназначенное для использования асинхронных сокетов и программирования, а не аппаратного потока для каждого запроса из пула. (т.е. IIS, Node.js, Nginx... webserver [но не Apache] с асинхронным программным обеспечением)
- Хорошая производительность/доллар CPU/Ram. Сегодня произвольно, скажем, i7 (4 ядра) с 8 ГБ оперативной памяти.
- Хороший межсетевой экран/маршрутизатор для соответствия.
- Нет виртуального предела/регулятора - т.е. Linux somaxconn, IIS web.config...
- Никакая зависимость от других более медленных аппаратных средств - отсутствие чтения из жесткого диска, поскольку это будет самый низкий общий знаменатель и узкое место, а не сетевой IO.
Подробный ответ
Синхронные проекты, связанные с нитями, как правило, хуже всего относятся к асинхронным реализациям ввода-вывода.
WhatsApp получает миллион С трафика на одной операционной системе Unix с ароматизированной ОС - https://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/.
И, наконец, этот http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html вникает в детали, изучая, как можно было бы достичь даже 10 миллионов. Серверы часто имеют аппаратные устройства разгрузки TCP, ASIC, предназначенные для этой конкретной роли, более эффективно, чем CPU общего назначения.
Хороший выбор дизайна программного обеспечения
Асинхронная конфигурация ввода-вывода будет различаться на платформах операционных систем и программирования. Node.js был разработан с асинхронным учетом. Вы должны использовать Promises по крайней мере, и когда ECMAScript 7 появится, async
/await
. С#/.NET уже имеет полную асинхронную поддержку, например Node.js. Независимо от ОС и платформы, ожидается, что асинхронный режим будет работать очень хорошо. И какой бы язык вы ни выбрали, ищите ключевое слово "асинхронный", большинство современных языков будут иметь некоторую поддержку, даже если это надстройка какого-то рода.
В WebFarm?
Каким бы ни был предел для вашей конкретной ситуации, да, веб-ферма - одно из лучших решений для масштабирования. Для достижения этой цели существует множество архитектур. Один использует балансировщик нагрузки (хостинг-провайдеры могут их предлагать, но даже у них есть предел, а также потолок пропускной способности), но я не одобряю этот вариант. Для приложений с одной страницей с длительными подключениями я предпочитаю вместо этого иметь открытый список серверов, которые клиентское приложение будет выбирать из случайного при запуске и повторном использовании в течение всего срока службы приложения. Это удаляет единственную точку отказа (балансировщик нагрузки) и позволяет масштабировать несколько центров обработки данных и, следовательно, значительно увеличить пропускную способность.
Разрушение мифа - порты 64K
Чтобы решить вопрос о компоненте "64 000", это неправильное представление.
Поле TCP Port - 2x байта, которое может содержать 65536, но это не ограничивает количество клиентов до ~ 64k. Каждый TCP-пакет имеет два поля портов один для адресата и один для источника (а также два IP-адреса).
С TCP:
- сервер прослушивает порт, например 80 для Web (порт назначения)
- Предположим, что сервер прослушивает только один IP-адрес этого единственного порта
- Каждый клиент, который подключается, сопоставляется в соответствии с исходным IP + портом для состояния соединения (и обратно).
- Каждый раз, когда сервер получает другой пакет из одного и того же IP + порта, он знает (игнорируя поддельные пакеты), что он с той же конечной точки клиента.
Это означает, что существует только предел количества серверов, к которым клиент может подключаться (на каждый IP-адрес клиента), а не наоборот (не сколько клиентов подключается сервер).
Теоретически, на одном принимающем порту (игнорируя многие другие практические ограничения), сервер может прослушивать один порт для каждого интернет-IP-адреса и каждого порта с этого IP-адреса - для IPv4, прибл. 2 ^ 32 * 2 ^ 16 (практически вам нужно будет вычесть некоторые зарезервированные IP-блоки и диапазоны портов). У этих клиентов в свою очередь не будет больше портов для подключения к любому другому серверу в Интернете.Кстати, Http.sys в Windows позволяет нескольким приложениям совместно использовать один и тот же порт сервера в схеме URL-адреса HTTP. Каждый из них регистрирует отдельную привязку домена, и все еще существует одно серверное приложение, которое проксирует запросы к правильным приложениям.