2017-02-25 30 views
0

我想要設計一個應用程序,其中後端持續輪詢不同的傳感器,而前端(sinatra)允許通過json api查看此數據,或者通過簡單顯示在html中的結果。如何允許sinatra智能輪詢數據

我應該怎樣考慮開發這樣的應用程序,以及如何構建應用程序以實現最佳擴展和易於維護。

我的第一個想法是簡單地讓sinatra在每次接收到正確的端點請求時都對傳感器進行輪詢,但是這看起來好像會讓安靜得很快,特別是看到某些傳感器每隔幾秒鐘才更新一次。

我的第二個想法是讓後臺進程(或線程)輪詢傳感器並存儲sinatra的值。當接收到請求時,sinatra可以簡單地輪詢後臺進程以獲取緩存的值(或從線程代碼中提取)並將其呈現給客戶端。

我更喜歡第二個想法,但我不確定我將如何開發「後臺應用程序」,以便sinatra可以輪詢數據以呈現給客戶端。另一種選擇是讓sinatra對傳感器輪詢代碼進行線程化處理,以便它可以在同一個進程中從中獲取值,而不是從另一個進程請求它。


適當注意,這個應用程序也將負責不同的繼電器自動化和基於這樣的關閉傳感器和西納特拉僅用於中繼傳感器的狀態向用戶負責。我認爲將後臺進程/後臺進程中的後端(自動化+傳感器信息)與前端(sinatra)分開將是理想的,但我不確定我將如何獲取sinatra的數據。


任何人都有關於如何構造這個結構的任何輸入?如果可能的話,我也會欣賞一個示例應用程序,它只是顯示我可以採用和修改的想法。

感謝

編輯::

後多一點研究,我發現drb(分佈式紅寶石http://ruby-doc.org/stdlib-1.9.3/libdoc/drb/rdoc/DRb.html),它使您可以在網絡上對象的遠程調用。這可能是一個合適的解決方案,因爲守護進程可以自動執行繼電器,讀取傳感器並將值存儲在類對象中,然後通過drb呈現類對象,以便sinatra可以調用遠程對象上的getters以獲取從守護進程到日期數據。這是我最初想要做的。

你們認爲什麼?這對這樣的應用程序是可取的嗎?

+0

你應該使用WebSockets進行雙向通信。它將消除完全輪詢的必要性。我建議[faye-websocket](https://github.com/faye/faye-websocket-ruby) –

+0

@maxple我找到了'DRB'並編輯了我的問題的一部分。你認爲DRB適合與sinatra一起使用嗎?理想情況下,我正在尋找一種方式從遠程過程中輕鬆獲取數據,以便在另一個進程中運行的sinatra可以將數據呈現給客戶端。 –

+0

我不知道DRB,所以我不知道。但是,您也可以使用服務器<=>服務器通信的websockets(如果您可以在傳感器機器上運行webapp) –

回答

0

我決定與Sinatra,DRB和Daemons一起去滿足我上面提到的要求。

Web前端將在其自己的進程中運行並且僅通過與後端的DRB交互來提供統計信息。這將允許客戶端的快速響應時間,並允許我從後端代碼中分離出前端代碼。

後端將在其自己的進程中運行並不斷輪詢傳感器以進行更新並將它們作爲類對象與getter存儲,以便Sinatra可以在需要時通過DRB獲取信息。它還將使用收集的信息進行項目特定的自動化。

最後,後端和前端將使用守護程序包裝程序打包,以便該項目具有啓動,重新啓動,停止,運行狀態和自動重新啓動守護進程的功能,如果它崩潰或退出原因。

來源的信息:

http://phrogz.net/drb-server-for-long-running-web-processes

http://ruby-doc.org/stdlib-1.9.3/libdoc/drb/rdoc/DRb.html

http://www.sinatrarb.com/

https://github.com/thuehlinger/daemons