2011-11-17 70 views
5

我有一個應用程序與運行:Nginx的nginx/node.js/postgres是一個非常可擴展的架構嗎?

  • 一個實例作爲前端(服務靜態文件)
  • 針對後端的node.js應用的集羣(使用簇和expressjs模塊)
  • :如果應用程序需要的可擴展性(這只是針對HTTP/REST請求)Postgres的爲DB

的一個實例是這種架構足夠

  • 每秒500個請求(每個請求只從數據庫中提取數據,這些數據可能是幾個ko,並且在提取之後不需要大計算)。

  • 20000的用戶在同一時間

連接在哪裏可能是瓶頸?

+0

您使用的是什麼nodejs模塊?你只是做HTTP或還使用socket.io或dnode或nowjs左右? – thejh

+0

我只將它用於HTTP/REST請求。我主要使用expressjs和cluster node.js模塊。 – Luc

+0

這取決於...每小時請求多少個請求,每小時有多少活動用戶,請求有多複雜,您使用緩存嗎,您是否擁有分區數據的機制或只有一個數據庫實例? – beny23

回答

4

對於指定的負載(500個簡單請求/秒),我不會認爲這將是一個太大的問題。我的猜測是,一個節點實例集羣甚至不是必需的。

但是,由於您只有一個實例,因此在擴大規模時,這很可能會成爲您的瓶頸。你還有一個額外的問題,那就是你的單點故障(我對Postgres不熟悉,這裏使用了Oracle集羣和數據保護,這意味着我們有一個備份數據庫集羣來緩解這一點) 。

如果您不需要關係數據模型,那麼MongoDB可能是一個更具可擴展性的選擇。

要記住的另一件事是你的網絡基礎設施。如果要添加羣集/節點,請確保網絡可以處理分佈式負載。最後一件事:通常,不可能確定架構上的應用程序是否可以在沒有性能/容量/壓力測試的情況下處理特定的負載,所以答案是「可能」。

+0

謝謝你的好解釋。我記得在前幾次嘗試Mongo時遇到了一些麻煩,因爲我考慮了關係模型,並且無法將其移動到面向文檔的格式。 – Luc

0

你應該可以500 ops/sec。如果您希望進入千次操作/秒,則重新設計。

不知道你的更多數據,磁盤I/O將成爲你最可能的瓶頸。如果你是從硬盤庫存硬件中獲取I/O,並且在SQL命令上執行JOIN時速度也會變慢,那麼PostgreSQL數據庫中會出現大約10k ops/sec的數據。這也會降低您嘗試訪問單個驅動器的併發用戶越多。您的驅動器尋找時間會變得異常困難,因爲您將不斷地隨機訪問驅動器。

您應該研究數據的結構,以及是否需要關係數據庫(您是否必須執行JOIN?)。一個noSQL解決方案可能是要走的路。總是嘗試儘可能分散和順序地獲得磁盤I/O。