2015-08-13 176 views
0

我們有一個現有的Web服務,基本上有兩個調用:submitWork,pickup響應。 Web服務的客戶端通過調用提交transactionId響應的submitWork()來提交任務,然後週期性地使用transactionId調用pickup responResponse()以實際得到結果。在服務器內部,工作在幾個不同的進程中執行,一些事件驅動,大約需要15秒才能完成。
新的業務請求是使該進程處於同步調用中,也就是說,客戶端將調用newSubmitWork(),並根據需要提供最終響應。
基本的實現是:將這兩個舊的執行包裝在一個邏輯中,提交工作,然後等待/循環以獲取響應。這使得新的Web服務調用基本上需要大約15秒的時間。在多個併發請求的情況下,這樣長的調用會導致服務器中的各種問題。例如,使用太多的線程,或者沒有超線程可用的線程。或者,呼叫到達服務器的最嚴重的情況開始處理,但客戶端超時,但實際上已完成邏輯。

我正在尋找替代解決方案或這種情況下的做法,所以請告知。

已經在內部討論的幾種選擇:如何使異步調用同步

  1. 重寫內部流程能夠工作同步 - 將採取新的錯誤過長,過於昂貴和高風險。
  2. 而不是鎖定呼叫,建議WS客戶端向他們發回一個帶有結果的回調 - 在這種情況下,所有WS客戶端實際上都需要實現邏輯來處理該呼叫。
  3. 提高服務器資源,內存和線程 - 我個人認爲效率不高,因爲它仍然具有高消息量的風險,超過服務器可以承擔的風險。
  4. 與客戶簽訂合同,在Y時間內不會發送超過X條消息 - 這很好,直到客戶違約爲止。
  5. 構建一個網關WS,在我們這邊,知道當前正在處理的請求的數量,並在知道發生超時的高可能性時丟棄傳入的請求。
+0

以下方法可行嗎? 1)在您的Web服務中,產生一個單獨的線程來處理這兩個任務。 2)向用戶顯示一條消息「你的請求將被處理」在啓動線程後3)在15秒後顯示實際結果 –

+0

@ sunrise76這種方法仍然存在長時間等待的問題,並且如果將有許多併發請求服務器將超載。 – urir

+0

我很好奇你的服務類型,需要15秒才能完成交易。您能否提供有關哪些子任務需要花費大量時間以及完成這兩項任務的總跳數的深入見解? –

回答

1
  1. 這是最乾淨的解決方案,如果你能負擔得起額外的開發,使之同步。

  2. 如果您沒有足夠的資源去解決#1問題,我肯定會去解決這個問題。

  3. 你應該提高資源多少?什麼時候你的應用程序獲得高負載?沒有什麼能保證執行時間。這個解決方案將最終導致例外。

  4. X和Y將取決於您的服務器在撥打電話時獲得多少負載。太多的變量,你不能控制。不是一個好的解決方案

  5. 我不明白這將如何使您的2服務同步。

如果你急於求成,我會毫不猶豫地去找解決方案#2。雖然,您的代碼將更難以用回調進行閱讀。否則#1是最好的,因爲你的應用程序中刪除所有不必要的配對邏輯。

+0

1.目前看起來像是一個很大的NO NO 2.很酷,謝謝3.這確實是最大的問題,我們不確定期望什麼以及最大期望負載是多少。 4.對。 5.這是爲了保護已經同步的過程形式超載。 – urir

+0

我只會將客戶端的超時值調整爲合理的值。如果請求超時,客戶端會知道服務器上有很大的負載。否則,如果您放棄請求,則從客戶端角度來看,它看起來一切正常。 – pmartin8

+0

我看不到長客戶端超時如何解決問題。說客戶端定義X秒超時,他的請求等待服務器開始處理X-1秒(服務器沒有可用的線程),服務器開始處理,並在1秒後客戶端獲得超時... – urir