2016-02-10 1 views
4

Что происходит на сервере, когда клиент закрывает соединение с API с помощью readTimeout. Будет выполнено выполнение для запроса или он будет разорван, как только тайм-аут происходит, или выполнение завершается, и поток ответа забивается с ответом, который сервер должен отправить пользователюЧто происходит на сервере, когда клиент закрывает соединение с помощью readTimeout

ответ

0

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

Способ устранения: есть тайм-ауты с обеих сторон соединения - если одна сторона отключается, другая сторона также будет таймаутом.


Что касается того, что именно происходит на стороне сервера: Поскольку сервер не знает, связь мертва до тех пор, пока не истечет его собственный тайм-аут, он будет рассматривать соединение хорошо, и, как правило, обрабатывает запрос и попытку напишите ответ. Вероятно, будет некоторая буферизация ответа, поэтому попытка написать ответ может даже показаться работать на сервере.

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

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

Если вы случайно попытаетесь написать ответ после того, как тайм-аут уже произошел, вы должны немедленно получить исключение.

Так что же происходит на сервере во многом зависит от вашего собственного кода:

  • Если вы только написать ответ после выполнения всех связанных действий, они будут выполнены
  • Если вы перемешиваетесь бизнес-логика и писать ответ , некоторая логика может выполняться или не выполняться (в зависимости от того, сколько данных вы уже написали в ответ и в какое время), и нет хорошего способа оценить, что произойдет

В любом случае, сервер будет наглядно узнать, что произошло таймаут, но я не уверен, что ваше приложение всегда получит эту информацию.

+0

У меня есть два вопроса здесь 1: так что запрос будет полностью выполняться на сервере? 2: будет ли поток потока забиваться откликом? – niks

+0

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

+0

@EJP Я думаю, что разница в наших мнениях проистекает из различной интерпретации вопроса - я читал его как тайм-аут, происходящий на стороне клиента при чтении ответа, в то время как вы, кажется, читаете его как тайм-аут на стороне сервера при чтении запроса. Это так? –

2

Что происходит на сервере, когда клиент закрывает соединение с API с помощью readTimeout.

То же, что и в случае, если клиент закрывается по любой другой причине. Сервер продолжит выполнение запроса, удастся записать первую часть ответа и может получить ошибку «сброса соединения» при записи остальных, если есть отдых, и в зависимости от времени и времени ответа и т. Д. ,

Будет ли выполнение для запроса будет сделано

Да.

или он сломается, как только возникает тайм-аут

No.

ИЛИ исполнение завершат

Да.

и поток ответа забивается с ответом, что сервер предполагается отправить пользователю

Да, но это будет в конечном итоге привести к «сброс соединения» на сервере.

Смежные вопросы