У меня есть клиент, который подключается к настройке облачного сервера - экземпляр HAProxy (один из нескольких, определяемых балансировщиком нагрузки), который затем перенаправляет запросы на правильный внутренний сервер.
С точки зрения клиента, это всего лишь один постоянный URI, но проблема возникает, когда балансировщик нагрузки переключает экземпляр HAProxy, который обрабатывает запрос. После этого каждый последующий запрос, отправляемый HttpClient, поступает с другого локального порта и обрабатывается внутренним сервером как новое соединение.
Постоянное соединение имеет решающее значение для приложения, так что это в основном нарушает его. Как ни странно, проблема решается сама собой, как только клиентское приложение перезапускается. Это наводит меня на мысль, что проблема заключается в клиенте, а не в настройке облака или бэкэнд-сервере.
Есть ли что-то, что я здесь упускаю? Я подумал, что это может быть проблема с ServicePointManager, создающим ServicePoint, когда соединение проходит через один экземпляр HAProxy, и, поскольку этот объект поддерживается на протяжении всего жизненного цикла приложения, возможно, существует некоторая проблема с его использованием через второй экземпляр HAProxy. При перезапуске приложения экземпляр ServicePoint теряется и создается заново.
Обновление : я заметил, что объект ServicePoint сначала имеет протокол HTTP 1.1, но как только возникает проблема, он изменился на 1.0. HTTP 1.1 имеет постоянные соединения по умолчанию, в то время как HTTP 1.0 имеет временные соединения по умолчанию.
Если я изменю протокол объекта ServicePoint на 1.0, когда все работает, я получу исключение 502 Bad Gateway (хотя, похоже, оно восстановится и вернется к 1.1 для следующего запроса).
Я предполагаю, что что-то в облачном стеке приводит к изменению протокола на 1.0 после балансировки нагрузки.