具有外部输入和实时通知的Web应用程序的想法

时间:2009-07-15 22:54:41

标签: ruby-on-rails ajax notifications

我将构建一个Web应用程序,它将接受来自外部源的不同事件,并快速将它们呈现给用户以进行进一步的操作。我想将Ruby on Rails用于Web应用程序。该项目是一个内部开发项目。我希望简单易用的解决方案能够在高可靠性和复杂系统上快速开发。

它应该做什么

用户在其浏览器中打开了Web应用程序。现在打来的电话就是。电话呼叫由PBX监控守护程序注册。在这种情况下,通过Asterisk Manager界面。守护程序以某种方式向Web应用程序发送可用信息(远程扩展,本地扩展,呼叫方向,通道状态,开始时间,结束时间)。接下来,用户收到有关电话呼叫事件的通知。用户现在可以使用它。例如,输入摘要或将呼叫与客户资料匹配。

从PBX上的第一个事件(例如,创建新频道)到浏览器中的弹出通知的持续时间应该很短。鉴于网络速度快,我希望在两秒钟内完成。有关事件的单条信息是异步创建的。本地扩展可以与远程扩展分开提供。用户可以在呼叫结束前输入摘要。一方挂断后,界面上会显示结束时间,新状态等。

PBX监视器只是一个数据源。将有更多的监视器,如电子邮件或通过Web表单的请求。监视守护程序不一定与数据库或Web服务器在同一主机上运行。我没有想象应用程序将很快为数千个登录用户或并发请求服务。但是从设计中,每分钟可能大约相同数量的事件的200个用户不应该是可扩展性问题。

我该怎么办?

我很想知道如何设计这样的应用程序。你会建议什么技术?守护进程如何传达他们的信息?关于存储在主数据库中的事件的数据何时以及由谁?如何通知用户?浏览器是否应该代表守护程序接收完整的数据集,或者仅仅是新数据可用的简短说明?使用哪个JS库以及如何在服务器端创建必要的代码?

在我的研究中,我遇到了很多可能性:消息代理,队列服务,一些rails后台任务解决方案,HTTP推送服务,XMPP等等。我将研究的一些产品:ActiveMQ,Starling和Workling,Juggernaut和Bosh。

也许我的目标太高了?如果有一种更简单或更简单的方法,比如只使用Rails的XML或JSON接口,我想更多地阅读它。

我希望文字不会太长:)

感谢。

4 个答案:

答案 0 :(得分:1)

你可以通过多种方式解决这个问题,但我唯一的评论是:推,不拉。对于低延迟,它不仅更快更有效,因为您的服务器现在不必每秒轮询数据库/队列来处理n *客户端。 ActiveMQ没问题,但如果你不是在寻找疯狂的持久性水平,Starling可能会更好地为你服务。

你几乎肯定最终会在客户端使用Flash(Juggernaut上次检查时使用它)或Java。这对您的客户来说可能是一个问题(如果他们没有安装Flash / Java),但对大多数人来说这不是问题;仍然,拉动通知系统的回退机制可能是谨慎实施的。

答案 1 :(得分:1)

如果你想跳过Java和Flash,或许使用Comet系列中的技​​术从服务器推送到浏览器是有意义的吗?

http://en.wikipedia.org/wiki/Comet_%28programming%29

为了简单起见,对于从守护进程到Web浏览器的通知,我将Rails留在中间,为该Rails应用程序创建一个RESTful接口,并让所有守护进程向其报告。然后在您的守护进程中,您可以执行一些简单的操作,例如使用curl或libcurl发布通知。然后,Rails应用程序将负责收集来自各种来源的传入通知,并通过使用Comet解决方案的JavaScript或通过使用Flash或Java实现的某种更胖的客户端将它们报告给浏览器。

答案 2 :(得分:0)

也许http://goldfishserver.com可能会对您有所帮助。它提供了一个简单的API,允许推送通知到您的网页。简而言之,当您的数据更新时,将其(一些有效负载数据)发送到Goldfish服务器,并通过相同的数据通知您的客户端浏览器。

免责声明:我是一名从事金鱼工作的开发人员。

答案 3 :(得分:0)

问题

  • 有一个事件-外部事件(或内部事件)。
  • 应该通知用户。

一种解决方案

  • 我自己正面临这个问题。我还没有解决,但是这就是我打算做的。它也可能对您有帮助:

(A)应用程序必须(通过暴露的端点)了解有关事件的信息

  • 公开一个端点,通过该端点可以通知您的应用有关外部事件的信息。
  • 到达终点时(在身份验证之后,需要通知用户)。

(B)通知

  • 您可以通过在当前网页上更改DOM来直接通知用户。
  • 您可以使用Push API通知用户(但您需要确保浏览器可以定位到该用户)。
  • 所有这些通知功能都应该可以通过操作电缆来处理:(i)通过更新DOM来在电话打进时通知您,或者(ii)通过在浏览器中弹出的推送通知进行处理。

摘要::使用操作电缆。

(另外:当您拥有ActionCable时,为什么还要使用Pusher之类的外部服务?有人说可伸缩性和基础架构管理。但是我对这些问题的评论还不够。)