2016-03-17 126 views
2

我目前正在構建一個web應用程序來顯示遠程機械的實時儀表板。我正在嘗試使用Nodejs來實現這個系統,並且我希望得到關於如何實現它的想法的批評。設計一個Nodejs Web應用程序

的應用程序都將有兩個主要目標:

1)顯示實時的機械狀態,更新它大約每分鐘左右

2)保存狀態的機器每15分鐘一次到數據庫。

爲了訪問數據,我需要向第三方供應商提出API請求以從他們的數據庫中提取數據。我需要爲每臺機器提供大約6個請求,到今年年底,我將一次支持大約20臺機器。綜合考慮這些因素,我需要每分鐘發出大約120個請求,以獲取有關機器的最新信息。

正在使用webapp的用戶只能在登錄時看到機器的子集。但是,有些機器將在不同的用戶之間共享,所以我並不是爲了同時查看同一臺機器的用戶複製API調用,而是建立一個每分鐘刷新一次的所有機器數據的緩存,然後只向每個用戶發送與他們相關的部分數據。另外,這對數據記錄的目的很方便,因爲當我想保存數據時,我只需保存整個緩存。

我的一個擔心是能夠及時完成數據獲取API請求,以便重新顯示數據。我知道我可以使用異步庫在並行調用中收集數據,但是我擔心這些請求不會及時完成,然後再生成第二個更新,從而導致請求建立。一種選擇是,我可以讓每個api請求將數據發送到前端,而不受其他請求的影響,但我希望能夠批量更新所有內容。

我在構建系統時遇到的另一個問題是,socket.io是否會成爲我需要的有用資源。我知道該庫可以幫助您生成實時應用程序,這是我需要做的,但從我讀到的內容來看,socket.io似乎設計用於共享所有更新,讓所有用戶都可以共享,而不僅僅是向每個用戶發送部分更新。與其使用socket.io發送服務器驅動的更新,我可以在應用程序的前端添加一些代碼以定期請求更新。使用這個解決方案意味着我也可以讓每個客戶簡單地請求他們需要的數據。但是,我仍然對圖書館是否能夠提供可用於開發該項目的任何內容感到好奇。

我最後的擔心與縮放應用程序有關。在年底之後,我需要監視越來越多的機器,並且每增加一臺機器,我需要抓取和存儲的數據量也會增加。如果任何人有任何關於如何儘早開始設計系統的建議,我想聽聽它。

我很欣賞任何反饋。謝謝。

+0

我建議您在緩存存儲時使用redis框。您可以讓主節點實例處理必要的請求,將結果保存爲redis,並讓所有必需的節點子實例以非常快的速度從redis中獲取最新信息。此外,redis具有發佈/訂閱功能,可以讓您向所有實例廣播有新數據的內容,因此每個實例都可以獲取並通過websocket將其推送到您的用戶界面,而無需您的用戶進一步刷新。 – ruedamanuel

回答

0

不能解決所提出的所有問題,但我想:

1 - 使用socket.io

它允許數據被「發射」,從客戶機到服務器,反之亦然。服務器可以向所有客戶端或特定客戶端廣播數據。

我會研究socket.io如何縮放。

注NGINX與socket.io

2的偉大工程 - 如果它是可以接受的,我會建議一個Dockerised解決方案。 Docker允許你容納你的解決方案。例如,您的Docker容器將容納您的Web服務器和要提供的文件。這給出了關注的完全分離。您也可以輕鬆地將解決方案推送到Docker(想想推動和拉動VM)。

從容器中的任何位置拉取解決方案使部署變得如此簡單。

請注意,Docker對於縮放來說是驚人的。您可以創建一個基本圖像 - 例如一個無狀態的Web服務器 - 然後從這個映像帶來3個獨立的Docker容器。在它們前面裝入一個負載平衡器,並在需要時添加更多容器。從@ danday74