Как обработать восстановление соединения между обратным прокси-сервером и сервером приложений? - PullRequest
0 голосов
/ 18 февраля 2019

Мы переносим наш сервис из Websocket в HTTP / 2.Однако мы обнаружили, что соединение должно быть восстановлено, когда идентификатор потока выходит за пределы доступного диапазона.Поскольку мы поддерживаем соединение между нашим обратным прокси-сервером и реальным сервером приложений, соединение HTTP / 2 между ними будет переустанавливаться несколько раз в день, и инициированные сервером события могут быть потеряны.

Итак, мой вопрос: как мы можем корректно восстановить соединения между серверами?

1 Ответ

0 голосов
/ 19 февраля 2019

Идентификатор потока HTTP / 2 имеет длину 31 бит, что означает, что у вас может быть 2 ^ 32 - 1 идентификатор потока, нечетные из которых предназначены для инициированного клиента и даже для инициированного сервера.Это 2 147 483 647 сообщений, которые можно отправить до того, как исчерпаны идентификаторы потоков.

Действительно ли вы отправляете более 2 миллиардов (не миллиардов США!) Сообщений несколько раз в день, что будет означать, что вы достигнете этого предела?Если это так, я не уверен, что HTTP - лучший протокол для вас, и вам лучше всего придерживаться веб-сокетов.HTTP добавляет накладные расходы с заголовками HTTP, что означает, что он не оптимален для небольших, частых сообщений.

В любом случае, чтобы ответить на ваш вопрос, спецификация HTTP / 2 может сказать следующее:

Идентификаторы потока нельзя использовать повторно.Долгоживущие соединения могут привести к тому, что конечная точка исчерпает доступный диапазон идентификаторов потока.Клиент, который не может установить новый идентификатор потока, может установить новое соединение для новых потоков.Сервер, который не может установить новый идентификатор потока, может отправить кадр GOAWAY, чтобы клиент был вынужден открыть новое соединение для новых потоков.

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

...