Назад | Перейти на главную страницу

Как добавить поддержку постоянного подключения к веб-службе HTTP с балансировкой нагрузки

Мы работаем над HTTP-сервисом с балансировкой нагрузки с помощью haproxy. Доступ к веб-сервису осуществляется через SSL. Это HTTP-служба RESTful, которая просто принимает JSON, выполняет некоторую работу и возвращает JSON. Нет понятия сеанса.

У нас есть резервные балансировщики нагрузки, установленные перед парой резервных серверов веб-сервисов. Каждый сервер находится за Apache, где Apache используется в качестве прокси для обработки SSL и ведения журнала. Если это важно, наш веб-сервис - это приложение Clojure (java), использующее compojure (причал) для обработки HTTP.

Это краткая диаграмма, показывающая путь клиентского запроса через нашу существующую систему.

client request -> haproxy (load balancing) -> apache (ssl, logging) -> webservice

Мы хотели бы, чтобы любое соединение с балансировщиком нагрузки устанавливало постоянное соединение, а затем обслуживалось тем же сервером для всех последующих запросов, отправляемых через это постоянное соединение. Другими словами, нам не нужно постоянное соединение с haproxy, отправляющим запросы более чем одному серверу веб-сервисов.

Как бы вы рекомендовали, чтобы это работало? Как мы можем «привязать» данное соединение к балансировщику нагрузки к определенному серверу веб-сервиса? Как мы могли бы предотвратить случайную загрузку определенного сервера веб-сервиса множественными интенсивными запросами?

Вы ищете HAProxy cookie директива, которая гарантирует, что клиенты будут придерживаться одного и того же бэкэнда.

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

С помощью balance source в defaults блокировать вместе с удалением option httpclose записи сделали свое дело.