2014-02-06 43 views
0

我需要一些建議/見解如何最好地實現某些功能。我的任務的想法是實時系統監控儀表板。發揮框架:服務連續通信服務

比方說,我有基於兩個物理服務器上以下設置:

它監視特定的文件,服務等更改

Server1的運行Play應用程序。一旦發生變化,它就會警告在Server2上運行的另一個Play應用程序。

Server2正在運行一個Play應用程序,該應用程序用於顯示從坐在Server1上的Play應用程序向其發送實時儀表板數據的Web前端數據。

我只以一種向http請求提供數據的方式熟悉Play框架,但我需要它在這種特定情況下運行的方式稍有不同。

我的問題是我如何讓這兩個Play應用程序保持連接,就像我上面描述的那樣?要求是Server1應用程序將需要的數據推送到Server2應用程序,而不是Server2應用程序在無限循環中運行,並詢問Server1應用程序是否每5秒有新數據。

我在Scala中使用Play Framework 2.2.1。

+0

你能告訴我他們爲什麼是兩個獨立的Play應用程序嗎? –

+0

@VenkatSudheerReddyAedama因爲可能有多個Server1s(生產服務器)和僅一個服務器2(監視服務器)。我也無法使用JSONP,這對我的需求來說太有限了。 – Caballero

回答

2

其實Akka介紹Play 2.0完全符合您的要求(Venkat指出)。

結合其遠程調度期貨可能性,你將能夠建立每臺顯示器需要。

Scanerio可能,即:

  • S1,讓我們將它命名爲醫生使用阿卡的調度監控資源每幾秒鐘
  • 如果醫生檢測到更改發送阿卡消息S2的演員(前端)否則什麼也不做。
  • 提到前端的演員可以添加事件,一些隊列,或推即直接在一定的WebSocket,將它推到瀏覽器。另一種選擇是在前端將檢查是否隊列包含新的事件設置另一個調度

檢查包含的樣本應用程序,你可以如何與瀏覽器(即commet-live-monitoringeventsource-clock)傳達你的前端

對於醫生前端應用程序之間的通信,akka-remote是有希望的功能。

+0

謝謝,我有點明白,我想要做什麼是可能的,我只是不知道怎麼辦。一些更多的細節,解釋,一個虛擬的例子是我需要的。 – Caballero

+0

對不起,不能給你的示例代碼(需要先測試方法),但在編輯,你會發現一些小技巧,使這最好使用;)還要檢查Venkat擁有的答案,因爲它描述了不錯的方法爲好。 – biesior

1

我認爲服務器發送的事件(SSE:http://dev.w3.org/html5/eventsource/)是你在找什麼。由於它應該只是單向推送(server1將數據推送到server2),所以SSE可能是比全雙工雙向連接的WebSockets更好的選擇。由於您的Server2具有Web前端,因此如果您使用SSE,則瀏覽器可以自動重新連接到Server1。大多數現代瀏覽器都支持SSE(IE不支持)。

由於您使用的是Play Framework:您可以使用Play WS API for Service進行通信,還可以利用強大的抽象來像Enumerator和Iteratee那樣異步處理數據。當玩!無縫集成Akka,您可以使用Actors管理/監督HTTP連接。

編輯:

回答「究竟如何,一個服務可以把數據傳輸到另一個需要的基礎上」的步驟:

  1. 管理HTTP連接:服務器需要有一個WebService客戶管理與Server2的HTTP連接。通過「管理HTTP連接」我的意思是:重新連接/重置/斷開HTTP連接。阿卡演員是解決這個問題的好用場。基本上這個actor接收CONNECT,CHECK_CONN_STATUS,DISCONNECT,RESET等消息。爲你的HttpSupervisor actor創建一個調度器來檢查連接狀態,以便在連接失效時重新連接。

    VAL系統= ActorSystem( 「監視器」)

    VAL supervisorRef = system.actorOf(道具(新HttpSupervisor(system.eventStream)), 「MonitorSupervisor」)

    system.scheduler.schedule(60秒,60秒,supervisorRef,CHECK_CONN_STATUS)

  2. 聽取更改並按需求PUSH: 創建一個產生更改的枚舉器。創建一個用於異步使用更改的Iteratee。再次,一些代碼,可能會有所幫助:

    VAL monitorIteratee = play.api.libs.iteratee.Iteratee.foreach [數組[字節]] (WS.url(postActionURLOnServer2).POST(新的字符串(_, 「UTF-8」)))

附上iteratee到枚舉器。

+0

我知道你指出的大部分內容,但它不能回答我的問題。如何在需要的基礎上提供一項服務將數據推送到另一個服務? – Caballero