redis(高速メモリ内データストレージ)のセットをリアルタイムで更新するサービスがあります。 また、このredisインスタンスに接続されているアプリがあります。設定された内容をすべてのクライアントに表示することです。クライアントの設定によっては、セットの一部の要素が送信されないことに注意してください。クライアントサービスアーキテクチャ:クライアントをメモリ内のデータ構造と同期させておく
私はすべてのアップデートでセット内容全体を送信したくありません。 diffだけを送ることが可能でなければならず、私はどのアプローチを使うかを選択しています。 レールの
実装 - >クライアント接続:
- はを反応 - リアルタイムの状態を維持するための良いフィットのような音を反応させます。リアルタイムで小道具を更新すると、htmlは無料で最新の状態に保たれます。
- actioncable - レールアプリにウェブソケットを統合する最新のコンポーネントがあります。
サービス - > Redisのセット - >レール:
- 私は機能パブ/サブRedisのを使用してのRedisへの書き込みサービスが変更/更新された要素を送る設定作ることができます/削除し、セット自体を使って新しいクライアントにデータを送信するだけで、既存のものはpub/subを介して同期された状態に保たれます。
- サービスがセット
- サービスの要素を更新しようとしているRedisの
- にセットに要素を追加したサービスは、に要素を送信しますので、クライアントを更新するには、以下が行われますパブ/サブキューに登録されているパブ/サブキュー
- レールのアプリは、要素
- レールアプリを受け取り、更新を取得する必要があり、どれを参照するクライアントのリストをフィルタリング(通常、それはそれらのほとんどです)
- rails appが新しいアイテムをブロードキャストし、cliエントは、それが
その上で、私も例を削除/変更を実装する必要がありますレンダリング。 このアプローチはあまりにも複雑で低レベルなようです。物事は簡単にはずれてしまい、メモリに何度も複製されてしまいます。
- 代わりのパブ/サブ私はすべての変更が発生した場合は、レールのアプリの読み込みRedisのは、繰り返しの内容を設定して計算することができます。 redisがセットをメモリに保存するので、安価でなければなりません。 rails appが変更を検出すると、それはクライアントにブロードキャストされます。それでも、タイムアウトに基づいてメモリ内の何かが変更されたかどうかを確認する必要があるのは間違っています。
追加情報:多すぎるクライアントはありません。おそらく千人でしょう。このセットは1秒に1回、時にはそれ以上、時にはそれほど更新されません。
クライアントを状態と同期させておくための最良の方法は何ですか?反応の使用は正当化されていますか?そのような "diff"パターンのネイティブ反応実装がありますか?
フラックスは変更を同期するだけです_または、自分自身で行うべきですか?(例えば、インデックス1の要素を更新しました - インデックス4を削除した要素 - 新しい要素10)? –
通常、Fluxで処理する最良の方法は、ストア内のデータをオブジェクト'id'とあなたのモデルに相当するキーと値のペアを使い、' Object.assign'やjqueryの '$ .extend'を使って新しい項目をオブジェクトにマージするか、単に' delete state [2] 'を使って項目を削除します(この場合、id = 2のもの)。 – gravityplanx