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

Angularjs 服务器几乎立即通知特定浏览器,angularjs,websocket,server-side,long-polling,server-sent-events,Angularjs,Websocket,Server Side,Long Polling,Server Sent Events,我正在构建一个系统,其中我有两个组,让我们称它们为用户和消费者。任何用户都可以向任何消费者发送消息。他们如何做到这一点并不重要,但所发生的是,消息被放置在服务器上的数据库中,每当发生这种情况时,应向感兴趣的特定消费者(由用户确定)发送通知 假设我们有100个消费者,那么可能会有1000个用户。每当用户向消费者发送消息时,几乎需要立即(最多5秒)通知消费者。 消费者界面是一个标准的angular网站,我正在使用tomcat来托管它,但这并不重要,可以切换到Node,必要时也可以切换到Node 现在

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

假设我们有100个消费者,那么可能会有1000个用户。每当用户向消费者发送消息时,几乎需要立即(最多5秒)通知消费者。 消费者界面是一个标准的angular网站,我正在使用tomcat来托管它,但这并不重要,可以切换到Node,必要时也可以切换到Node

现在我想知道的是通知消费者消息已经到达的最佳方式。 我考虑的是WebSocket、SSE、长轮询和普通拉取方案,每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小时登录(最好是一次会话)。
-硬件有限(负担不起那么多,这就是我试图优化的原因:)

-消费者可能仅每10分钟左右收到一条新消息,但当他们收到新消息时,他们几乎需要立即收到消息(对于延迟应小于5秒的情况,但新消息可能仅每10分钟收到一条:

  • WebSocket、sse和long poll基本相同,并且没有延迟
  • ajax轮询更糟糕
前三种方法保持专用套接字打开,但只需要连接一次(长轮询的开销是每10分钟连接一次,但这永远不会成为系统瓶颈),而ajax轮询的开销是每N秒建立一个新连接,平均延迟为N/2秒

WebSocket、see和long poll的缺点是它们保持一个套接字打开。我看不出存在安全问题,但存在潜在的性能问题,因为每个套接字都将使用服务器上的资源。但对于100个用户,我认为平均一个云服务器实例可以处理得很好

可以将SSE看作是一个简化的websockets,专为您的用例而设计,或者是一个标准化的long poll版本,它可以在您获取数据时保存重新连接。提示:SSE是您应该使用的技术,但需要注意一点。Plug:my book,data Push Apps with HTML5 SSE,更详细地回答了您的问题;-)

警告是IE仍然不支持它。我的书讨论了如何处理较旧的浏览器(这相当容易,特别是如果您提前计划的话)

在您的情况下,由于您只希望每10分钟获得一次新数据,因此您可以对所有浏览器进行长时间的民意调查:这与SSE的区别在于微观优化


关于这一主题的另一本推荐书,伊利亚·格里戈里克的高性能浏览器网络非常好。

看看Crossbar.io()。这包括发布和订阅消息路由(这是您的用例所需要的)。浏览器中有一个用于AngularJS的连接器,您的后端组件有很多语言可供选择(对于两者,请参阅)。 这在相当有限的资源上工作——我们已经管理了一个消息量,就像您在Raspberry Pi上描述的那样。长时间运行的连接也不是问题,用户收到通知之前的时间主要由网络延迟决定(因此远低于5秒)


充分披露:我为Tavendo工作,Tavendo是上述项目的维护者。不过,它完全是开源的,并且适合您的使用情况。

因此,将其归结为一条语句,你在寻找一种合适的技术来进行近乎即时的客户端到客户端的通信?是的,不是的。在我看来,你把它归结为一个聊天应用程序,而我认为我的有更多的细微差别。我想我最想寻找的是一种或另一种方法是否可以节省一些硬件使用,因为不会有那么多的消息。真棒的答案!谢谢,我会看这两本书☺ 在我的情况下,旧的浏览器不会是个问题,但是有了一个提醒就很好了☺令人惊叹的!请看一看☺