最重要的超時設定是網路連線/讀/寫的超時時間設定。
其中最重要的超時設定是網路相關的超時設定。
對於客戶端超時主要設定有讀取請求頭超時時間、讀取請求體超時時間、傳送響應超時時間、長連線超時時間。
此引數要配合keepalive_disable和keeplive_requests一起使用。keepalive_disable表示禁用哪些瀏覽器的長連線,預設為msie6,即禁用一些老版本的msie的長連線支援。keepalive_requests引數的作用是乙個客戶端可以通過此長連線的請求次數,預設為100。
http/1.0預設是關閉長連線的,需要新增http請求頭「connection: keep-alive」才能啟用。http/1.1預設啟用長連線,需要新增http請求頭「connection:close」進行關閉。
keepalive_timeout和keepalive_requests是控制長連線的兩個維度,只要其中乙個到達設定的閾值,連線就會關閉。
resolver_timeout 30s:設定dns解析超時時間,預設30s。配合resolver address...[valid=time]進行dns網域名稱解析。當在nginx中使用網域名稱時,需要考慮設定這兩個引數。在nginx社群版中採用如下配置。
upstream backend
以上兩個網域名稱會在nginx解析配置檔案的階段被解析成ip位址並記錄到upstream上,當這兩個網域名稱對應的ip位址發生變化時,該upstream不會被更新,nginx商業版支援動態更新。
可以使用如下方式,每次都會動態解析網域名稱,這種情況在多網域名稱情況下比較麻煩,實現不優雅。
location /test
如果使用openresty,則可以通過lua庫lua-resty-dns進行dns解析。
local resolver = require "resty.dns.resolver"
local r, err = resolver:new},
retrans = 5, -- 5 retransmissions on receive timeout
timeout = 2000, -- 2 sec
}
當使用nginx 1.5.8、1.7.4會報錯,可以將nginx公升級到1.6.2、1.7.5或者在nginx本機部署dnsmasq提公升dns解析效能。
nginx配置如下所示。
upstream backend_server
server
}
主要有三組配置:網路連線/讀/寫超時設定、失敗重試機制設定、upstream存活超時設定。
(1)網路連線/讀/寫超時設定
對於內網高併發服務,可以調整這幾個引數,比如內網服務tp999為1s,可以將連線超時設定為100~500ms,讀超時可以為1.5~3s左右。
(2)失敗重試機制設定
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表示上游伺服器返回空的或錯誤的響應頭。http_***表示上游伺服器返回特定的狀態碼。non_idempotent表示rfc-2616定義的非冪等http方法(post、lock、patch),也可以在失敗後重試下一台上游伺服器(即預設冪等方法get、head、put、delete、options、trance才可以重試)。off表示禁用重試。
重試不能無限制進行,需要使用如下兩個指令控制重試次數和重試超時時間。
即在proxy_next_upstream_timeout時間內允許proxy_next_upstream_tries次重試。如果超過了其中乙個設定,則nginx也會結束重試並返回客戶端響應(可能是錯誤碼)。
如下配置表示當error/timeout時重試upstream中的下一台上游伺服器,如果重試的總時間超過6s或者重試了1次,則表示重試失敗(因為之前已經請求一次了,所以還能重試1次),nginx結束重試並返回客戶端響應。
proxy_next_upstream error timeout;
proxy_next_upstream_timeout 6s;
proxy_next_upstream_tries 2;
(3)upstream存活超時設定
max_fails設定為0表示不檢查伺服器是否可用(即認為一直可用),如果upstream中僅剩一台上游伺服器,則該伺服器是不會被摘除的,將從不被認為不可用。
(4)ngx_lua超時設定
當我們使用ngx_lua時,應考慮設定如下網路連線/讀/寫超時。
lua_socket_connect_timeout 100ms;
lua_socket_send_timeout 200ms;
lua_socket_read_timeout 500ms;
在使用lua時,按照如下策略重試。
if (status == 502 or status == 503 or status == 504) and request_time < 200 then
resp = capture(proxy_uri)
status = resp.status
body = resp.body
request_time = request_time + tonumber(var.request_time) * 1000
end
即如果狀態碼是500/502/503/504,並且該次請求耗時在200ms以內,則進行一次重試。
twemproxy是twitter開源的redis和memcached**中介軟體,目的是減少與後端快取伺服器的連線數。
以tomcat為例略略
略略——總結自濤哥的《億級流量**架構核心技術》
Dubbo高可用 重試機制
dubbo 服務在嘗試呼叫一次之後,如出現非業務異常 服務突然不可用 超時等 dubbo 缺省會進行額外的最多2次重試。重試次數支援兩種自定義配置 1.通過註解 xml進行固定配置 2.通過上下文進行執行時動態配置。1 通過註解 xml進行固定配置 2 通過rpccontext進行執行時動態配置,優...
Quartz超時重試機制
高可用作為考究系統的一項重要指標,如何做到系統的高可用,談及乙個系統,這個話題就難以越過。quartz作為目前排程框架的乙個流行元件,如何保證quartz的高可用,任務排程失敗後,如何進行重試,這個也是乙個值得關注的問題。網上看過許多涉及定時排程的開源專案,但發現其都存在乙個問題,並未對任務排程的失...
Dubbo的超時重試機制
我們在使用dubbo的過程中一定對於下面的配置十分熟悉 下面來解釋一下各引數的含義 1.timeout 3000 服務呼叫的超時時間,呼叫服務的過程中如果達到3秒就會報超時異常,超時異常後客戶端會進行嘗試設定的 retries 次呼叫。有乙個需要注意的地方,timeout只有在超時異常才有效,如果是...