【问题标题】:Play framework: service to service continuous communication播放框架:服务到服务的持续通信
【发布时间】:2014-02-06 16:39:49
【问题描述】:

我需要一些建议/了解如何最好地实现某些功能。我的任务是实时系统监控仪表板。

假设我有以下基于两台物理服务器的设置:

Server1 正在运行 Play 应用程序,该应用程序监视某些文件、服务等的更改。一旦发生变化,它就会提醒另一个在 Server2 上运行的 Play 应用程序。

Server2 正在运行一个 Play 应用程序,该应用程序为 Web 前端提供服务,显示从 Server1 上的 Play 应用程序发送给它的实时仪表板数据。

我只熟悉 Play 框架,它为 http 请求提供数据,但我需要它在这种特殊情况下运行的方式有点不同。

我的问题是如何按照我上面描述的方式保持这两个 Play 应用程序的持续连接?要求是 Server1 应用程序将根据需要将数据推送到 Server2 应用程序,而不是 Server2 应用程序在无限循环中运行并每 5 秒询问 Server1 应用程序是否有任何新数据。

我正在使用带有 Scala 的 Play Framework 2.2.1。

【问题讨论】:

  • 你能告诉我为什么它们是两个独立的 Play 应用程序吗?
  • @VenkatSudheerReddyAedama 因为可以有多个 Server1(生产服务器)和一个 Server2(监控服务器)。我也不能使用 JSONP,它对我的​​需求来说太有限了。

标签: scala service playframework playframework-2.0


【解决方案1】:

实际上,Play 2.0 中引入的Akka 完全符合您的要求(正如 Venkat 指出的那样)。

结合其 remotingschedulerfutures 可能性,您将能够构建您需要的每个监视器。

Scanerio 可能是 ie:

  • S1 让我们将其命名为 Doctor 使用 Akka 的调度程序每隔几秒监控一次资源
  • 如果 Doctor 检测到更改,则将 Akka 消息发送给 S2 的 actor (FrontEnd),否则什么也不做。
  • 提到的FrontEnd 的actor 可以将事件添加到某个queue,或者直接将其推送到某个WebSocket,这会将其推送到浏览器。其他选项是在 FrontEnd 设置另一个 scheduler,它将检查 queue 是否包含新事件。

检查包含的示例应用程序如何与浏览器(即commet-live-monitoringeventsource-clock)通信前端

对于DoctorFrontEnd 应用程序之间的通信,akka-remote 是很有前途的功能。

【讨论】:

  • 谢谢,我有点意识到我想做的事情是可能的,我只是不知道怎么做。更多细节、解释、一个伪示例就足够了。
  • 对不起,不能给你示例代码(需要先测试方法),但在编辑中你会找到一些提示,充分利用它;)另外检查 Venkat 的答案,因为它描述方法也不错。
【解决方案2】:

我认为服务器发送的事件(SSE:http://dev.w3.org/html5/eventsource/)是您正在寻找的。由于它应该只是单向推送(server1 将数据推送到 server2),因此 SSE 可能是比全双工双向连接的 WebSocket 更好的选择。由于您的 Server2 有一个 Web 前端,如果您使用 SSE,浏览器可以自动重新连接到 Server1。大多数现代浏览器都支持 SSE(IE 不支持)。

由于您使用的是 Play 框架:您可以使用 Play WS API 进行服务到服务的通信,还可以利用强大的抽象来异步处理数据,例如 Enumerator 和 Iteratee。玩!与 Akka 无缝集成,您可以使用 Actors 管理/监督 HTTP 连接。

编辑:

分步回答“一项服务如何根据需要将数据推送到另一项服务”:

  1. 管理 HTTP 连接:Server1 需要有一个 WebService 客户端来管理与 Server2 的 HTTP 连接。 “管理 HTTP 连接”是指:重新连接/重置/断开 HTTP 连接。 Akka Actors 是解决这个问题的一个很好的用例。基本上这个actor会接收CONNECT、CHECK_CONN_STATUS、DISCONNECT、RESET等消息。有一个调度程序让你的HttpSupervisor actor检查连接状态,这样如果连接失效,你就可以重新连接。

    val system = ActorSystem("Monitor")

    val supervisorRef = system.actorOf(Props(new HttpSupervisor(system.eventStream)), "MonitorSupervisor")

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

  2. 聆听变化并按需推送: 创建一个产生更改的枚举器。创建一个 Iteratee 以异步使用更改。同样,一些可能有帮助的代码:

    val monitorIteratee = play.api.libs.iteratee.Iteratee.foreach[Array[Byte]] (WS.url(postActionURLOnServer2).post(new String(_, "UTF-8")))

将迭代对象附加到枚举数。

【讨论】:

  • 我知道您指出的大部分内容,但它没有回答我的问题。我如何根据需要创建一项服务来将数据推送到另一项服务?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多