1、一般的的情况
客户端(connectTimeout,socketTimeout) -- 七层接入proxy (connect timeout, read timeout, keepalive timeout, send timeout)-- nginx (proxy_read_timeout,proxy_connect_timeout)-- 后端服务器
connectTimeout:建连时间
socketTimeout:等待数据的时间
2、为什么?
程序中设置了connectTimeout, socketTimeout可以防止阻塞,具体地:
如果没有connectTimeout,建立tcp链接时,阻塞,假死;
如果没有socketTimeout,已经建立的tcp链接,在传输过程中,发送的报文可能会因为网络中断引起程序阻塞,假死;
需要注意的是,socket建连时,如果网络层不可达,会直接抛异常,而不是等connectTimeout耗尽。
3、在什么情况下会出现超时?
从1中的各个层面设置的超时时间看,任何一个环节的超时,都可能引起整个结果的超时。
4、举个例子
场景:客户端请求某个链接,链接功能是拿到大数据30天统计的结果。
无论怎么尝试结果都是502,gateway Timeout。
原因:后端处理数据所用的时长超过了proxy_read_timeout或者是proxy read timeout时间限制。(当然这里也有可能其他情况……)
(责任编辑:IT) |