Статьи

WebSockets с балансировкой нагрузки с использованием Apache HTTPD

JBoss EAP 6.3 предоставляет технологию предварительного просмотра WebSocket, и WildFly поддерживает их как часть соответствия Java EE 7.

github.com/javaee-samples/javaee7-samples/tree/master/websocket предоставляют тонны примеров Java EE 7, которые работают на WildFly. Если вас интересует аналогичная функциональность в JBoss EAP 6.3, тогда краткий старт — github.com/jboss-developer/jboss-eap-quickstarts/tree/6.4.x-develop/websocket-hello . Кроме того, есть еще несколько примеров на github.com/arun-gupta/jboss-samples/tree/master/eap63 .

Один из распространенных вопросов, связанных с WebSockets, — как их сбалансировать. Этот технический совет объяснит это для WildFly и JBoss EAP 6.3.

Во-первых, каковы основные компоненты?

  • Требуется как минимум Apache HTTPD 2.4.5. Теперь двоичные файлы HTTPD недоступны для Mac, но, к счастью, инструкции по компиляции четко объяснены в Tech Tip # 45 .
  • mod_proxy_wstunnel — это модуль Apache, который обеспечивает туннелирование соединений Web Socket с внутренним сервером Web Sockets, таким как WildFly или JBoss EAP. Это модуль поддержки для mod_proxy, который обеспечивает поддержку ряда популярных протоколов, а также нескольких различных алгоритмов балансировки нагрузки. Соединение автоматически обновляется до соединения WebSocket. И все модули уже включены в каталог modules .
  • Требуется модуль mod_proxy_balancer, который обеспечивает балансировку нагрузки для HTTP и других протоколов.

Поехали!

  1. Скачайте и распакуйте WildFly 8.1.
  2. Запустите WildFly 8.1 в доменном режиме, используя ./bin/domain.sh.
  3. Загрузите этот пример чата , переименуйте файл в «chat.war» и разверните в «main-server-group» следующим образом:
    1
    ~/tools/wildfly-8.1.0.Final/bin/jboss-cli.sh -c --command="deploy chat.war --server-groups=main-server-group"

    Единственным отличием от исходного примера Java EE 7 WebSocket Chat является добавление System.getProperty("jboss.node.name") для отображения имени экземпляра WildFly, обслуживающего приложение. Исходный код доступен по адресу github.com/arun-gupta/wildfly-samples/tree/master/websocket-loadbalance .

  4. Раскомментируйте следующие строки в /usr/local/apache2/conf/httpd.conf :
    1
    2
    3
    4
    LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
    LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

    Это включит все необходимые модули.

  5. Добавьте следующий фрагмент кода в конце «httpd.conf»:
    1
    2
    3
    4
    5
    <Proxy balancer://mycluster>
        BalancerMember ws://localhost:8080
        BalancerMember ws://localhost:8230
    </Proxy>
    ProxyPass /chat balancer://mycluster/chat

    Прокси является контейнером для прокси-ресурсов и в этом случае создает группу балансировки нагрузки с использованием директивы балансировщика. BalancerMember добавляет участника в эту группу балансировки нагрузки. ProxyPass — это стандартная директива, которая отображает удаленные серверы, работающие на разных портах, в пространство локального сервера. В этом случае WildFly запускается в режиме домена и запускает два экземпляра на портах 8080 и 8230. Оба этих экземпляра сопоставляются с localhost: 80, где по умолчанию работает HTTPD Apache.

Развернутый пример чата теперь доступен по адресу localhost: 8080 / chat (первый экземпляр в управляемом домене), localhost: 8230 / chat (второй экземпляр WildFly в управляемом домене) и localhost / chat (через Apache HTTPD).

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

Это также было проверено на JBoss EAP 6.3, и есть несколько отличий:

  1. Вместо этого используйте образец из github.com/arun-gupta/jboss-samples/tree/master/eap63/websocket-chat .
  2. Имя сгенерированного архива отличается, поэтому команда будет выглядеть немного иначе:
    1
    ~/tools/jboss-eap-6.3/bin/jboss-cli.sh -c --command="deploy websocket-chat-1.0-SNAPSHOT.war --server-groups=main-server-group"
  3. Настройте «httpd.conf» следующим образом:
    1
    2
    3
    4
    5
    <Proxy balancer://mycluster>
        BalancerMember ws://localhost:8080
        BalancerMember ws://localhost:8230
    </Proxy>
    ProxyPass /websocket-chat-1.0-SNAPSHOT balancer://mycluster/websocket-chat-1.0-SNAPSHOT

Вот и все!

Смотрите это в прямом эфире в действии:

Важно понимать, что в WebSocket отсутствует понятие «липких сессий», поскольку, в отличие от HTTP, в этом случае существует прямое и «постоянное» соединение между клиентом и сервером.

Наслаждайтесь!