Блог

Apache Camel и WebSockets: полученный опыт

Apache Camel хорошо работал с HTTP, но, когда мне понадобились WebSockets, я обнаружил, что плагины Camel предлагают очень ограниченные возможности: либо клиентский, либо серверный режим, но не оба одновременно. Я пытался обойти ограничения, сочетая Atmosphere-WebSocket, AHC-WS и плагин Camel WebSocket, однако они не были рассчитаны на несколько одновременных двунаправленных соединений. Для применения шаблона идентификатора корреляции пришлось бы менять существующие интерфейсы.

Я попробовал плагины Netty и Mina, но тоже безуспешно. Похоже, стабильных кодеков WebSocket для Mina и Mina2 не было. Для Netty они существовали, но объединение декодера рукопожатия и декодеров кадров выглядело слишком трудоёмким: пришлось бы разрабатывать собственный компонент Camel. Мне же нужно было лишь пропускать трафик и применять правила безопасности на основе заголовка cookie. При этом плагин Netty для Camel не связывает соединения из пула потребителей с соединениями пула производителей: он отправляет пакет первому доступному производителю, не учитывая, что данные попадут не тому адресату.

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

Я думал об аутентификации по токену, но Netty, к сожалению, не поддерживает её из коробки, в отличие от Socket.io . В результате за несколько часов я интегрировал Netty со Spring Security. Изначально Camel был нужен для защищённого шлюза между сервисами и клиентским кодом на AngularJS. Для HTTP он до сих пор работал отлично: позволял сохранять сервисы без состояния, как и полагается REST-сервисам, легко их комбинировать и балансировать нагрузку. Осталось провести нагрузочное тестирование после развёртывания в среде приёмочного тестирования (UAT).

Композиция сервисов WebSocket — интересная тема. По мере роста числа таких приложений и сервисов в инструментах вроде Apache Camel понадобится полноценная поддержка WebSocket корпоративного уровня. Пока же большинство решений, похоже, ориентировано на браузеры, а не на объединение сервисов.

Впервые опубликовано в LinkedIn: https://www.linkedin.com/pulse/apache-camel-websockets-lessons-learned-andrew-miller

← Вернуться в блог