资讯详情

谷歌浏览器连接超时_系统超时重试机制(OpenResty/Nginx)

ea91dc146c55ac340f9418b221467592.png

在实际开发中,许多故障是由于没有意识到加班设置的重要性造成的。如果没有超时机制,可能会导致连反应,最终系统雪崩。有些中间件自然集成了超时重试机制,但在设计中需要注意的是,阅读服务非常适合重试,但大多数写作服务不能重试。为解决写作操作重试问题,一般采用幂等重试的方式。但跨系统调用不能无限次重试,需要设置合理的重试次数,并配合熔断、快速失败等机制。

重试的分类

从系统调用的整个链路来看,可分为以下类型。

  • 代理超时重试:如Haproxy、Nginx等等。需要合理设置代理与后端真实服务之间的网络连接/读写超时间。
  • Web超时容器:如Tomcat、Jetty等。应用服务器需要设置客户端与容器之间的网络连接/读/写超时时间。以及默认Socket网络连接/读写超时间。
  • 中间客户端超时重试:如Dubbo、HTTPClient等。需要设置客户端的网络连接/读/写超时时间与重试机制。
  • 如果数据库客户端超时:MySQL、MongoDB、Redis等等。需要单独设置JDBC Connection、Statement网络连接/读写超时间,事务超时间,连接池连接等待时间。
  • 前端Ajax超时:浏览器通过Ajax访问时的网络连接/读写超时间。

Nginx 代理层超时

Nginx(OpenResty)主要有四种类型的加时设置:客户端加时设置,DNS分析加班设置,代理加班设置ngx_lua相关的加时设置。

对于客户端的超时设置有:读取请求头超时时间、读取请求体超时时间、发送响应超时时间、长连接超时时间。通过客户端的超时时间设置,可以避免一些长连接的占用,以至于影响服务端的性能。

  • client_header_timeout time:默认为60S。此时客户端未发送请求头的,应响应408(Request Time-out)状态码。
  • client_body_timeout time:默认60S。此时是指两次成功读取操作的时间间隔(针对Nginx本身),而不是客户发送的时间。加班反应408状态。
  • send_timeout time:默认情况下,60S。这里的时间间隔也是两次的时间间隔。如果此时客户端没有收到任何响应,Nginx关闭连接。
  • keepalive_timeout timeout [header_timeout]:设置HTTP长连接超时间。第一个参数(timeout)是告诉Nginx长连接的超时间是多少?默认为75S;第二个参数header_timeout用于设置响应头Keep-Alive: timeout=time即告诉客户端长连接超时间。

  • resolver_timeout 30s:设置DNS默认30分析超时时间S。它需要配合resolver address [valid=time]进行DNS域名解析。
#nginx 默认会根据DNS请求结果中的TTL缓存值可以通过可选参数进行valid设置过期时间resolver 8.8.8.8 8.8.4.4 valid=30s;

其中当upstream每次配置如下Nginx开始的时候,会把domain解析成IP。假如此时IP变更,Nginx不会立即更新(社区版不会立即更新,商业版可以)valid过期后,才会刷新。

upstream backend { server c0.3.cn; server c1.3.cn;}

要解决这个问题,可以proxy_pass以下设置,但当多域名时,更麻烦。

location /demo { proxy_pass http://c0.3.cn;}

如果用的是 OpenResty,则可以使用lua-resty-dns进行DNS解析。

local resolver = require 'resty.dns.resolver'local r, err = resolver:new { nameservers = {'8.8.8.8', {'8.8.8.8', 53}}, retrans = 5, timeout = 2000, -- 2 sec}

Nginx配置如下

upstream backend_server { server 192.168.61.1:9080 max_fails=2 fail_timeout=10s weight=1; server 192.168.61.1:9090 max_fails=2 fail_timeout=10s weight=1;}server { ... location /test { proxy_connect_timeout 5s; proxy_read_timeout 5s; proxy_send_timeout 5s; proxy_next_upstream error timeout; proxy_next_upstream_timeout 0; proxy_next_upstream_tries 0; proxy_pass http://backend_server; add_header upstream_addr $upstream_addr; }}

backend_server 定义了两个上游服务器。以上配置主要包括网络连接/读写加时设置、失败重试机制设置、upstream存活超时设置。

  • 网络连接/读/写超时设置

proxy_connect_timeout time:默认情况下,与后端/上游服务器连接的超时时间为60s。

proxy_read_timeout time:默认60s。超时时间是指两次成功读取操作间隔,而不是读取整个响应体的超时间。如果超时间内没有响应,则Nginx关闭连接。

proxy_send_timeout time:默认60s。超时时间是指两次成功读取操作间隔,而不是读取整个响应体的超时间。如果超时间内没有响应,则Nginx关闭连接。

  • 设置失败重试机制

proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | non_idempotent | off ... :在什么情况下需要重试上游服务器?默认为:error timeout。error表示读写错误;timeout表示超时;invalid_header表示头信息错误;non_idempotent表示RFC-2616定义非幂等HTTP方法(POST、LOCK、PATCH),也可以在失败后重试(默认幂等。GET、HEAD、PUT、DELETE、OPTIONS、TRACE);off表示禁止重试。

proxy_next_upstream_tries number:设置重试次数,默认0表示无限制。这里的次数包括第一个请求。

proxy_next_upstream_timeout time:设置重试最大超时时间,默认0表示。

以上两个值之间的关系是和,重试将在有限的时间内结束或重试次数达到一个值,并返回客户端响应。

  • upstream 存活超时设置

max_fails和fail_timeout:在什么情况下配置?Nginx上面的服务器被认定为不可用。条件是:在fail_timeout时间失败了max_fails次数。例如,在上述配置中,10S如果失败次数达到2次,则认为上游服务器不可用。

若max_fails如果设置为0,则表示不检查是否不可用。

  • ngx_lua 超时设置

当我们使用它时ngx_lua超时设置如下:

lua_socket_connect_timeout 100ms; -- 连接lua_socket_send_timeout 200ms; -- 发送lua_socket_read_timeout 500ms; -- 读取

Web容器超时

Web以下是容器的设置Tomcat为例。

  • connectionTimeout:设置与客户端简历连接的超时间。接收连接后,如果在配置时间内未收到客户端请求线,则视为连接超时,默认为60S。
  • socket.soTimeout:从客户端读取请求数据的超时间。默认60S,NIO和NIO支持配置。
  • asyncTimeout:Servlet3异步请求的超时时间默认为30S。
  • disableUploadTimeout和connectionUploadTimeout:当配置disableUploadTimeout为false时(默认为true,和connectTimeout同样),将使用文件上传conectionUploadTimeout作为超时时间。
  • keepAliveTimeout和maxKeepAliveRequests:keepAliveTimeout默认为connectionTimeout,配置-1表示永不超时。maxKeepAliveRequests默认为100。

参考:《亿级流量网站架构核心技术》

标签: header11连接器203r004连接器快速断开连接器160484

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台