Коротше кажучи: ви повинні мати можливість досягти мільйонів одночасних активних TCP-з'єднань та шляхом розширення HTTP-запитів. Це говорить вам про максимальну ефективність, яку ви можете очікувати при правильній платформі з правильною конфігурацією.
Сьогодні я переживав, чи підтримуватиме IIS з ASP.NET порядком 100 одночасних з'єднань (дивіться на моє оновлення, очікуйте ~ 10k відповідей в секунду на старих версіях ASP.Net Mono). Коли я побачив це питання / відповіді, я не втримався відповісти на себе, багато відповідей на питання тут абсолютно невірні.
Кращий випадок
Відповідь на це питання повинна стосуватися лише найпростішої конфігурації сервера, щоб від'єднатись від незліченних змінних та конфігурацій, можливих нижче за течією.
Тому розгляньте такий варіант моєї відповіді:
- Немає трафіку на сесіях TCP, за винятком пакетів, які зберігаються в живих (інакше вам, очевидно, знадобиться відповідна кількість пропускної здатності мережі та інших комп'ютерних ресурсів)
- Програмне забезпечення, призначене для використання асинхронних розеток та програмування, а не апаратних потоків за запитом з пулу. (тобто. IIS, Node.js, Nginx ... веб-сервер [але не Apache] з прикладним програмним забезпеченням, розробленим async)
- Хороша продуктивність / долар CPU / Ram. Сьогодні, умовно, скажімо, i7 (4 core) з 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 розроблені для цієї конкретної ролі ефективніше, ніж процесор загального призначення.
Гарний вибір програмного забезпечення
Асинхронний дизайн IO відрізнятиметься від операційних систем та платформ програмування. Node.js був розроблений з урахуванням асинхронності . Ви повинні використовувати Обіцянки принаймні, і коли ECMAScript 7 прийде разом, async
/ await
. C # /. Net вже має повну асинхронну підтримку, як node.js. Незалежно від ОС та платформи, слід очікувати, що асинхронність буде дуже ефективною. І яку б мову ви не вибрали, шукайте ключове слово "асинхронний", більшість сучасних мов матимуть певну підтримку, навіть якщо це якесь доповнення.
Для WebFarm?
Незалежно від межі для вашої конкретної ситуації, так, веб-ферма - це хороше рішення для масштабування. Для цього є багато архітектур. Один з них використовує балансир завантаження (хостинг-провайдери можуть запропонувати їх, але навіть у них є обмеження, поряд із стелею пропускної здатності), але я не підтримую цей варіант. Для програм на одній сторінці із тривалими зв’язками я вважаю за краще мати відкритий список серверів, які клієнтська програма обиратиме випадковим чином при запуску та повторному використанні протягом життя програми. Це видаляє єдину точку відмови (балансир навантаження) і дозволяє масштабувати через декілька центрів обробки даних і, отже, набагато більше пропускної здатності.
Розбиття міфу - 64K порти
Для вирішення питання щодо "64 000" це помилкова думка. Сервер може підключитися до багатьох більш ніж 65535 клієнтів. Дивіться /networkengineering/48283/is-a-tcp-server-limited-to-65535-clients/48284
До речі, Http.sys в Windows дозволяє багатьом програмам спільно використовувати один і той же порт сервера за схемою URL-адреси HTTP. Кожен з них реєструє окрему прив'язку домену, але в кінцевому підсумку є один серверний додаток, який надає запити правильним програмам.
Оновлення 2019-05-30
Ось сучасне порівняння найшвидших бібліотек HTTP - https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext
- Дата тестування: 2018-06-06
- Використовуване обладнання: Dell R440 Xeon Gold + 10 GbE
- Ведучий має ~ 7М репрозонтів прямого тексту в секунду (відповіді не з'єднання)
- Другий Fasthttp для golang рекламує 1.5M одночасних з'єднань - див. Https://github.com/valyala/fasthttp
- Провідні мови - це Rust, Go, C ++, Java, C і навіть C # з рангом 11 (6,9 М в секунду). Скала і Клуджур проходять далі вниз. Python займає 29-е місце із швидкістю 2,7 М в секунду.
- Внизу списку зазначу laravel і cakephp, рейки, aspnet-mono-ngx, symfony, zend. Усі нижче 10 к в секунду. Зауважте, більшість цих фреймворків створені для динамічних сторінок і є досить старими, можливо, існують новіші варіанти, які відображаються вище в списку.
- Пам'ятайте, що це протокол HTTP, не призначений для спеціальності Websocket: багато людей, які приїдуть сюди, швидше за все, будуть зацікавлені в одночасному підключенні для веб-сокета.