У меня есть два док-контейнера, в каждом из которых запущено приложение на порту 8080. Это приложение имеет конечную точку REST «/status», которая может сигнализировать, есть ли у приложения ресурсы для принятия другого запроса пользователя. Пользовательский запрос будет перенаправлен и сбалансирован для двух контейнеров прокси-сервером Apache с балансировкой нагрузки.
Чего я хочу достичь:
- Если приложение в контейнере сообщает, что не хочет получать больше запросов, балансировщик не будет пересылать запросы в этот контейнер.
- Если каждый работающий сервер приложений сигнализирует о том, что он не получает никаких запросов, один из этих серверов все равно должен получать запросы.
Что я настроил:
<VirtualHost *:80>
ProxyRequests off
ProxyPreserveHost On
ProxyHCExpr status_ok {hc('body') ~ /Status: ok/}
<Proxy balancer://application-cluster>
BalancerMember http://application1:8080 route=worker1 hcexpr=status_ok hcmethod=get hcuri=/status
BalancerMember http://application2:8080 route=worker2 hcexpr=status_ok hcmethod=get hcuri=/status
BalancerMember http://application1:8080 route=standby status=+H
ProxySet lbmethod=byrequests
</Proxy>
<Location /balancer-manager>
SetHandler balancer-manager
</Location>
ProxyPass /balancer-manager !
ProxyPass / balancer://application-cluster/
ProxyPassReverse / balancer://application-cluster/
</VirtualHost>
Как вы можете видеть здесь, application1 определяется как горячий резерв и должен быть «жертвой» для обработки запросов, если все остальные BalanceMembers находятся «в автономном режиме» для новых запросов.
Что работает:
- Запросы сбалансированы по нагрузке для обоих BalancerMembers.
- application1 и application2 могут сигнализировать о том, что не получают никаких запросов. В этом случае оба BalancerMembers показывают ожидаемый статус «Init HcFl» на странице Balancer Manager.
Что не работает:
- application1 не отображается как горячий резерв на странице диспетчера баланса
- Поэтому запросы не будут перенаправлены в application1
Что возможно, но я не хочу делать:
- Если я настрою горячий резерв для переадресации на другой порт в приложении 1, он будет отображаться и перенаправлять запросы на этот порт.
Похоже, что Apache просто удаляет BalancerMember, если хост и порт равны другому BalancerMember. Я что-то упускаю или есть другой способ добиться того, чего я хочу?