2016-04-17 3 views
0

Я пишу чат-приложение с использованием WebSockets, используя сервер WebSockets Jetty 9.3.7, работающий на AWS/EC2. Описание архитектуры приведено ниже:Нужна ли мне кластеризация сеансов в БД для балансировки нагрузки на сервер Jetty WebSockets с HAProxy на AWS/EC2?

(a) Серверы основаны на HTTPS (wss). Я думаю об использовании HAProxy с использованием IP-хэш-LB для этого. Архитектура системы будет выглядеть следующим образом:

     -->wss1: WebSocket server 1 
        /      
clients->{HAProxy LB} -->wss2: WebSocket server 2 
(a, b,..z)   \ 
         -->wss3: WebSocket server 3 

Я завершение HTTPS/wss на LB в этих instructions.

(б) Клиенты a...z подключиться к системе и будет подключаться к различным wss1, wss2 или wss3 т.д.

(с) Теперь моя WebSocket приложение работает следующим образом. Когда один из клиентов выталкивает сообщение, он отправляется на сервер WS, к которому подключен клиент (скажем wss1, а затем это сообщение распространяется среди нескольких других клиентов (набор клиентов, программно определенных в моем приложении WebSocket работает на wss1). Например, a создает сообщение Hey guys! и толкает его к wss1, который затем передаются клиентам b и c, так что b и c получить Hey guys! сообщений. b имеет подключение WebSocket к серверу wss2 и c имеет подключение WebSocket до wss3.

Мой вопрос заключается в том, чтобы нажать м essage с сервера приема сообщений, например (c) выше, wss1 должен знать сеанс/соединение WebSocket с b и c, которые вполне могут находиться на другом сервере WebSocket. Могу ли я использовать кластеризацию сеансов на Jetty для получения сеансов связи b и c? Если нет, то каков наилучший способ обеспечить этот поиск при балансировке нагрузки Jetty WebSockets?

Во-вторых, если я использую сеанса кластеризацию или некоторый такой метод для получения сеанса, как я могу использовать сессии для b и c на wss1, чтобы отправить сообщение b и c? Похоже, что нет никакого способа сделать это, кроме как с помощью какой-либо связи между серверами. Это верно?

Если мне нужно использовать кластеры сеанса для этого, есть ли пример github, на который вы можете указать мне?

Спасибо!

+0

Модель TL; DR версия моего вопроса будет: В HTTP: // StackOverflow. ком/Ques/15646213/how-do-i-access-instantiated-websockets-in-jetty-9? rq = 1, ответ Joakim описывает, как получить сеанс WebSocket, хранящийся локально на том же сервере. Как достичь этого, когда сеансы находятся на разных серверах? Если кластеризация сеансов - это способ, есть ли место, где я могу найти схему кластеризации сеансов Jetty? – Sonny

+0

Я нашел схему кластеризации здесь: https://www.eclipse.org/jetty/documentation/9.2.3.v20140905/session-clustering-jdbc.html – Sonny

ответ

0

Я думаю, что кластеризация сеансов не является правильным инструментом. Message Oriented Middleware (MOM), поддерживающая модель публикации и подписки, должна быть достаточной для объединения нескольких приложений в режиме реального времени. Являясь автором Cettia, рамочной платформы приложений реального времени, я использовал публикацию и подписку модели для масштабирования приложения по горизонтали.

Основная идея заключается в

  1. сообщения для обмена через MOM является операция нанесения на каждый сервер локально. Например, операция может быть «отправкой сообщения всем клиентам». Здесь все клиенты - это те, которые подключаются к серверу для выполнения данной операции.
  2. Каждый сервер подписывается на одну и ту же тему MOM. Когда какое-либо сообщение задается темой, сервер десериализует его в действие и выполняет операцию локально. Это происходит на каждом сервере.
  3. Если какая-либо операция происходит на каком-либо сервере, этот сервер должен сериализовать ее в сообщение и опубликовать ее в теме.

С Cettia все, что вам нужно, это подключить MOM к применению cettia. Если вы хотите сделать это с нуля, вам необходимо реализовать вышеупомянутые идеи.

Вот рабочие примеры за несколько мамами. Хотя это примеры, написанные в Cettia, это может помочь вам понять, как работает эта идея.

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

  • Нет связанных вопросов^_^