2015-04-04 30 views
1

比方說,當用戶登錄到Web應用程序時,他會看到一個信息列表。這個MEAN堆棧設計模式適合1,000-10,000個用戶規模嗎?

假設的信息列表由兩個DYNOS(通過Heroku的)中的一個服務,但信息列表從單蒙戈數據庫(即的NodeJS DYNOS只是過客蒙戈信息來源於當他登錄到webapp時給用戶)。

問題:假設我想有可能使用戶既修改添加到的信息列表。

在1,000-10,000的用戶的比例是合適的以下策略:

  1. 用戶修改/添加到數據; HTTP POST被髮送到具有更新數據的兩個nodejs dynos中的一個。
  2. Dyno(無論哪一個)都需要修改/添加數據,並直接查詢mongo數據庫以更新數據。
  3. Dyno向客戶端發送更新成功的確認信息。

可以嗎?我需要添加更多的dynos(heroku)嗎?我基本上擔心,如果一羣用戶試圖一次訪問單個數據庫,速度會很慢,或者我以某種方式冒着損失1,000-10,000人的整個數據庫的風險。這種恐懼是否合理?

回答

1

簡答:是的,這是一個合理的恐懼。更長的答案,取決於。

MongoDB將排隊響應,並按照它收到的順序處理它們。取決於從內存中提供多少內容,它可能會或可能不夠快。

NodeJS具有相同的設計模式,它將排隊它不處理的響應,並在資源可用時執行它們。

要判斷性能是否受到阻礙,唯一的方法就是通過監控它,並查看資源是否始終達到閾值,您不適合傳球。好處是,在你的發現階段,你的客戶可能只會注意到幾毫秒的延遲。

實施該方法的正確方法是在資源消耗用於處理流量時創建新實例。

您的數據庫可能不會損壞,但是如果您的數據很重要(如果不是,您爲什麼要收集它)?您應該創建一個副本集。在與第二個節點實例進行交互之前,我可能會使用一組副本數據。

+1

所以瓶頸不會是節點dynos,這將是事實,只有一個分貝?你是什​​麼意思「在資源消耗時啓動一個新實例」 - 在節點中創建一個新實例? – George 2015-04-05 19:21:05

+0

@George好吧不一定,但除非你的應用程序是CPU密集型的,否則你的瓶頸很可能就是數據庫的寫入/讀取。 1k-10k不是大量的用戶,除非他們都決定在同一秒內使用它。您是否已經與您的用戶打過這個號碼?我在EC2實例中使用了「實例」一詞,但我的意思是在您的情況下使用Dyno。 (Dynos是EC2實例的部分用途)。Heroku有Adept Scale,它可以自動+/- +/- Dynos,但你仍然需要優化你的應用程序以正確使用它。起點https://devcenter.heroku.com/articles/node-concurrency – 2015-04-05 21:51:17