我提出了一個解決方案,服務器對same*
請求進行了適當的響應,因此不需要對客戶端進行任何更改。
*
首先我們需要確定什麼構成一個請求被視爲「相同」。當您計劃這種優雅,同步,響應時,您會將增加的計數器放入客戶端請求中,並且此計數器是將請求定義爲same
的唯一屬性。但由於您可能無法訪問客戶端並且沒有此類計數器,因此如果它們的post
-body + url是相同的(並且可能導致用戶需要相同),則可以將請求定義爲相同。
因此,每個用戶在到達服務器時立即保存請求。一個簡單的方法是散列url + post
-body,例如SHA-256
並將其保存在如下對象中: requests[user][hashOfRequest] = null
當您的服務器計算出它時,null
將被替換爲響應對象。現在處理請求。
如果客戶再次發送same*
請求,您可以通過檢查您的requests[user][hashOfRequest]
輕鬆找出結果。 如果服務器已完成處理,它將包含一個響應對象,您只需將其發送回客戶端。如果它仍然是空的,你需要等待你的服務器(第一個請求的)處理完成。也許使用事件偵聽器或其他任務同步模式。
服務器完成第一個請求後,它將生成response
並將其保存在requests[user][hashOfRequest]=response
中併發出該事件,以便潛在的等待客戶端也可以獲得響應。
沒有更多的雙重處理和連接從客戶端,其中響應沒有達到他們,也是由這種模式處理。
當然,您應該在適合您的(客戶端)場景後清理響應哈希表。也許10分鐘後,請求被放入哈希表。
這是如何防止後端的雙重處理?隊列將包含雙重請求,並且它們都將最終執行。相反,相同的請求不應該被處理多次。 – philk