2009-06-10 82 views
1

我有一個系統需要向外部系統發送請求,只要用戶在我的系統上進行搜索。客戶端服務器系統中退避機制的模式

如果外部系統關閉或需要非常長的時間來回答,我希望我的系統「退後」一段時間。與其試圖向外部系統發出更多請求,我只想讓我的系統用戶立即知道我們目前不會處理他們的請求。

這會爲用戶帶來更好的體驗(不必等待超時),我的系統中的資源佔用更少(線程不會忙於等待外部系統沒有響應或超時)以及它會省掉外部系統。 (在可能已經處於負載狀態的情況下)

經過一段時間,或者當我的系統發現外部系統再次響應時,我想再次恢復正常行爲。

是否有任何模式或標準的方式來做這種事情?具體來說就是跟蹤超時/超時請求的機制,以及什麼時候我們應該再次嘗試的控制機制。

回答

2

我不記得在文獻中看到過這種情況,但我注意到這種任務的模式是以「調度隊列」爲中心 - 一種使各種事情發生的方式(==獲取調用的函數或方法返回),除非先前取消(例如Python的sched標準庫模塊)。當您向後端發送一個(異步)請求時,您也會從現在開始計劃X秒的超時事件;請求對象知道計劃的超時的ID(如果在此之前滿足請求,則取消它),或者還保留一組未處理的請求(所以超時知道何時不需要它) - 哪一個是好的無論如何,因爲它使處理「真正意義上的超時」更容易,請參閱下文。

當發生超時時,它會在將來爲Y秒計劃一次重試,並將來自該容器的所有掛起的請求移動到將來要重試的請求的容器中(並取消所有其他超時(如果這就是系統被設置),並且還向所有等待的客戶端發送「後端很慢,我們將在Y秒內重試」通知。

發生重試事件等等等等。如果在系統暫停時新請求到達,它們會直接進入「待重試」bin。

雖然我找不到描述的這種模式,但如果有的話,它可能在Schmidt's excellent book ...強烈推薦閱讀! - )