我們有一個現有的Web服務,基本上有兩個調用:submitWork,pickup響應。 Web服務的客戶端通過調用提交transactionId響應的submitWork()來提交任務,然後週期性地使用transactionId調用pickup responResponse()以實際得到結果。在服務器內部,工作在幾個不同的進程中執行,一些事件驅動,大約需要15秒才能完成。
新的業務請求是使該進程處於同步調用中,也就是說,客戶端將調用newSubmitWork(),並根據需要提供最終響應。
基本的實現是:將這兩個舊的執行包裝在一個邏輯中,提交工作,然後等待/循環以獲取響應。這使得新的Web服務調用基本上需要大約15秒的時間。在多個併發請求的情況下,這樣長的調用會導致服務器中的各種問題。例如,使用太多的線程,或者沒有超線程可用的線程。或者,呼叫到達服務器的最嚴重的情況開始處理,但客戶端超時,但實際上已完成邏輯。
我正在尋找替代解決方案或這種情況下的做法,所以請告知。
已經在內部討論的幾種選擇:如何使異步調用同步
- 重寫內部流程能夠工作同步 - 將採取新的錯誤過長,過於昂貴和高風險。
- 而不是鎖定呼叫,建議WS客戶端向他們發回一個帶有結果的回調 - 在這種情況下,所有WS客戶端實際上都需要實現邏輯來處理該呼叫。
- 提高服務器資源,內存和線程 - 我個人認爲效率不高,因爲它仍然具有高消息量的風險,超過服務器可以承擔的風險。
- 與客戶簽訂合同,在Y時間內不會發送超過X條消息 - 這很好,直到客戶違約爲止。
- 構建一個網關WS,在我們這邊,知道當前正在處理的請求的數量,並在知道發生超時的高可能性時丟棄傳入的請求。
以下方法可行嗎? 1)在您的Web服務中,產生一個單獨的線程來處理這兩個任務。 2)向用戶顯示一條消息「你的請求將被處理」在啓動線程後3)在15秒後顯示實際結果 –
@ sunrise76這種方法仍然存在長時間等待的問題,並且如果將有許多併發請求服務器將超載。 – urir
我很好奇你的服務類型,需要15秒才能完成交易。您能否提供有關哪些子任務需要花費大量時間以及完成這兩項任務的總跳數的深入見解? –