我們有一種情況,我們正在調用一個相當昂貴的API函數。讓我們叫它API.ExpensiveCall()
通過每10秒查詢一次錯誤的想法來緩存結果?
這個ExpensiveCall()
在Web應用程序中被頻繁調用。雖然對於一個用戶來說並不明顯,但當你有5個左右同時在線的用戶時,它會變得很明顯。
我們想要緩存這些結果。但由於API.ExpensiveCall()
對我們來說基本上是一個黑匣子,我們無法使我們的緩存無效,知道何時刷新。
所以我們提出的解決方案是創建一個windows服務,它將每隔10秒簡單地調用這個API.ExpensiveCall()
,然後將結果保存到Web應用程序已經使用的本地數據庫中。
這樣,如果網站上有1個用戶或20多個用戶,則只需每10秒調用一次ExpensiveCall()
即可。這是API.ExpensiveCall()
連接到的外部系統上的受控負載。
問題
我們的項目經理不同意這種說法。出於某種原因,他認爲每10秒鐘進行一次定時刷新是一個壞主意,因爲他認爲這會給外部系統帶來太多的負擔。
但是,如果我們沒有做任何事情,並且沒有任何緩存的方式,它不僅會降低Web應用程序的性能,但它肯定會導致不止一個ExpensiveCall第二在外部系統。而且這個數字會根據Web應用程序上的用戶數量而倍增。
我想問問你這種緩存方式真的這麼糟糕嗎?你有沒有聽說過使用這種方法進行緩存的其他系統?如果這是一個糟糕的主意,當系統對你來說是一個黑盒子時,有沒有其他更好的緩存系統結果的方法?
編輯:
您的回答似乎表明我應該使用的ASP.Net的內存緩存機制超時功能。
我喜歡超時的想法。我現在看到的唯一(小)問題是,當超時到期並且是時候調用ExpensiveCall()時,它將是阻塞調用。與查詢本地表格不同,本地表格通過不斷刷新的單獨過程保持最新狀態。這是我發現投票想法有吸引力的事情。儘管我必須承認,每10秒輪詢一次就會感到奇怪,這就是爲什麼我要圍繞它進行輪詢。
是的,這正好描述了我需要做的事情。我想我在描述中錯過了「異步」這個詞。我會調查這一點。謝謝。 – 7wp