高可用之 超時與重試機制

2021-09-28 12:45:12 字數 3052 閱讀 6587

最重要的超時設定是網路連線/讀/寫的超時時間設定。

其中最重要的超時設定是網路相關的超時設定。

對於客戶端超時主要設定有讀取請求頭超時時間、讀取請求體超時時間、傳送響應超時時間、長連線超時時間。

此引數要配合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只有在超時異常才有效,如果是...