Назад | Перейти на главную страницу

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

Я планирую добавить больше серверов веб-приложений для поддержки увеличения числа клиентов, развернув 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.

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

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

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

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

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