我有一個棘手的問題,我正在運行的web服務。我用一種很好的方式解決了這個問題,但我想知道我能做些什麼更好的事情。同步來自多臺機器的外部Web請求
基本上我正在運行一個Java web服務(在AWS Elastic Beanstalk中,所以跨多個服務器)。該服務返回其緩存的結果,但如果請求的輸入不存在於緩存(SQL Server數據庫)中,則該服務必須調用外部供應商。這花錢,所以我想確保這個調用在多個機器上不重複,如果他們恰好在同一時間接收到請求(即在第一臺機器收到供應商響應並將其寫入數據庫之前)。
目前我正在處理這個問題,通過在進行外部調用之前向數據庫中寫入「IsPending = 1」行,然後將該行更新爲「IsPending = 0」並在呼叫返回時填充接收的數據。在任何機器發出外部呼叫之前,它會檢查數據庫中的待處理行。如果找到一個,它會在活動線程上重複調用.sleep(),每等待一次(當前爲30ms)後再次檢查DB。如果它過度等待,它只是爲自己打電話(但到目前爲止,這並非真的必須發生)。
所以雖然這種解決方案大多可以工作,但它顯然相當複雜,並不能解決100%的情況。正如我之前提到的,我正在使用AWS,因此我有他們的工具供我使用。我很想知道是否有更好的方法來解決這個問題。謝謝!
您的解決方案聽起來不錯。 – ZhongYu
如何使用隊列?當您的本地數據庫中不存在條目時,將請求放入隊列中,只有一個進程(服務器)將讀取該請求,並且其他服務器始終輪詢數據庫。此外,可以使用Lamda函數+觸發器自動讓您的實例知道隊列請求何時完成,並從整個解決方案中刪除輪詢? –