会社のデータの一部を多かれ少なかれリアルタイムで追跡するための小さな Sinatra アプリケーションを作成しました。
セットアップは、dashing.io / とほとんど同じです。
- Rufus Scheduler ジョブは、特定の間隔でデータベースにクエリを実行するために使用されます。
- クエリ結果は SSE 接続ストリームに返されます。
- クライアントはストリーム (erb ビューの javascript で定義) にサブスクライブし、ハイチャートなどを使用してさまざまな方法でデータを表示します。
これはすべてうまく機能しますが、ジョブを毎分よりも少ない頻度で実行すると、クライアントが常に切断されて再接続されることに気付きました。説明させてください:
サブスクリプションの 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
...
クライアントはまだ入力時にデータを取得できるように見えるので、最終結果はこれに悩まされません。私の質問は、この絶え間ない切断/再接続は通常の動作ですか? データがストリーミングされる頻度に関係なく、クライアントは接続を開いたままにしておくべきではありませんか?