問題タブ [event-stream]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - イベント ストリームからのリアルタイム UI 同期
私は単一ページの Web アプリケーションを構築しており、サーバー側のイベント ストリームを利用してクライアントを最新の状態に保つことを計画しています。
これを考えている間に、私が考えた同時実行シナリオがあり、実装を計画しているソリューションが最適かどうかはわかりません。
- UI はイベント ストリームをサブスクライブし、時間 X からすべての新しいイベントを受信します。
- UI は、時間ごとにさまざまなエンドポイントからデータをロードします
X
。たとえば、アクティブ ユーザーの総数です。 - ある時点でユーザーが非アクティブに
X
なり、UserDeactivated イベントがストリームに追加されます。 - UI は、時間に UserDeactivated イベントを受け取り
X+1
ます。
その時点で、UI はアクティブ ユーザーの合計数をやみくもに 1 減らすことはできません。これは、既に読み込まれている合計が既に非アクティブ化を反映している可能性があるためです。
この問題に使用する予定のアプローチは、すべてのデータがロードされた日付と時刻を追跡し、イベント ストリームをサブスクライブして、イベントをapplication_loaded_time - some_offset
見逃していないことを確認することです。
次に、イベントが受信されると、すべてのサブスクライバーは、保持する責任があるデータがフェッチされた日時を確認し、イベントが発生した後にイベントが発生した場合はイベントを適用しdata_fetching_datetime
、イベントが以前に発生した場合は無視しdata_fetching_datetime
ます。
それは良い同期戦略でしょうか? アプローチに欠けているものはありますか?より良い方法はありますか?
確認しなければならないことの 1 つは、クライアントの時刻がサーバーと同期していないことです。おそらく、リクエストの処理がいつ開始されたかを指定するカスタム HTTP ヘッダーを追加する必要があります。
個々の集計については、ロードした AR のバージョンとイベントのバージョンに頼ることができますが、カウントなどの集計されたクエリについては、利用できるそのようなバージョンはありません。
注: 私はイベント ソーシングも CQRS も行っていません。予測もありません。プロジェクションを使用すると、結果とともに返すことができる各ビューのシーケンス番号 (最後に処理されたイベント) を取得できますが、ここではそうではありません。クエリが作成された時点で特定のタイプのイベントの数を数えることで、すべてのクエリのバージョン番号を計算できると思いますが、それがうまく機能するかどうかはわかりません。
javascript - テキスト/イベント ストリームをブロックする Docker コンテナー
私は Docker コンテナーとtext/event-stream
イベントのライブ ストリーミングを使用しています。ここでこの例を使用しています。このサンプルを Java EE WAR としてローカル マシンの TomCat サーバーにデプロイすると、すべて正常に動作し、サーバーがランダム イベント データを送信すると Web ページがライブで更新されます。
ただし、TomCat イメージに基づいて Docker コンテナー内にこの例をデプロイすると、次のようになります。
docker run -d --name tomcateventstream -p 8081:8080 -P -v ~/Coding/Java/webapp:/usr/local/tomcat/webapps tomcat
この後者の場合、この例は機能しません。以下の写真に示すように、イベントは明らかにキャンセルされています。
理由はありますか?このトピックについてかなり検索しました。Docker側ですべてのポートを公開しようとしましたが、役に立ちませんでした。デフォルトの Docker 設定で何か非常に小さいものがどこかに欠けていると確信しています。どんな助けでも大歓迎です。前もって感謝します!
php - PHP スクリプトから PHP イベント ストリームへのデータの受け渡し
そのため、サードパーティから投稿された新しいデータをランダムに受け取る PHP ファイルがあります。簡単にするために、それを呼び出してget_data.php
、次のように見えるとしましょう。
そして、stream.php
HTML5 Server-Sent Eventsを使用してデータを (JS) クライアントにストリーミングする別のスクリプト があります。
各スクリプト自体は正常に機能しています。ただし、$data
最初のスクリプトから 2 番目のスクリプトに渡す必要があります。
変数をDBまたは一時ファイルに保存することでこれを達成できることはわかっていますが、理想的にはPHPだけでこれを行うことができます。
あるファイルを別のファイルに含めることは、ストリーム ヘッダーがサードパーティによるデータの投稿で混乱する可能性が高いため、適切なオプションとは思えません。後者はクラッシュします。
注$_SESSION
- これは、Web ページ上の PHP スクリプト間でデータを渡す方法を尋ねる他の質問と重複していません。イベント ストリームにアクセスしているユーザーとは異なるサードパーティによってデータが投稿されているため、変数を使用できないように見えるためです。
javascript - 特定の非同期Angularタスクを無視するように分度器に指示する方法は?
イベント ストリーミングを使用する私の angularJS アプリケーションは、http イベント スチーム リクエストとリッスン サーバー イベントを開いたままにします。したがって、私の問題は、分度器が angularJS アプリケーションのテストを開始するときに、ignoreSynchronization=false を使用しているため、イベントストリーム要求が完了するまで待機し続けるため、イベントストリーム http 要求が終了しないため、分度器はタイムアウトになるまで待機します。そのため、分度器にそのようなイベント ストリームの $http タスクを無視して、アプリケーションのテストを続行するように教えたいと思います。これらのイベントストリームはアプリケーション全体に実装されているため、イベントストリームリクエストがあるたびに分度器がタイムアウトします。
タイムアウト時に次のエラーが発生します: Failed: Timed out waiting for asynchronous Angular tasks to finish 300 seconds. これは、現在のページが Angular アプリケーションではないことが原因である可能性があります。詳細については、FAQ を参照してください: https://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting-for-angular。次のタスクが保留されていました: - $http: https://example.com/custom/xxx/sse
誰でもこの問題を取り除くのを手伝ってもらえますか?