Я планирую добавить больше серверов веб-приложений для поддержки растущего числа клиентов, развернуть HAproxy и Keepalived для балансировки нагрузки и обеспечения высокой доступности.
Использование моего сервера имеет следующие характеристики:
- Задания не требуют интенсивной загрузки ЦП. Сообщения представляют собой текст JSON длиной менее 100 символов.
- Пользователи будут отправлять сообщения на сервер через клиентское устройство Y. Обычно 4-5 сообщений в день.
- Клиентские устройства X продолжают ожидать сообщение от сервера. Если сообщение доступно на сервере, клиентское устройство X должно иметь возможность получить его в течение 2 секунд. В противном случае это сообщение устарело.
По этой причине,
- Клиентские устройства X используютдлинный опрос HTTP-соединениядля того, чтобы быть отзывчивым. Каждое соединение будет длиться 5 секунд и переподключаться.
- Клиентские устройства 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 или более физическими балансировщиками нагрузки.