linux下rpc支援簡單的超時重傳機制,採用了固定超時時間間隔和固定重試次數。當rpc服務傳送乙個報文時(對應一次遠端過程呼叫),它便啟動乙個定時器;如果定時器在遠端過程呼叫應答到達前期滿,rpc服務便重發請求。程式設計師可以為某個給定應用調整超時時間間隔以及重試次數,但無法自適應。
這種簡單機制無法保證可靠性,無法保證rpc client可以判斷遠端過程執**況。如果網路丟失了所有應答,rpc client可能會重傳幾次請求,每次請求都導致遠端過程被呼叫一次。然而當rpc client 端的rpc服務達到重試上限,它會宣布遠端過程無法被呼叫(這時錯誤**通常是timeout)。必須注意,應用程式不能將失敗解釋成遠端過程從來沒有被呼叫過,它很可能已經被呼叫了多次!我在寫rpc程式的時候就遇到了被呼叫多次的情況,弄得我一頭霧水!
rpc的timeout有兩個,乙個是總超時值(total timeout),另外乙個是重試超時值(retry timeout)。
1. 總超時值:client端等待server端應答的總時間量;tcp和udp都使用該值。
2. 重試超時:client端等待server端的應答期間,每次重傳請求的間隔時間;只用於udp。
預設的超時值可以通過 clnt_control(clget_timeout/clget_retry_timeout) 函式來獲取。
struct timeval tv;
clnt_control(clnt, clget_timeout, (char *)&tv);
printf("timeout = %d : timeout = %d\n", tv.tv_sec, tv.tv_usec);
clnt_control(clnt, clget_retry_timeout, (char *)&tv);
printf("timeout = %d : timeout = %d\n", tv.tv_sec, tv.tv_usec);
經過測試,發現在linux下,udp的預設總超時值為-1,重傳超時值為5秒;tcp的預設總超時值為0。
這兩個值可以通過 clnt_control(clset_timeout/clset_retry_timeout) 來修改。總超時值也可以在clnt_call時指定(timeout引數)。
haproxy 超時機制
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!code class python option redispatch option redispatch 是否允許重新分配在session 失敗後 option abortonclose 丟棄由於客戶端等待時間過長而關閉連線但仍在haproxy等...
inpu超時機制
input的超時檢測機制跟service broadcast provider截然不同,為了更好的理解input過程先來介紹兩個重要執行緒的相關工作 input的超時機制並非時間到了一定就會 而是處理後續上報事件的過程才會去檢測是否該 所以更相信是掃雷的過程,具體如下圖所示。inputreader執...
springcloud超時機制
springcloud中有很多超時時間配置,總結一下各處超時時間的使用及配置。hystrix command default execution isolation thread timeoutinmilliseconds 100000 命令執行超時時間,預設1000ms,應大於ribbon超時時間...