2015-04-20 3 views
4

У меня есть стандартная установка экземпляра LAMP EC2, работающая на AWS Amazon. Также установив Node.js, socket.io и Express для удовлетворения требований живого обновления, я сейчас на этапе балансировки нагрузки приложения. Это все работает, но моих сокетов нет. Это как моя установка выглядит: -Узел socket.io на балансе нагрузки Amazon EC2

    --- EC2 >> Node.js + socket.io 
       /
Client >> ELB -- 
       \ 
        --- EC2 >> Node.js + socket.io 


[RDS MySQL - EC2 instances communicate to this] 

Как вы можете видеть, каждый экземпляр имеет установку узла и Socket.io. Однако иногда из-за отладки Chrome 400 запрос сокета возвращает причину {"code":1,"message":"Session ID unknown"}, и я предполагаю, что это связано с тем, что он обменивается данными с другим экземпляром.

Кроме того, предположим, что я нахожусь на странице A, и сокет должен излучать на страницу B - из-за балансировки нагрузки эти две страницы могут быть в другом экземпляре (оба они будут одновременно открытыми). Насколько я знаю, использование чего-то вроде Sticky Sessions не будет работать в этом сценарии, потому что обе страницы будут ограничены их соответствующими экземплярами.

Как я могу обойти эту проблему? Мне нужен цельный выделенный экземпляр только для узла? Это кажется несколько излишним ...

ответ

0

Решение будет заключаться в том, что для установки двух (или более) node.js используется общий источник сеанса.

Вот предыдущий вопрос об использовании Redis в качестве общего сеанса магазин для Node.js How to share session between NodeJs and PHP using Redis?

и другой Node.js Express sessions using connect-redis with Unix Domain Sockets

+0

Но будет ли это работать с socket.io? Это, безусловно, указывает на проблемы управления сеансом. Мы использовали MySQL, Mongo и Dynamo для управления сессиями в Node на серверах EC2 с балансировкой нагрузки, все они работают. Express позволяет подключаемым модулям иметь дело с этим, и они существуют для всех вышеперечисленных баз данных. Но я не пробовал это с socket.io. Это стоит исследовать, но предыдущий ответ может указывать на актуальную проблему. – CargoMeister

+0

Он должен работать в Express, когда у вас есть общий магазин сеансов, как в узле. Общий магазин сеансов - это клей, который держит его вместе. Таким образом, вы не полагаетесь на ELB для поддержки клиента 1 на сервере B. Клиент 1 может быть отправлен на любой доступный сервер, и он найдет сеанс и обработает транзакцию. –

2

Вопросы придумать, если учесть, как WebSocket трафик (слой 4 -ish) и HTTP-трафик (уровень 7), перемещающийся через балансировщик нагрузки, который может проверять только один уровень за раз. Например, если вы установили ELB для загрузки баланса на уровне 7 (HTTP/HTTPS), то веб-порты не будут работать вообще через ELB. Однако, если вы установите ELB для балансировки нагрузки на уровне 4 (TCP), тогда любые запрошенные запросы опроса HTTP могут оказаться на любом из вышеперечисленных серверов.

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

Первый довольно привлекателен и требует другого балансировочного устройства. A good walkthrough can be found here. Стоит отметить, что когда это сообщение было написано, HAProxy не поддерживал поддержку SSL. Теперь, когда это возможно, можно было бы просто полностью удалить ELB, если это маршрут, по которому вы хотите идти. Если это так, второй вариант может быть лучше.

В противном случае вы можете использовать HAProxy самостоятельно (или платную версию Nginx) для реализации детерминированного механизма балансировки нагрузки. В этом случае вы будете использовать IP-хеширование since socket.io does not provide a route-based mechanism to identify a particular server like sockjs. Это будет использовать первые 3 октета IP-адреса, чтобы определить, какой сервер восходящего потока получает каждый запрос, поэтому, если пользователь не изменяет IP-адреса между HTTP-опросами, тогда это должно работать.

+0

Спасибо, я посмотрю на HAProxy - хэшированные IP-адреса звучат как что-то, что мне нужно будет использовать. –

Смежные вопросы