2011-12-04 86 views
4

我正在Scala開發一個Web應用程序。它是一個簡單的應用程序,它將從客戶端(JSON或ProtoBufs)獲取端口上的數據,並使用數據庫服務器執行一些計算,然後使用JSON/Protobuf對象回覆客戶端。Java/Scala資源消耗和負載

它不是一個非常重的應用程序。最多1000行代碼。它會在每個客戶端請求上創建一個線程。在獲取請求和回覆之間所花的時間在20-40ms之間。

我需要一個建議,我應該使用什麼樣的硬件/設置來服務每秒3000+這樣的請求。我需要購買硬件才能放入我的數據中心。

任何有經驗大規模部署java應用程序的人,請指教。我是否應該使用帶有32 GB RAM或多個小型機器的2 - 4 Xeon 5500s的大盒子。

更新 - 我們沒有很多客戶。其中3 - 4。請求將來自這3個。

+4

首先通過不在每個客戶端請求上創建線程來優化您的應用程序。使用線程池。然後測量和實驗。 –

+0

您可以嘗試使用SoapUI或類似工具來測量負載。通過這種方式,您可以測試某種類型的機器如何處理您的應用程序所需的負載。 –

+0

忘記提及更新。現在我正嘗試在一個線程中使用HTTP管道從一個套接字獲取多個請求。所以線程數量應該減少。 –

回答

2

如果每個請求平均需要30 ms,則單個核心每秒只能處理30個請求。假設您的應用程序線性擴展(您可以預期的最佳方案),那麼您至少需要100個內核才能達到3000個請求/秒。這是至少2-4 Xeon。

最差的,如果你的應用程序依賴於IO或DB(最喜歡的有用的應用程序),你會得到一個次線性縮放,你可能需要更多...

所以,我們要做的第一件事就是到分析和優化應用程序。這裏有幾個技巧:

  • 創建一個線程是昂貴,嘗試創建線程的數量有限,而且重用他們的請求中(在Java中看到ExecutorService爲例)。
  • 如果您的應用程序是IO密集型:嘗試儘可能減少IO調用,使用內存中的緩存並嘗試使用非阻塞IO。
  • 如果您的應用程序依賴於數據庫,請考慮緩存並儘可能嘗試分佈式解決方案。
+0

是它依賴於數據庫,但不應該是一個瓶頸,因爲它在附近有16 GB RAM的計算機上有一個基於10 GB Redis的鍵值存儲。所以整個數據庫都在其內存中,讀取速度很快。 –

+0

你應該測量它以確保它不是瓶頸......(如果減少線程數量,對你來說不夠) – paradigmatic

+0

你認爲使用雲對這樣的應用程序有好處嗎?或者我們應該使用我們自己的羣集。 ?? –