服务器发送事件有哪些好的用例

时间:2018-04-28 13:06:47

标签: javascript server-sent-events

我发现SSE(服务器发送事件)的时间很晚,但我似乎无法弄清楚它的一些用例,因此它比使用setInterval()ajax更有效。

我想,如果我们必须每秒多次更新数据,那么创建一个连接会产生更少的开销。但是,除了这种情况,何时真的会选择SSE?

我在想这个场景:

  

数据库中添加了来自网站的新用户评论

     

服务器定期查询DB以查找更改。如果找到新评论,请通过SSE向客户发送通知

此外,在进行简单的“实时”网站更改后(当有人发表评论时,通知网站上的所有人),我会想到这个SSE问题。是否有其他方法可以在不定期查询数据库的情况下执行此操作?

1 个答案:

答案 0 :(得分:4)

如今,Web技术被用于推动所有类型的应用程序,包括那些需要从服务器获取持续更新的应用程序。

例如,假设在您的网页中显示图表,其中显示实时数据。只要有新数据显示,您的页面就必须刷新图表。

服务器发送事件之前,从服务器获取新数据的唯一方法是每次都执行新请求。

轮询

正如您在问题中所指出的,查找更新的一种方法是使用setInterval()ajax请求。使用这种技术,无论是否有新数据,我们的客户端每X秒执行一次请求。此技术称为投票

活动

相反,服务器发送事件是异步。当有新数据可用时,服务器本身将通知客户端。

在您的示例的场景中,您将以添加新注释后立即发送事件的方式实现SSE,而不是通过轮询数据库。

比较

现在的问题可能是什么时候建议使用轮询与SSE。除了兼容性问题(并非所有浏览器都支持SSE ,尽管有一些基本上通过轮询模拟SSE的polyfill),您应该关注更新的频率和规律性

如果您不确定更新的频率(新数据应该可用的频率),SSE可能是解决方案,因为它们可以避免轮询执行的所有额外请求。

然而,一般来说SSE产生的开销少于轮询是错误的。这是因为 SSE需要开放的TCP 连接才能工作。这实质上意味着服务器上的一些资源(例如工作者和网络套接字)被分配给一个客户端,直到连接结束。通过轮询,在请求被应答后,可以重置连接。

因此,如果连接客户端的平均数量很高,我会建议使用SSE,因为这可能会在服务器上产生一些开销。

一般情况下,我建议仅在您的应用程序需要实时更新时才使用SSE。作为现实生活中的例子,我过去开发了一个数据采集软件,并且必须为它提供一个Web界面。在这种情况下,每次收集新数据点时都会更新许多图表。这对于SSE来说是一个 good fit ,因为连接的客户端数量很少(基本上只有一个),用户界面应该实时更新,并且服务器没有充满请求,因为它会与民意调查。

许多应用程序不需要实时更新,因此以一些延迟显示更新是完全可以接受的。在这种情况下,长时间轮询可能是可行的。