我已经在解决一个问题,但是在我想要检查实现之前的想法之前,我还没有做过这样的事情。
基本上我需要修改现有的基于Web的应用程序,该应用程序有大约20个用户来添加推送通知。用户同时获取通知非常重要(PC-A不应在PC-B之前20秒收到警报)。目前,系统处理AJAX请求,每隔20秒发送到服务器并请求任何更新并每次完全重建数据表(即使数据未更改)。这看起来真的很草率,所以我提出了两种方法。
不要破坏与服务器 - 客户端的连接。这个想法我正在徘徊涉及保持服务器和客户端之间的连接始终处于活动状态。带宽并不是任何解决方案的真正问题,因为内部网络只有大约20人。使用此解决方案,只要有更新,服务器就可以将Javascript推送到客户端,并相应地修改数据表。再一次,非常重要的是每台连接的PC都尽可能接近更新的时间。这主要的缺点是我的经验,我以前从未这样做过,所以我不确定它的效果如何,或者它通常是一个坏主意。
继续AJAX请求,但只是间隔响应。我想到的第二个解决方案是允许客户端按照惯例发出AJAX请求(目前每20个但是服务器只能以30秒的间隔响应(例如2:00:00和2:00:30,无论它在这段时间内收到多少AJAX请求)。这需要调整AJAX请求的超时以防止请求超时,但理论上听起来没问题,至少对我而言。
这仅适用于内部网络,因此带宽不是主要关注点,因此通知尽可能接近彼此接收。我对其他想法持开放态度,这些只是我到目前为止所想到的两个想法。
主要寻找每种方法的利弊。 DashK有另一个有趣的方法,但我想知道是否有人有任何这些方法的经验,并可以证明每种方法的优点和缺点,或可能是另一种方法。
答案 0 :(得分:12)
如果我很了解您的需求,我认为您应该查看Comet
Comet是一种Web应用程序模型,其中长时间持有的HTTP请求允许Web服务器将数据推送到浏览器,而浏览器不会明确请求它。 Comet是一个总称,涵盖了实现这种互动的多种技术。所有这些方法都依赖于浏览器中默认包含的功能,例如JavaScript,而不是非默认插件。
Comet方法不同于网络的原始模型,浏览器一次请求完整的网页。
答案 1 :(得分:8)
如何使用XMPP服务器解决问题?
XMPP最初设计为Instant Messaging平台,是一种消息传递协议,可使系统中的用户交换消息。 (还有更多 - 但让我们保持简单。)
让我们稍微简化一下场景。想象一下:
您是系统管理员。当系统 有一个问题,你需要让所有的 员工,其中约有20人知道这一点 系统停机了。
在过去,每个员工都会 问你,“系统有问题吗?”一切 一个小时左右,你会回答 被动。虽然这有效,但你是 超载 - 不是通过固定系统 停电,但由20人要求 每小时系统状态。
现在,AIM被发明了!每一个 员工可以访问AIM,您 想,“嘿,怎么样拥有每一个 其中一个加入'系统 状态'聊天室,我只是发送 系统时向房间发送消息 是下来(还是回来)?“通过这样做, 对此感兴趣的员工 了解系统状态只会加入 '系统状态'会议室,将会是 已通知系统状态更新。
回到我们试图解决的问题......
- 系统管理员=“系统”,希望通知网络应用用户。
- 员工=希望接收通知的网络应用用户。
- 系统状态聊天室=仍然是系统状态聊天室
当网络应用用户登录您的网络应用时,请让网页自动将其记录到XMPP服务器上,然后加入系统状态聊天室。
当系统想要通知用户时,编写代码以登录XMPP服务器,加入聊天室,并向房间广播消息。
通过使用XMPP,您不必担心:
但您需要以下内容:
就持久的AJAX调用而言,此实现受限于最多2个连接到同一域的问题。如果您为此XMPP调用使用了一个连接,则只有1个连接可以在Web应用程序中执行其他AJAX调用。根据您的webapp的复杂程度,这可能是也可能不合适,因为如果已经进行了2次AJAX调用,任何后续的AJAX调用都必须等到其中一个AJAX管道被释放,这可能导致“缓慢”你的应用。
您可以通过将所有AJAX调用转换为XMPP消息来解决此问题,并让服务器上有类似机器人的用户来侦听这些消息,并通过发送回数据包的HTML片段/ JSON对象来响应它。然而,这可能对你想要达到的目标而言太过分了。
稀释。希望这有意义......或不是。 :P
答案 2 :(得分:1)
请参阅http://ajaxpatterns.org/HTTP_Streaming
它允许您在服务器需要时从服务器推送数据。不仅仅是在查询之后。 您可以使用此技术,而无需对当前应用程序进行大的更改,并在服务器上按时间同步输出。
答案 3 :(得分:0)
除了上面的其他两个很棒的选项之外,如果您知道他们拥有最新的Chrome浏览器,Safari,FF或Opera浏览器,您可以查看Web Workers。
工作者的另一个好处是不在与页面其余部分相同的线程中运行,因此性能会更好。缺点是,出于安全考虑,您只能在两个脚本之间发送字符串数据,而工作者没有窗口或文档上下文。但是,JSON可以表示为字符串,因此数据实际上没有限制。
工作人员可以多次和异步地接收数据。您设置onmessage处理程序以在每次收到某些内容时执行操作。
答案 4 :(得分:0)
如果您可以要求每个用户使用特定的浏览器(最新的Safari或Chrome),您也可以尝试使用WebSockets。