Что это означает для TCP-соединений, чтобы оттока?
В контексте веб-сервисов я видел используемый термин "отток TCP-соединения". В частности, в Twitter finagle есть способы избежать этого. Как это случилось? Что это значит?
1 ответ
Этот термин может использоваться несколько раз, но я всегда видел, как он используется в тех случаях, когда множество TCP-соединений выполняется за очень короткий промежуток времени, что вызывает проблемы с производительностью на клиенте и, возможно, на сервере.
Это часто происходит, когда пишется код клиента, который автоматически подключается при сбое TCP любого рода. Если этот сбой является ошибкой соединения до того, как соединение будет установлено (или в самом начале обмена протоколами), тогда клиент может войти в почти занятую петлю, постоянно устанавливая соединения. Это может привести к проблемам с производительностью на стороне клиента - во-первых, процесс находится в очень занятом цикле, высасывающем циклы ЦП, и во-вторых, что каждая попытка подключения использует номер порта на стороне клиента - если это происходит достаточно быстро, программное обеспечение может обернуться когда они достигают максимального номера порта (поскольку порт - только 16-битное число, это, конечно, не невозможно).
В то время как написание надежного кода является достойной целью, этот простой подход "автоматический повтор" немного слишком наивен. Вы можете увидеть подобные проблемы в других контекстах - например, родительский процесс постоянно перезапускает дочерний процесс, который немедленно завершается сбоем. Одним из распространенных механизмов, позволяющих избежать этого, является своего рода увеличение отсрочки. Таким образом, когда первое соединение не удается, вы немедленно переподключитесь. Если в течение короткого времени (например, 30 секунд) происходит сбой, подождите, например, 2 секунды, прежде чем снова подключаться. Если снова произойдет сбой в течение 30 секунд, вы подождите 4 секунды и так далее. Прочитайте статью в Википедии об экспоненциальной отсрочке (или эта запись в блоге может быть более подходящей для этого приложения) для получения дополнительной информации об этой технике.
Преимущество этого подхода состоит в том, что он не перегружает клиента или сервер, но также означает, что клиент все еще может восстановиться без ручного вмешательства (что особенно важно для программного обеспечения на необслуживаемом сервере, например, или в больших кластерах).
В случаях, когда время восстановления является критическим, также возможно простое ограничение скорости создания TCP-соединения - возможно, не более 1 в секунду или что-то в этом роде. Однако, если на одном сервере много клиентов, этот более упрощенный подход все еще может оставить сервер перегруженным нагрузкой принятия, а затем закрытия высокой скорости соединения.
Стоит отметить одну вещь, если вы планируете использовать экспоненциальный откат - я предлагаю установить максимальное время ожидания, или вы можете обнаружить, что из-за длительных сбоев клиенту требуется слишком много времени для восстановления после того, как серверный конец снова начнет принимать соединения. Я хотел бы предложить что-то вроде 5 минут в качестве разумного максимума в большинстве случаев, но, конечно, это зависит от приложения.