我制作了一个小型 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
...
客户端似乎仍然能够检索输入数据,因此最终结果不会受到此影响。我的问题是,这是不断断开/重新连接的正常行为吗?无论数据流式传输的频率如何,客户端不应该保持连接打开吗?