私は、WebSocketを介して「リアルタイム」でデータを配信および表示する方法の学習に取り組んできました。このコンテキストでは、リアルタイムとは、データが.03〜1秒ごとにセンサー(画像処理を備えたカメラ)から読み取られていることを意味します。各データポイントは、doubleとしてエンコードされた時間と値(t、v)で構成されます(この場合、時間は常に整数ですが、そうなるとは想定していません)。
サーバー側では、Alchemy Websocketの実装(C#)を使用しています。これは、自分の目的のために理解/変更するのが非常に簡単であることがわかったためです。
ここ とここにあるWebSocketの例と、Alchemyに含まれている例を活用しています。
HighChartsを使用してデータを「リアルタイム」で表示していますが、デバッグ目的でdivに出力することもできます(互いに干渉しないように独立した例です)。
その多くはすでにかなりうまく機能していますが、データの送信が速すぎると明らかに問題が発生します(明確にするために、1秒または2秒ごとにポイントに関するデータを送信すると、グラフが表示されなくなります。問題-錬金術サーバーを「送信」関数と呼ぶほど、問題はより顕著になります)。
データが間違った順序で入力されているように見え、興味深い「マングル」効果が発生します。
サーバー側のバッファーに含まれるパケットの順序を調べ始めます(サーバーは、新しいユーザーが接続し、すでに実行されているときに、特定の数の「履歴」ポイントを送信するように指示されます。これにより、次のような顕著な問題が発生します。上に示したもの)とクライアント側はタイムスタンプを見て注文を受け取ります。
このエラーは、ページをリロードするたびに異なる「マングル」データセットが生成されるという点で一貫性がありません。これにより、WebSocketを介した通信に責任があるか、錬金術サーバーに関係していることが疑われます。
必要に応じて完全なコードを添付しますが、今はかなり面倒なので、トラブルシューティングのアイデアをもっと探しています。
これは、TCP上に構築されているため、Webソケットでは予期されない動作であることがわかりました。
見るべきものについての提案/アイデアはありますか?
ありがとう!
編集:ページを更新するたびに、故障しているデータポイントの数を確認するために別のテストを実行しました。番号は次のとおりです。
1 2 3 25 6 5 10 11 96 2 8
非常に一貫性がありません(0になることはありません)。確かに面白い!
この結果は、グラフ作成コンポーネントを除外し、データを格納するためにWebSocketと配列のみを使用して取得されました。
アップデート:
入ってくる順序の分析を開始することにしましたが、同じデータセットを使用して順序が正しくないポイントをランダムに受信しているように見えます。順不同のパケットを考慮に入れる「挿入」機能を実装しました。結果(および少しテーマの変更)はかなり良さそうです!
未解決の質問が残っています:WebSocketが情報を順不同で配信できると予想されますか?または、サーバー側(またはAlchemy)での実装に問題がありますか。時間があるときにさらに調査します。
解決!
私はそれを考え出した!多くのテストを行った後、Connectionオブジェクト(新しいデータのデータセットを監視し、接続の構成方法に応じて適切に送信する)がTimerオブジェクトを使用して実装されていることに気付きました。これは私が例から取ったものでした(通常、私はほとんどの非同期でThreadオブジェクトを使用します)。
Timerオブジェクトの速度が上がると、Tick関数への以前の呼び出しとは非同期に実行を開始します。これは、非常にまれに、そのTick関数への1つの呼び出しが別の呼び出しよりも少し速く発生することを意味します(Alchemy Send関数のレイテンシーのため)。これにより、マイナーな故障の問題が発生します。
通信ループの実装をTimerオブジェクトからThreadオブジェクトに切り替えて同期を強制すると、順序が正しくないパケットがなくなりました。