2015-08-15 3 views
1

Я создаю приложение чата для длительного опроса на узле JS без использования Socket.io и масштабирования его с помощью кластеров.Как сохранить HTTP-ответ в redis

Мне нужно найти способ хранения всех запрошенных HTTP запросов и объектов ответа таким образом, чтобы они были доступны для всех кластеров узлов (так что, когда сообщение получено для запроса с длинным опросом, I может получить этот запрос и ответить на него)

Я попытался использовать redis, однако, когда я строю объекты HTTP-запроса и ответа, я получаю сообщение «Can not Stringify Cyclic Structure».

Возможно, я приближаюсь к нему неправильно. В этом случае, как мы обычно реализуем lon-опрос в разных кластерах?

+0

Мне любопытно, почему «без использования Socket.io?» – mscdex

+0

Это часть проблемы, заданной мне компанией. Я не могу помочь :) –

ответ

0

То, о чем вы просите, кажется немного запутанным.

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

Таким образом, вы не делаете эту работу в кластерах, пытаясь централизованно сохранять объекты запроса и ответа. Они относятся к определенному TCP-соединению между конкретным сервером и конкретным клиентом. Вы не можете их сохранить и использовать в другом месте, и это также не то, что помогает любой из этих работ с кластеризацией.

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

Обычный способ, которым вы это выполняете, - это какой-то идентификатор пользователя, который представляет каждый клиент. Когда какой-либо клиент подключается к длинному запросу опроса, это соединение является кластером, распределенным на одном из ваших серверов. Этот сервер, который получает запрос, затем записывает в центральную базу данных (часто redis), что этот userID userA теперь подключен к серверу12. Затем, когда некоторые данные становятся доступными для userA, любой агент может найти этого пользователя в магазине redis и увидеть, что пользователь в настоящее время подключен к серверу12. Таким образом, они могут поручить сервер12 отправлять данные пользователю A с использованием текущего длинного опроса для пользователя A.

Это всего лишь одна стратегия борьбы с кластеризацией - есть много других, таких как липкая балансировка нагрузки, алгоритмическое распределение, широковещательное распространение и т. Д. Вы можете увидеть ответ, который описывает some of the various schemes here.

+0

Это имеет большой смысл. Можете ли вы рассказать мне, как серверный сервер может направить серверYY для отправки ответа.Я слышал, что работники могут общаться только с помощью мастера –

+0

@SanchitMehta - существует множество способов взаимодействия разных серверов. Без нескольких строк кода node.js вы могли бы каждый из ваших серверов node.js прослушивать с http-сервером на пользовательском порту (часто называемый портом управления), а затем просто отправлять HTTP-запрос на этот сервер, чтобы сообщить ему отправьте данные пользователю. Затем вы должны убедиться, что порт управления не был открыт для внешнего мира, чтобы он мог использоваться только вашими другими серверами из-за вашего брандмауэра. – jfriend00

+0

@ jfriend00- У меня 4 кластера. Я могу заставить всех их слушать порт (скажем, 8080). Теперь, если clusterA является длинным опросом запроса, а clusterB получает новое сообщение, то clusterB может отправить запрос серверу, запущенному в Port 8080. Правильно ли я понимаю? Теперь предположим, что clusterB отправляет запрос на порт 8080, как мы можем гарантировать, что правильный кластер, то есть clusterA получает этот запрос (4 кластера также слушают 8080). –

1

Если вы уверены, что хотите сохранить все запросы и ответы, ознакомьтесь с этим вопросом. Serializing Cyclic objects

вы также можете попробовать cycle.js

Однако, я думаю, вы бы только заинтересованы в сериализации несколько элементов из запроса/ответа. Более простой (вероятно, лучший) подход заключается в том, чтобы просто скопировать нужные пары ключ/значение из объекта запроса/ответа в отдельный объект и сохранить их.