【问题标题】:Server Sent Events (SSE) on Sinatra and Thin disconnects and reconnects repeatedlySinatra 和 Thin 上的服务器发送事件 (SSE) 反复断开连接并重新连接
【发布时间】:2016-03-13 13:39:16
【问题描述】:

我制作了一个小型 Sinatra 应用程序来或多或少地实时跟踪我们公司的一些数据。

设置很像dashing.io/:

  • Rufus Scheduler 作业用于在特定时间间隔内查询数据库。
  • 查询结果返回到 SSE 连接流。
  • 客户端订阅流(在 erb 视图中的 javascript 中定义)并以不同的方式显示数据,例如使用 highcharts。

这一切都很好,但是,我注意到如果我让作业运行的频率低于每分钟,客户端将一直断开连接并重新连接。让我解释一下:

订阅 javascript 代码如下所示:

<script type="text/javascript">

var source       = new EventSource('/stream/channels-energy');

source.onopen    = function(event) { 
    console.log("Connection opened", event) 
}

source.onerror   = function(event) {
    console.log("Connection error", event) 
}

source.onmessage = function(event) { 
    var data_energy = JSON.parse(event.data);
    console.log("Time: " + event.lastEventId + "Length: " + Object.keys(data_energy).length);
}

</script>

如果我让作业每 30 秒运行一次,一切都会完美运行。在 Chrome(或 Firefox)的控制台中查看以下内容:

Connection opened Event
Time: 2016-03-13T13:33:39.625ZLength: 2854
Time: 2016-03-13T13:34:09.656ZLength: 2854
Time: 2016-03-13T13:34:39.698ZLength: 2854
Time: 2016-03-13T13:35:09.395ZLength: 2854
Time: 2016-03-13T13:35:39.493ZLength: 2854
Time: 2016-03-13T13:36:09.592ZLength: 2854
Time: 2016-03-13T13:36:39.674ZLength: 2854

但是,如果我将作业间隔调整为 3 分钟,控制台会显示客户端不断断开连接:

Connection opened Event
Time: 2016-03-13T13:00:16.018ZLength: 2909
Connection error Event
Connection opened Event
Connection error Event
Connection opened Event
Connection error Event
Connection opened Event
Time: 2016-03-13T13:03:15.912ZLength: 2891
Connection error Event
Connection opened Event
Connection error Event
Connection opened Event
Connection error Event
Connection opened Event
Time: 2016-03-13T13:06:15.857ZLength: 2891
Connection error Event
Connection opened Event
Connection error Event
Connection opened Event
Connection error Event
Connection opened Event
...

客户端似乎仍然能够检索输入数据,因此最终结果不会因此受到影响。我的问题是,这是不断断开/重新连接的正常行为吗?客户端不应该只保持连接打开,而不管数据传输的频率如何?

【问题讨论】:

  • 虽然 server-sent-events 也是 SSE 的缩写,但 SSE 标签是关于不同的 SSE。

标签: server-sent-events eventsource


【解决方案1】:

是的,客户端(浏览器)将保持套接字打开,而不管发送的数据如何。

这可能是因为您的后端服务器在安静时关闭了套接字。但是,也可能是您的本地 ISP 关闭了套接字。您可以通过从另一个物理位置对其进行测试来诊断它。

然而,一个很好的解决方案,很好地涵盖了任何一个原因,是添加一个保持活动(又名心跳)信号。这是从服务器发送到客户端的,比如每 N 秒,例如N=50。

对于网络级别的断开连接,发送 SSE 评论就足够了。但我喜欢做的是发送适当的信息。这允许客户端跟踪它上次从服务器听到的时间,并在它怀疑出现问题时启动自己的断开连接并重新连接,即如果在 N+10 秒内没有数据到达。 (这种情况很少见,但有时确实会发生。)

【讨论】:

  • 太好了,感谢您的回答,很高兴知道这是预期的行为以及如何去做。我现在找到了几个关于 SSE 和心跳信号的资源,所以我将在这些天实现一些简单的东西。
猜你喜欢
  • 2012-07-15
  • 1970-01-01
  • 2013-01-17
  • 2013-06-21
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
相关资源
最近更新 更多