Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

maximum reasonable timeout for a synchronous HTTP request

This applies to non-user facing backend applications communicating with each other through HTTP. I'm wondering if there is a guideline for a maximum timeout for a synchronous HTTP request. For example, let's say a request can take up to 10 minutes to complete. Can I simply create a worker thread on the client and, in the worker thread, invoke the request synchronously? Or should I implement the request asynchronously, to return HTTP 202 Accepted and spin off a worker thread on the server side to complete the request and figure out a way to send the results back, presumable through a messaging framework? One of my concerns is it safe to keep an socket open for an extended period of time?

like image 856
Ya. Avatar asked Nov 14 '15 19:11

Ya.


People also ask

What is maximum timeout for HTTP request?

The default value is 100,000 milliseconds (100 seconds).

What is http connect timeout?

Connection timeout is on the client's side, usually meaning that the client lost connection, or is unable to establish connection to a server for whatever reason (such as remote firewall is dropping the traffic or the server went down).

What is a good timeout value?

So if it is a task important to the user then 60 seconds delay is OK. Otherwise more than 10 seconds is an issue.

How would you set a timeout on an HTTP request?

Timeouts on http. request() takes a timeout option. Its documentation says: timeout <number> : A number specifying the socket timeout in milliseconds. This will set the timeout before the socket is connected.


1 Answers

How long a socket connection can remain open (without activity) depends on the (quality of the) network infrastructure.

A client HTTP request waiting for an answer from a server results in an open socket connection without any data going through that connection for a while. A proxy server might decide to close such inactive connections after 5 minutes. Similarly, a firewall can decide to close connections that are open for more than 30 minutes, active or not.

But since you are in the backend, these cases can be tested (just let the server thread handling the request sleep for a certain time before giving an answer). Once it is verified that socket connections are not closed by different network components, it is safe to rely on socket connections to remain open. Keep in mind though that network cables can be unplugged and servers can crash - you will always need a strategy to handle disruptions.

As for synchronous and asynchronous: both are feasable and both have advantages and disadvantages. But what is right for you depends on a whole lot more than just the reliability of socket connections.

like image 62
vanOekel Avatar answered Oct 09 '22 10:10

vanOekel