基于Web的推送通知用于内部应用程序

4
我已经在思考一个解决方案,但由于我以前没有做过这样的事情,所以在实施之前我想检查一下SO的想法。基本上,我需要修改一个现有的基于Web的应用程序,该应用程序有大约20个用户,以添加推送通知为目的。重要的是,用户同时收到通知(PC-A不应在PC-B之前20秒收到警报)。目前,系统依靠AJAX请求工作,每20秒向服务器发送请求并请求任何更新,并重新构建数据表中的所有数据(即使数据没有更改)。这似乎非常笨拙,因此我想出了两种方法。
1.不要从服务器-客户端中断连接。我正在考虑的这个想法涉及保持服务器和客户端之间的连接始终处于活动状态。带宽对于任何解决方案来说都不是真正的问题,因为这是仅供约20人使用的内部网络。通过这种解决方案,服务器可以在更新时向客户端推送Javascript,并相应地修改数据表。同样,每个连接的PC接收更新尽可能接近的时间非常重要。主要缺点是我的经验,我以前从未做过这件事,所以我不确定它是否能够很好地工作或者它是否通常是个坏主意。
2.继续使用AJAX请求,但仅在间隔中响应。我想到的第二种解决方案是允许客户端像往常一样进行AJAX请求(当前每20秒),但是使服务器只在30秒间隔内响应(例如2:00:00和2:00:30,无论这段时间内收到多少个AJAX请求)。这将需要调整AJAX请求的超时时间以防止请求超时,但在理论上听起来还不错,至少对我来说是这样。
这仅适用于内部网络,因此带宽不是主要问题,更重要的是尽可能接近地接收通知。我可以接受其他想法,这些只是我目前想到的两种方法。
编辑:主要寻找每种方法的优缺点。DashK有另一个有趣的方法,但我想知道是否有人有这些方法的经验,并且可以证明每种方法的优点和缺点,或者可能是另一种方法。

如果所有用户都需要在完全相同的时间收到它,那么您从服务器获取的消息可以包括应该显示的时间 - 只要用户机器的时钟已经同步,这将考虑网络延迟等因素。 - Radomir Dopieralski
使用哪个浏览器? - Cristian Sanchez
@Daniel 最好支持Firefox/Chrome/IE7。 - Robert
5个回答

12

如果我理解你的需求正确的话,我认为你应该看一下Comet

Comet是一种Web应用程序模型,其中长时间保持的HTTP请求允许Web服务器向浏览器推送数据,而无需浏览器明确请求。 Comet是一个总称,包括多种实现此交互的技术。 所有这些方法都依赖于默认包含在浏览器中的功能,例如JavaScript,而不是非默认插件。

Comet方法与Web的最初模型有所不同,后者是指浏览器一次请求完整的Web页面。


1
只要您的服务器可以维护一堆打开的连接,这就是一个不错的选择。您的客户端代码只需说“给我更新”,您的服务器会保持连接直到有更新可用时才关闭。一旦客户端接收到更新,它就会发起另一个“给我更新”的请求。 - timdev
是的,我看过了,长轮询是最接近我的两个想法的。我的问题更多的是关于采用哪种方式的好处以及稳定性。基本上,每次保持 AJAX 请求开放 30 秒钟是一个好主意还是坏主意? - Robert
看看ape-project,我认为这个项目非常适合你的需求。 - Chris
@Cloudio Redi:http://stackoverflow.com/questions/38497437/email-push-notification-inb-web-based-application-when-using-imap 这里是我的问题,看起来和这个问题很相似。你能否请看一下并给我解决方案? - Naresh

