Мы работаем над 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
записи сделали свое дело.