4

2 つのプロセス (クライアントとサーバーなど) 間でネットワーク経由でリアルタイムにデータを同期するにはどうすればよいでしょうか?

サーバー上に構築されたさまざまなドキュメント/データセットがあり、クライアントによってダウンロードおよび表示されます。ダウンロードが完了すると、ドキュメントは最新の状態を保つために継続的に更新されます。

これは単純で一般的な概念のようですが、このレベルの抽象化を提供するツールは見つかりません。何を探しているのかさえわかりません。しっかりとしたツールをサポートする同様のコンセプトがあるのではないでしょうか? おそらく、まとめなければならないさまざまなツールのチェーンがあるのではないでしょうか? これまでに私が検討したことは次のとおりです。

  • すべての変更を 1 回のホップ (0.5 RTT) で伝播する必要があり、これにより、ポーリング (通常は 10 RTT を超える) とキャッシュ無効化手法 (1.5 RTT) が除外されます。
  • データが多すぎて変更が多すぎるため、データ複製と単純な通知ブロードキャストはオプションではありません。クライアントは、特定のドキュメントを選択してダウンロードし、変更を監視できる必要があります。
  • 私は現在、仕事をするメッセージパッシングパターンを使用していますが、絶望的に非生産的です. あまりにも低いレベルの抽象化で機能します。これは手間がかかり、エラーが発生しやすく、アプリケーションの複雑さが増してもうまく拡張できません。
  • HTTP やその他の RPC に似た手法は、最初のフェッチには適していますが、後続の同期にはポーリングが必要になります。リバース リクエスト (データ ソースからデータ コンシューマーへ) を実行する場合、変更通知は可能ですが、メッセージ パッシングよりもさらに複雑です。
  • RPC (初期フェッチ用) とメッセージ パッシング (更新用) を組み合わせることは、2 つのパラダイム間のインピーダンスの不一致だけでなく、2 つの並列接続を介した通信の調整に伴う複雑さのため、悪夢であることが判明しました。統一されたものが必要です。
  • WebSocket と Comet は、変更通知を実装するための一般的な方法ですが、生産性を高めるには追加のライブラリが必要であり、自分のアプリケーションに適したライブラリを知りません。
  • メッセージ キューは、基本的なメッセージ パッシング パターンを維持しながら、ネットワーク上に仲介者を置くだけです。カスタム メッセージ フィルター/ルーターを使用すると、ライブ ドキュメントの概念に近づくことができますが、MQ の上にカスタム ミドルウェア レイヤーを実装しているように感じます。

追加の要件が山ほどあります (両端でのネイティブの監視可能なデータ構造 API、インクリメンタル アップデート、カスタム メッセージ フィルター、カスタム接続ルーティング、クロスプラットフォーム、堅牢性とスケーラビリティ)。しかし、それらの要件を検討する前に、少なくとも私が必要とすることをしようとします。私は標準的な理由で社内フレームワークを避けようとしています - コスト、市場投入までの時間、長期的なメンテナンス、そして開発者を満足させ続けるためです。

4

1 に答える 1

0

現時点での私の結論は、そのようなライブ ドキュメント同期フレームワークは存在しないということです。社内ソリューションが進むべき道ですが、多くの既存のコンポーネントをソリューションの一部として使用できます。

WebSocket やその他のメッセージ パッシング プラットフォームの上にライブ ドキュメント ロジックをレイヤー化するのは非常に簡単です。サーバーは、接続が開始されたときと変更のたびに、ドキュメントを個別のメッセージとして送信するだけです。ネットワーク障害に対処するには、自動再接続と接続監視を追加する必要があります。

両端でのシリアル化は、多くの既存のライブラリが対象としている別の問題です。サーバー側のデータ構造 (プッシュを開始するために必要) の変更を検出することは、独自のパターンとツールのセットを持つ別の問題です。増分更新やその他の多くの問題は、仲介者が接続を傍受することで解決できます。

このアプローチは、大規模な社内グルー コードを犠牲にして、現在のテクノロジで動作します。標準コンポーネントが利用可能になったときに、それを段階的に置き換えることができます。

WebSocket には、リソース URI、ルーティング、およびその他のいくつかの優れた機能が既に含まれています。有用な仲介者とライブラリーが将来出現する可能性があります。text/event-stream MIME タイプの HTTP は、WebSocket の将来の代替案となる可能性があります。HTTP の利点は、既存のツールをほとんど変更せずに再利用できることです。

豊富なツールのサポートにもかかわらず、RPC プルと別のプッシュ チャネルを組み合わせるパターンは完全に捨てました。すべてを 0.5 RTT でプッシュするには、プッシュ チャネルがプル チャネルとまったく同じ技術、つまりリバース RPC を使用する必要があります。リバース RPC はメッセージ パッシングに似ていますが、冗長なリターンが導入され、有用な接続セマンティクスが破棄され、コンテンツに依存しない仲介をストリームに挿入することが難しくなります。

于 2013-07-24T20:42:58.047 に答える