8
如何使用XMPP服务器解决问题呢?
XMPP最初被设计为即时通讯平台,是一种使系统用户能够交换消息的通信协议。(这里还有更多 - 但让我们保持简单。)
让我们把情境简化一点。想象一下以下情况:
您是系统管理员。当系统出现问题时,您需要让所有员工(约20人)知道系统已经宕机。
在过去,每个员工都会每小时左右问你:“系统正常吗?”你会被动地回答。虽然这样可以解决问题,但你会不堪重负——不是因为修复系统故障,而是因为20人每小时都要询问系统状态。
现在,AIM诞生了!由于每个员工都可以访问AIM,您想:“嘿,让每个人都加入一个‘系统状态’聊天室,我只需在系统宕机(或恢复)时向该聊天室发送消息?”这样做,对于想要了解系统状态的员工,他们将简单地加入“系统状态”房间,并将收到系统状态更新的通知。
回到我们试图解决的问题...
系统管理员 = “System”,希望通知Web应用程序用户。
员工 = 希望接收通知的Web应用程序用户。
系统状态聊天室 = 仍然是系统状态聊天室
当Web应用程序用户登录到您的Web应用程序时,使页面自动将他们登录到XMPP服务器,并加入系统状态聊天室。
当系统想要通知用户时,编写代码以登录到XMPP服务器,加入聊天室并向房间广播消息。
使用XMPP,您无需担心以下问题:
设置“持久连接” - 一些开源XMPP服务器,如eJabberd/OpenFire,具有对BOSH的内置支持,这是XMPP实现Comet模型的方法之一。
消息的传递方式
但是,您需要以下内容:
找到一个JavaScript库,可以帮助您登录到XMPP服务器。(只需搜索即可。有很多。)
找到一个XMPP库,用于服务器端代码。(XMPP库存在于Java和C#中。但是我不确定你在幕后使用的是什么系统。)
手动在XMPP服务器上为每个用户进行预配(似乎您只有20人。那应该很容易 - 但是,如果组变得更大,您可能需要执行自动预配 - 这可以通过客户端JavaScript XMPP库实现。)
就长时间的AJAX调用而言,这个实现受到最多只能连接同一域名2次的限制。如果您已经使用了一个连接来进行这个XMPP调用,那么您只剩下1个连接可用于在Web应用程序中执行其他AJAX调用。根据您的Web应用程序的复杂程度,这可能是可取的,也可能不是,因为如果已经进行了2个AJAX调用,则任何后续的AJAX调用都必须等待其中一个AJAX管道空闲,这可能会导致您的应用程序变慢。
您可以通过将所有AJAX调用转换为XMPP消息,并在服务器上拥有类似机器人的用户来监听这些消息,并通过发送包含数据的HTML片段/JSON对象来回应它。然而,这可能对您想要实现的内容来说过于繁琐。
啊哈。希望这讲得通……或者不通:p

这是一个有趣的想法,+1,我会研究一下。 - Robert
以下是与文本配套的图表:http://tinypic.com/r/5b66hw/7(请原谅我的绘画技巧。) - DashK
@DashK 你好,我也遇到了同样的问题,想要这种类型的解决方案。你能在这里分享你的电子邮件或Skype吗? - Naresh

1

查看http://ajaxpatterns.org/HTTP_Streaming

它允许您在服务器需要时从服务器推送数据。不仅仅是在查询之后。 您可以在不对当前应用程序进行大量更改的情况下使用此技术,并通过服务器上的时间同步输出。


0

除了上面提到的两个好选择之外,如果您知道他们使用的是最新版本的Chrome、Safari、FF或Opera浏览器,您还可以考虑Web Workers。

Worker的额外好处是它不在与页面的其余部分相同的线程中运行,因此性能会更好。缺点是出于安全目的,您只能在两个脚本之间发送字符串数据,并且worker没有窗口或文档上下文。但是,JSON可以表示为字符串,因此数据实际上没有限制。

Workers可以多次异步接收数据。您可以设置onmessage处理程序以在每次接收到数据时执行操作。


0
如果您可以要求每个用户使用特定的浏览器(最新版Safari或Chrome),那么您也可以尝试使用WebSockets。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接