伺服器程式中如何設計backup task功能

2021-07-11 15:19:48 字數 1998 閱讀 9573

retry

集群中有client、server1, server2三颱機器,client需要向server請求資料,如果server1響應超時,則請求server2。server1、server2互為備份,包含同樣的資料。

client:

[cpp]view plain

copy

for (id = 0; id < 2; id++)  

}  

timeout是外部傳給client的總超時數。上面的**有乙個問題:當網路阻塞或者server十分繁忙的時候,do_request會超時,一旦超時,則總超時時間都被耗盡,根本沒有剩餘時間去重試下乙個server。

因此,正確的retry設計需要考慮到「網路阻塞或者server十分繁忙」的情況,分給每個server的timeout時間只能是總timeout的一部分,**改寫如下:

[cpp]view plain

copy

for (id = 0; id < 2; id++)  

}  

不過,對於server掛掉的情況(socket層面無法連線)do_request請求這個server會立即失敗,可以不設定timeout_percent。

jeff dean的一篇**中介紹了google利用backup request來大幅度降低響應延遲的問題,在**中他將這種請求成為tied request。他在achieving rapid response times in large online services這篇ppt中對此進行了專門的論述。

集群中有client、server1, server2三颱機器,client需要向server請求資料,如果server1響應超時,則請求server2。server1、server2互為備份,包含同樣的資料。client收到任意響應資料後立即通知其他請求過的server取消操作。

有兩種設計方案:

1. client向server1發出req請求,req在server1任務佇列中排隊

2. server1開始執行req,在執行前給client發乙個quick response

3. client如果在超時時間內收到quick response則不發起backup task,否則client一旦超時,就立即發起backup task

3. client收到任意server的結果時,立即給其它所有發給過請求的server發cancel request

4. client先行退出

5. 對於執行任務的server,它如果及時收到了cancel request,則直接取消任務,如果收到不及時,任務已經開始,則還是老老實實做任務。任務做完後丟棄結果。

6. client收到過期的結果直接丟棄

1. client向server1發出req請求

2. client等待超時,則立即向server2發req請求

3. 任意server返回了req結果,則發cancel request給其它相關server

4. client收到過期的結果直接丟棄

note:無論方案1還是方案二,實現這樣的非同步系統的時候都要很小心,一要防止記憶體洩露,一要方式提前析構導致野指標。

設計backup task的關鍵是要防止伺服器繁忙時期的請求風暴。在伺服器繁忙時期client容易發生等待超時,傾向於傳送backup request。大量的backup request會進一步讓伺服器更繁忙,於是請求風暴誕生了。防止請求風暴的要點是區分普通超時和風暴期超時。

從統計的角度看,普通超時的模式與風暴期超時的模式肯定有很大區別,這是乙個入手點。

從使用方式上,區分scan和get也可以一定程度防止請求風暴。在oceanbase中,get請求是對延遲敏感的,scan請求則要求低一些。而恰好get請求對系統的壓力也小很多。所以,在oceanbase中可以只對get請求使用backup task。

retry和backup task之前的區別在於retry不會給server傳送cancel request。

如何使用伺服器跑程式

深度學習由於引數,資料量較大,經常需要在伺服器上執行程式。本文主要介紹如何使用終端模擬軟體mobaxter 其他終端軟體也基本一樣 連線伺服器並執行 接下來對跑程式常用的linux命令進行說明。第一步 ls 檢視當前目錄下的檔案和資料夾 cd 切換工作目錄 執行 時首先要切換到所要執行 的工作目錄,...

併發伺服器設計

併發伺服器就是能夠同時處理多個客戶端請求的伺服器。併發伺服器可通過多程序或者多執行緒程式來實現,這裡採用多程序程式。include include include include include include include 定義了struct sockaddr in void main 繫結位址...

日誌伺服器設計

日誌伺服器設計 草稿 我的想方式實現乙個log伺服器,然後把所有日誌推向這個伺服器。同時相容現有的 rsyslog log4j,log4cpp.可以通過tcp udp 和管道,向日誌伺服器拋日誌。日誌伺服器,採用多執行緒處理,然後放入列隊。另乙個程序從列隊取日誌,然後進行過濾,通過特徵庫匹配。例如 ...