You can enable support in Gorouter for keep-alive connections with back ends. This article describes how and discusses configuration.
For more information about support for keep-alive connections, see Keep-Alive Connections in HTTP Routing.
By default, support for keep-alive connections with back ends is disabled. An operator can enable the feature by entering a non-zero value for the Keep-alive connections for the Gorouter field in the Networking pane of the TAS for VMs tile.
Each Gorouter process is limited to 100,000 file descriptors. Each inbound request consumes at most two file descriptors: one for the connection from the client, and one from the Gorouter to the back end. For this reason, the number of maximum idle connections VMware recommends is 50,000 or fewer. As a few other file descriptors are consumed by the process under normal operation, this limit is more like 49,900.
In order to determine how many idle connections are needed, consider that the peak connections could be calculated by multiplying throughput by response time. For example, if a single Gorouter receives 1000 requests per second, and response time is 1 second, at any given time there are likely to be 1000 connections open to back ends. Accommodating for growth of 2x, an operator might configure a maximum of 2000 idle connections per Gorouter.
The Gorouter has been hardcoded with a limit of 100 idle connections per back end. The configurable property max_idle_connections
governs idle connections across all back ends.
When keep-alive connections with back ends is enabled, the Gorouter must be responsible for closing connections. If an app instance closes a connection exactly at the same time as the Gorouter sends a new request using that connection, the request fails, and the client receives an HTTP 502 error.
With keep-alive enabled, the Gorouter closes idle connections after 90 seconds. You must configure app servers with a keep-alive idle timeout that is greater than 90 seconds to make sure that the Gorouter always closes connections first. The app server keep-alive idle timeout is language-specific, and the default value often needs to be adjusted to meet this requirement.