В моем центре обработки данных есть следующая установка.
Глобальный LB -> HA-прокси (2 экземпляра на разных серверах через VRRP, завершение HTTPS, действует как обратный прокси) ---> Nginx (2 экземпляра на разных серверах, балансировка нагрузки с помощью HA-прокси в циклическом режиме, действует как обратный прокси и балансировка нагрузки между tomcat) ---> tomcat (2 экземпляра, нагрузка балансируется каждым Nginx)
Сценарий такой:
Глобальный балансировщик нагрузки получает 100 запросов HTTPS в секунду. Он пересылает эти 100 запросов на прокси-сервер высокой доступности. HA-прокси выполняет завершение HTTPS и балансирует нагрузку 50 HTTP-запросов в секунду на каждый nginx. Каждый Nginx пересылает 25 запросов в секунду двум экземплярам tomcat.
Мой вопрос состоит из трех частей, касающихся запросов в полете:
Есть ли способ настроить стек так, чтобы сбой в точках 1 и 2 не приводил к сбою запросов?
Во всех случаях соединения, сбалансированные в течение периода тайм-аута, будут потеряны (обратите внимание, что количество потерянных соединений будет варьироваться в зависимости от того, в какой момент в течение периода проверки действительно произошел сбой)
Ожидается, что браузер (или ваше клиентское приложение) восстановит https и / или повторит разорванные соединения. (не забывайте, что соединения могут быть прерваны в любой момент между клиентом и сервером, или даже когда пользователь закрывает браузер / ПК)
В целом это должно быть прозрачно для пользователя, но приложение веб-сервера должно избегать повторения одной и той же транзакции при повторном запросе данного URL, что тривиально, например, путем передачи уникального идентификатора tranaction. В любом случае это хорошая практика.
Самый разумный способ сделать это - сообщить вашему приложению о стеке и позволить ему обрабатывать любые сбои.