服务器几乎立即通知特定浏览器

时间:2015-07-11 16:20:54

标签: angularjs websocket server-side long-polling server-sent-events

我正在构建一个我有2个组的系统,让我们称之为用户和消费者。任何用户都可以向任何消费者发送消息。他们如何做到这一点并不重要,但发生的事情是将消息放在服务器上的数据库中,并且每当发生这种情况时,应将通知发送给感兴趣的特定消费者(由用户确定)。

所以说我们有100个消费者,那么可能会有1000个用户。每当用户向他/她发送消息时,消费者需要几乎立即(最多5秒)被通知。 消费者' interface是一个标准的角度网站,我使用tomcat来托管它,但这并不重要,如果需要,可以切换到Node或同样。

现在我想弄清楚的是通知消费者消息已经到达的最佳方式。 我所考虑的是websockets,SSE,Long-polling和普通拉动方案,每5秒进行一次ajaxrequest。我认为所有的选择都是可行的,但还有一些挑战:

- consumers are logged in (ideally in one session) around 18 hours a day.
- Hardware is limited (Can't afford that much that's why I'm trying to optimize :) )
- consumers probably only get new message(s) every 10 minutes or so but when they do they NEED to get the message(s) almost instantly (<5 seconds)

据我所知,这提出了一个安全问题(我估计每天18小时登录同一个会话可能会有问题吗?

关于硬件,我唯一认为每个消费者每隔5秒向服务器发送一个ajax请求很快就会变得(不必要地)昂贵,如上所示的100个消费者。

我不知道让websockets运行这么长时间有多昂贵,如果做出长轮询请求可能会更便宜,直到响应进来然后再制作一个新的?

最后,我并不了解SSE是如何运作的。从服务器到客户端的连接是否打开,如果是这样,SSE和长轮询之间的区别是什么?

任何输入,想法,建议? 此外,关于客户端 - 服务器交互在硬件容量/使用方面的文章,博客,书籍等的任何链接都将非常受欢迎,因为我想自己阅读,但很难找到关于这些事情的良好硬件信息。

如果需要任何详细说明,请问:)

2 个答案:

答案 0 :(得分:1)

对于延迟应小于5秒的情况,但新消息可能每10分钟一次:

  • websockets,sse和long-poll基本相同,且延迟为零
  • ajax民意调查更糟糕。

前三个保持专用套接字打开,但只有连接一次的开销(长轮询有每10分钟连接的开销,但这永远不会是系统瓶颈),而ajax轮询有开销每N秒建立一个新连接,平均延迟时间为N / 2秒。

websockets,see和long-poll的缺点是它们保持套接字打开。我没有看到安全问题,但是您确实存在潜在的性能问题,因为每个套接字都将使用服务器上的资源。但是有100个用户,我认为平均云服务器实例可以应付得很好。

将SSE视为完全针对您的用例设计的简化websockets,或者作为长轮询的标准化版本,在获取数据时也可以保存重新连接。提示:SSE是你应该采用的技术,但有一点需要注意。插件:我的书,带有HTML5 SSE的数据推送应用程序,更详细地回答您的问题; - )

需要注意的是IE 仍然不支持它。我的书讨论了处理旧版浏览器(这很容易,特别是如果你事先计划好的话)。

在您的情况下,由于您只需要每10分钟获得一次新数据,您可以为所有浏览器进行长时间轮询:它与SSE之间的差异是微优化。

作为关于这一主题的另一本书推荐,Ilya Grigorik的高性能浏览器网络非常好。

答案 1 :(得分:1)

看看Crossbar.io(http://crossbar.io)。这包括Publish&amp;订阅邮件路由(这是您的用例所需)。浏览器中有一个AngularJS连接器,您可以为后端组件选择多种语言(请参阅http://wamp.ws/implementations)。 这适用于相当有限的资源 - 我们已经管理了一个消息传递卷,就像你在Raspberry Pi上描述的那样。长时间运行连接同样不是问题,通知消费者的时间主要取决于网络延迟(因此低于5秒)。

完全披露:我为Tavendo工作,Tavendo是上述项目的维护者。它虽然都是开源的,但它适合您的使用案例。