問:從AppEngine的Servlet調用Web服務(每秒0.5-1.5秒)的最佳方式是什麼?阻止呼叫在AppEngine環境中是否可擴展?從AppEngine的Servlet調用Web服務
上下文:我正在開發一個使用AppEngine和J2EE的Web應用程序。這些應用程序調用Amazon Web服務來爲用戶獲取一些信息。從我的asp.net經驗來看,完成這些調用的最好方法是使用異步http處理程序來防止在IIS線程池中出現飢餓。對於Servlet 2.5規範的J2EE(3.0 is planned),此功能不適用。
現在我正在考慮讓我的控制器(和servlets)線程安全並請求作用域。我還能做些什麼嗎?這是J2EE + AppEngine環境中的問題嗎?編輯:我知道AppEngine和JAX-WS的異步調用支持,但我不確定它如何與servlet環境一起玩。編輯:我知道AppEngine和JAX-WS的異步調用支持,但我不確定它如何與servlet環境一起玩。據我瞭解,要完成servlet請求,代碼仍然應該等待異步WS調用完成(回調或其他)。 我假設使用同步原語做它會阻塞當前工作線程。
因此,就線程被阻塞而言,爲了服務另一個用戶請求,servlet容器需要在線程池中分配新線程,爲堆棧分配新內存並浪費時間進行上下文切換。而且,當線程池中的線程用完時,請求可能會阻塞整個服務器。這個假設基於ASP.Net和IIS線程模型。它們適用於J2EE環境嗎?
回答:在研究Apache和GAE文檔後,線程池中線程的匱乏似乎不是真正的問題。 Apache默認情況下有200個線程池的線程(與asp.net和IIS中的25個線程相比)。基於此,我可以推斷出線程在JVM中相當便宜。
如果真的需要異步處理,或者servlet容器將耗盡線程,可以重新設計應用程序以通過google channel API發送響應。 的工作流程是這樣的:
- 使同步請求與Servlet
- 的Servlet使得對background工人創造了異步回覆和隊列任務通道
- 的Servlet返回響應客戶
- [服務其他請求]
- 後臺工作人員通過處理並將數據推送到客戶端channel api
Web服務結果是否需要顯示給用戶?你不能將ws調用轉移到後臺任務隊列嗎? – systempuntoout
是的。用戶調用搜索請求,並且WS執行實際搜索。但爲此實施一種共享方案是一個好主意! –