Как заставить одного клиента Redis ждать ответа всех остальных клиентов Redis? - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть один сервер Redis и несколько клиентов Redis.Каждый клиент Redis является HTTP-сервером WebSocket +, который, помимо прочего, управляет соединениями WebSocket.Эти HTTP-серверы WebSocket + скрыты за балансировщиком нагрузки.

HTTP-серверы WebSocket + обеспечивают конечную точку HTTP * GET /health.Мне бы хотелось, чтобы эта конечная точка предоставляла общее количество текущих подключений WebSocket по всему кластеру.

Когда один из них нажимает GET /health, тогда, очевидно, балансировщик нагрузки отправит запрос только на один сервер WebSocket + HTTPinstance.

Как заставить один экземпляр сервера WebSocket + HTTP запрашивать для всех остальных экземпляров, сколько подключений WebSocket они в данный момент управляют?


Я подумал о следующих шагах:

  1. Экземпляр использует CLIENT LIST, чтобы узнать, сколько клиентов Redis существует (скажем, n);
  2. Затем экземпляр публикует WEBSOCKET_CONNECTION_COUNT_REQUEST в Redis.(при условии, что все клиенты Redis подписаны на это событие);
  3. Экземпляр, наконец, ожидает n WEBSOCKET_CONNECTION_COUNT_RESPONSE s, суммирует количество и возвращает его по HTTP.

Что вы думаете о вышеуказанном подходе?Разве это не слишком запутанно?У меня такое чувство, что я, возможно, немного переоцениваю силы ...


Сначала я думал, что экземпляры могут INCR / DECR подсчитывать в хранилище Redis, но я не уверен, какдля обработки убитых экземпляров (так как количество должно быть соответственно уменьшено).Я думаю, что специальное решение было бы предпочтительным.Все еще открыт для идей.

1 Ответ

0 голосов
/ 01 мая 2018

Я бы использовал отсортированный набор, где члены - это идентификаторы сервера WS, а оценка - это отметка времени их последнего "пинга".

Периодически пингуйте каждую WS (например, каждые 10 секунд), обновляя отсортированный набор своим идентификатором. Вы можете использовать скрипт Lua, чтобы получить время с сервера и установить счет участника, чтобы все было красиво и атомарно:

redis.replicate_commands()
local t = redis.call('TIME')
return redis.call('ZADD', KEYS[1], tonumber(t[0]), ARGV[1])

Таким образом, если ваш отсортированный набор называется "wsservers", а идентификатор WS - foo, вы можете вызвать скрипт после загрузки его с помощью EVALSHA <script-sha1> 1 wsservers foo.

Чтобы вернуть счетчик, все, что вам нужно сделать, - это диапазон отсортированного набора за последний период (то есть 11 секунд) и подсчитать результаты. Вы также можете использовать эту возможность для обрезки старых мертвых серверов. Конечно, сценарий Lua является моим предпочтительным подходом, и он выполняет обе задачи без необходимости фактически отправлять необработанные члены WS по линии вызывающему клиенту:

local t = redis.call('TIME')
local live = redis.call('ZRANGE', KEYS[1], tonumber(t[0])-11, '+inf')
redis.call('ZREMRANGEBYSCORE', KEYS[1], '-inf', tonumber(t[0])-11)
return #live
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...