我現在正在兩個WebApi項目中工作,在這兩個項目中我們遇到了同樣的問題:我們有一些操作Actions
,如果正在執行操作A
,則無法執行操作,反之亦然。因此,例如,如果Actions
中的任何一個正在運行,並且用戶發送請求到動作A
,那麼動作A
必須等待其他動作完成後才能運行。如何處理RESTful服務中的互斥操作?
從有狀態服務的背景來看,我們的第一個想法是使用鎖,雖然有很大的阻力。我們創建了一個單一服務,只需將object
映射到用戶標識,並將其用作鎖。
現在,當然這會帶來一些非常棘手的問題,如:
(1)我們必須強迫用戶一直跟到只有一個服務器實例,甚至當他們的請求都從不同的設備進來世界各地不同,因爲鎖不會自動跨越一個實例。
(2)然後,我們將不得不建立我們自己的[次優]負載均衡器。我們的計劃是使用Azure的內置版本。
所以我的問題是:你如何優雅地處理這個問題的方式,不會損害水平可伸縮性,並且最好不需要自定義負載平衡策略?
但是,通過排隊不會遇到與鎖定相同的問題 - 也就是說,不得不迫使用戶只使用一個服務器實例,或者不得不繞過實例傳遞狀態?使用選項1,我必須構建自己的負載平衡器。選項2會產生許多不同的問題,可能會佔用過多的帶寬。 –
我已經更新了答案,有點更詳細。誠然,它仍然是相當通用的,但希望它能爲您提供足夠的解釋,以確定您是否可以將其應用於您的特定情況。 – seairth
「隊列」是否可能是一個數據庫,以便可以從多個負載平衡服務器訪問請求及其狀態? –