Как масштабировать веб-сервер, поддерживающий долгий опрос

Как масштабировать веб-сервер, поддерживающий долгий опрос

Я планирую добавить больше серверов веб-приложений для поддержки растущего числа клиентов, развернуть HAproxy и Keepalived для балансировки нагрузки и обеспечения высокой доступности.

Использование моего сервера имеет следующие характеристики:

  1. Задания не требуют интенсивной загрузки ЦП. Сообщения представляют собой текст JSON длиной менее 100 символов.
  2. Пользователи будут отправлять сообщения на сервер через клиентское устройство Y. Обычно 4-5 сообщений в день.
  3. Клиентские устройства X продолжают ожидать сообщение от сервера. Если сообщение доступно на сервере, клиентское устройство X должно иметь возможность получить его в течение 2 секунд. В противном случае это сообщение устарело.

По этой причине,

  1. Клиентские устройства X используютдлинный опрос HTTP-соединениядля того, чтобы быть отзывчивым. Каждое соединение будет длиться 5 секунд и переподключаться.
  2. Клиентские устройства X и клиентские устройства Y подключены к одному и тому же серверу, поэтому X и Y могут легко отправлять сообщения

Вопрос

Если к серверу подключено более 60 000 клиентских устройств X, мой балансировщик нагрузки или маршрутизатор исчерпает порт TCP. Какой наилучший способ масштабирования для, скажем, 20 000 пользователей?

Мой сервер работает на Ubuntu с использованием tomcat и Java Servlet.

решение1

Я не думаю, что ваши 60k клиентов являются настоящей проблемой. Скорее всего, у вас будет проблема с недостаточным количеством файловых дескрипторов, но это должно быть легко исправить в рамках конфигурации ОС.

Вот почему соединения не будут вашей проблемой. Каждое соединение характеризуется своим исходным IP-адресом, исходным портом, целевым IP-адресом и целевым портом. Внутри сетевого стека эта четверка используется для сопоставления пакетов с файловыми дескрипторами (каждый файловый дескриптор представляет соединение). Ваш сервер имеет фиксированный целевой IP-адрес и порт назначения (ваш сервер является пунктом назначения для их клиента), но исходный IP-адрес и исходный порт являются переменными. Порт — это 16-битное число, поэтому максимальное количество соединений от одного клиента составляет 64K. Адрес IPv4 — это 32-битное число, которое дает вам 4 294 967 296 возможных исходных адресов. Проделав некоторые простые математические расчеты, ваш сервер может иметь 64K * 4 294 967 296 соединений, сопоставленных с одним исходным IP-адресом и портом.

Вот почему у вас, скорее всего, возникнут проблемы с максимальным количеством открытых файловых дескрипторов, чем с количеством клиентов.

решение2

Наиболее простым подходом может стать реализация балансировки нагрузки на уровне DNS.

Средства: иметь циклическую запись DNS, которая распределяется между 2, 3 или более физическими балансировщиками нагрузки.

Связанный контент