0

我打算構建一個獨立/基於Web的Java應用程序。它應該能夠處理數千個請求。請求消息通過TCP端口進入,如6040.我有一個專用線程來不斷偵聽來自客戶端的消息。一旦從套接字讀取消息,此線程將產生一個線程來處理請求。所以它基本上每個請求一個線程。在Java中創建可靠的多線程可伸縮應用程序時需要考慮哪些問題?

爲請求提供服務涉及許多數據庫操作,如調用遠程數據庫中的存儲過程,在本地數據庫中執行更新/插入以及記錄。服務請求後,應將響應發送給客戶端。

我希望這個場景很清楚。總之,我想構建一個強大的多線程可伸縮應用程序(使用陳詞濫調)。我的問題如下:

  1. 如果主線程監聽傳入請求產生一個線程爲每個請求或者它應該只是採取一個從線程池。我問的是我應該在我的應用程序中使用線程產生或線程池。
  2. 是否可以在羣集上部署獨立的Java應用程序?
  3. 使用Web應用程序(部署在JBoss 7.1服務器上)部署和運行它是否是一個好主意,我打算爲管理目的開發它,還是應該將它作爲獨立應用程序?
  4. 一般是什麼,而在Java中建立一個強大的多線程可伸縮的應用
+0

你說的「俱樂部它」是什麼意思?你平均r取消它在同一臺機器上?或者在同一個過程中?或者是其他東西? – joshp

+0

與web應用 – HariShankar

+0

爲什麼你-重新建設的東西是已經建成了很多很多次了一起在同一臺服務器實例上運行嗎?現有實施中缺乏什麼? –

回答

2

爲了確保您的Java應用程序應該擴展到考慮的問題,還有的基本上一個簡單的規則:不要共用州。

所有狀態都應該在線程本地或在後備數據存儲中。這可以確保您可以旋轉完全獨立的應用程序的無限副本(在同一臺機器上),並在前面使用簡單的負載平衡器。

要專門回答您的線程問題,幾乎總是使用適當配置的線程池更好。您避免了將內聯線程產生到請求的開銷,您可以配置合理的限制以避免資源爭用/耗盡。

+0

通過說「不要共享狀態」你是什麼意思?避免線程間通信的權利? – HariShankar

+1

@hari我相信他的意思是避免在線程之間共享可變數據。 (或者至少將其最小化並仔細管理) –

+0

@PeterLawrey:謝謝,我正打算避免這種情況。數據庫將保存線程的狀態。 – HariShankar

2

考慮使用線程池,而不是產生線程,當請求到達時節省一些響應時間。此外,你可以使用非阻塞IO(檢查New I/O有一個單線程監視許多連接。此外,史蒂文Schlansker說:不共享狀態!

0

我不知道它是否真的值得建立它從無到有,從生產力的角度來看,這將是更快重用現有的Web容器,如碼頭,Tomcat的,等等。如果你遵循Servlet API的,你只需要描述你的業務邏輯和容器將處理併發的你。

這需要大量的時間到Web容器的優化性能。即使是大公司選擇的Tomcat /碼頭,如谷歌的App Engine。

+0

如果它是一個獨立的應用程序,我將不得不從頭開始構建。如果我將它部署在Tomcat/Jetty/JBoss等Web-COntainer中,我需要知道的是Web容器是否會處理對特定端口的請求(比如說6040)的負載平衡。 – HariShankar

+1

是的,如果您將其部署到Web容器,容器將處理所有工作線程之間的負載平衡。基本上,大多數容器將http請求放入任務隊列/池中,所有工作線程都可以在完成前一個任務後選擇新任務。 –

相關問題