【问题标题】:'Web' based push notifications for internal-only application仅限内部应用程序的基于“Web”的推送通知
【发布时间】:2010-09-21 21:39:11
【问题描述】:

我已经在折腾解决方案了,但是因为在我想在实施之前检查 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 有另一种有趣的方法,但我想知道是否有人对这些方法有经验,并且可以证明每种方法的优缺点,或者可能是另一种方法。

【问题讨论】:

  • 如果所有用户在同一时间接收到它是如此重要,那么您从服务器获得的消息可能包括它应该显示的时间——这将导致网络延迟并且只要用户机器的时钟是同步的。
  • 正在使用哪个浏览器?
  • @Daniel 理想情况下至少 Firefox/Chrome/IE7

标签: javascript jquery ajax web-applications push-notification


【解决方案1】:

如果我很了解您的需求,我认为您应该看看Comet

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

Comet 方法不同于网络的原始模型,其中浏览器一次请求一个完整的网页。

【讨论】:

  • +1 - 只要你的服务器可以维持一堆打开的连接,这是一个很好的方法。您的客户端代码只是说“给我一个更新”,并且您的服务器保持连接打开,直到有更新要提供。一旦客户端收到更新,它就会发起另一个“给我更新”请求。
  • 是的,我看过了,长轮询最接近我的两个想法。我的问题更多的是做一种或另一种方式的好处以及稳定性。基本上,让 AJAX 请求一次打开 30 秒是好还是坏?
  • 看看ape-project,我觉得这个项目很适合你的需求。
  • @Cloudio Redi : stackoverflow.com/questions/38497437/… 这是我的问题似乎是同一个问题。你能看看这个并给我解决方案吗..
【解决方案2】:

使用 XMPP 服务器解决问题怎么样?

最初设计为即时通讯平台,XMPP 是一种通讯协议,使系统中的用户能够交换消息。 (还有更多内容 - 但让我们保持简单。)

让我们稍微简化一下场景。想象一下:

您是系统管理员。当系统 有问题,你需要让所有 大约 20 名员工知道 系统已关闭。

在过去,每个员工都会 问你,“系统启动了吗?”每一个 一个小时左右,你会回应 被动地。虽然这有效,但你是 过载 - 不是通过固定系统 停电,但有 20 人要求 每小时系统状态。

现在,AIM 发明了!由于每 员工可以访问 AIM,您 想,“嘿,让每个 他们中的一个人加入了一个“系统” 状态的聊天室,我就发 系统消息到房间时 倒下了(或回来了)?”这样做, 有兴趣的员工 知道系统状态将简单地加入 “系统状态”房间,并将 系统状态更新通知。

回到我们试图解决的问题...

  • System admin = "System" 想要通知网络应用用户。
  • 员工 = 希望接收通知的 Web 应用用户。
  • 系统状态聊天室 = 仍然是系统状态聊天室

当网络应用用户登录您的网络应用时,使页面自动登录到XMPP服务器,并加入系统状态聊天室。

当系统要通知用户时,编写代码登录XMPP服务器,加入聊天室,向聊天室广播消息。

通过使用 XMPP,您不必担心:

  • 设置“持久连接” - 一些开源 XMPP 服务器 eJabberd/OpenFire 内置支持 BOSH,即 XMPP 的 Comet 模型实现。
  • 消息的传递方式

但是,您将需要以下内容:

  • 查找可以帮助您登录到 XMPP 服务器的 Javascript 库。 (只是 Google。有很多。)
  • 为服务器端代码查找 XMPP 库。 (Java 和 C# 都存在 XMPP 库。但我不确定您在后台使用的是什么系统。)
  • 在 XMPP 服务器上手动配置每个用户(好像您只有 20 个人。这应该很容易 - 但是,如果组变得更大,您可能需要执行自动配置 - 这可以通过客户端 Javascript 实现XMPP 库。)

就长期 AJAX 调用而言,此实现受限于 at-most-2-connection-to-the-same-domain 问题。如果您为此 XMPP 调用使用了一个连接,那么您只有 1 个连接来执行 Web 应用程序中的其他 AJAX 调用。根据您的 web 应用程序的复杂程度,这可能是可取的,也可能是不可取的,因为如果已经进行了 2 个 AJAX 调用,则任何后续 AJAX 调用都必须等到其中一个 AJAX 管道被释放,这可能会导致“缓慢”你的应用程序。

您可以通过将所有 AJAX 调用转换为 XMPP 消息来解决此问题,并在服务器上有一个类似机器人的用户来收听这些消息,并通过发送回 HTML sn-ps/JSON 对象来响应这些消息数据。但是,这对于您想要实现的目标来说可能太多了。

啊。希望这是有道理的......或者没有。 :p

【讨论】:

  • 这是一个有趣的想法,+1,我会研究一下
  • 附图:tinypic.com/r/5b66hw/7(请原谅我的绘画技巧。)
  • @DashK 嗨,我有同样的问题,想要这种类型的解决方案。您可以在这里分享您的电子邮件 ID 或 Skype 吗?
【解决方案3】:

http://ajaxpatterns.org/HTTP_Streaming

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

【讨论】:

    【解决方案4】:

    除了上述其他两个不错的选择之外,如果您知道 Web Workers 有最新的 Chrome、Safari、FF 或 Opera 浏览器,您可以看看他们。

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

    Worker 可以多次异步接收数据。您将 onmessage 处理程序设置为在每次接收到某些内容时执行。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2016-04-02
        • 2014-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-27
        • 2013-01-06
        • 1970-01-01
        相关资源
        最近更新 更多