Как масштабировать нагрузку на соединение через веб-сокет при добавлении / удалении серверов? - PullRequest
1 голос
/ 31 марта 2019

Для объяснения проблемы:

С HTTP:

Предположим, что поступает 100 запросов в секунду.

  1. Если имеется 4 сервера, загрузкаБалансировщик (LB) может распределить нагрузку между ними равномерно, 25 в секунду на сервер
  2. Если я добавлю сервер (всего 5 серверов), LB будет более равномерно распределять его до 20 / сек на сервер
  3. Если я удаляю сервер (всего 3 сервера), LB уменьшает нагрузку на сервер до 33,3 в секунду на сервер

Таким образом, нагрузка на сервер автоматически балансируется при добавлении / удалении серверов,так как каждое соединение очень короткое.

С Websockets

Предположим, есть 100 клиентов, 2 сервера (за LB)

  1. LB первоначально балансирует каждый входящийподключение равномерно, поэтому каждый сервер имеет 50 подключений.
  2. Однако, если я добавлю сервер (всего 3 сервера), 3-е серверы получат 0 подключений, поскольку существующие 100 клиентов уже подключены к 2 серверам.
  3. Если я уберу подачуr (всего 1 сервер), все эти 100 подключений будут переподключены и теперь обслуживаются 1 сервером.

Проблема

Поскольку соединения веб-сокетов постоянны, добавление / удаление сервера не увеличивает / уменьшает нагрузку на сервер, пока клиенты не решат повторно подключиться.

Какзатем эффективно масштабировать веб-сокеты и управлять нагрузкой на сервер?

1 Ответ

0 голосов
/ 01 апреля 2019

Веб-сокеты построены на TCP и для TCP. При правильной маршрутизации запросов, например, least outstanding requests нагрузка автоматически распределяется между серверами равномерно.вместо этого, если у вас был циклический перебор, тогда будет неравная нагрузка.

позвольте мне привести пример с 3 экземплярами (a, b, c) с запросом 100 (33 соединения каждый приблизительно), и вы добавляете новый ящик(d), скажем, через какое-то время приходит новый запрос 100 (всего 200 запросов), с циклическим перебором на месте, нагрузка старых блоков (a, b, c) возрастает намного дальше, так как у каждого есть 58 (33 существующих + 25 новых) соединений иновая коробка будет иметь 25 соединений, здесь загрузка неравномерна.

ROUND ROBBIN

a, b, c 58 (33 существующих + 25 новых)

d - 25 (25 новых)

Для того же случая, если у вас есть least outstanding requests, тогда во всех полях будет количество соединений.

LEAST CONNECTION

a, b, c - 50 (33existing + 17new)

d - 50 (50 новых)

то же самое относится и к удалению экземпляров, но ключ здесь в том, что нагрузка будет распределена по переменному трафику, для существующих соединений ничегопроизойдет, если вы не отключите какой-либо экземпляр.

...