私は、クライアントと (http) サーバーの間でファイル構造を同期する必要があるアプリケーションを作成中です。
ファイル構造は基本的にファイル パスのリストであり、各パスは 1 つ以上のデータ ブロック ID (実際のデータ ブロックへの 256 ビット参照) に接続された文字列です。データブロックは複数のファイルから参照できるため、パスと ID の間に nm の関係があります。現時点では、ID を持つパスのリストにすぎませんが、同期に必要な場合は、パスが表すツリー構造に簡単に変換できます。
このデータを効率的に同期できるデータ構造を探しています。主に次の 2 つの目標を達成します。
- 1 つのファイルの変更によって、クライアントがファイル構造全体をサーバーに送信することを強制するべきではなく、その小さなサブセットのみを送信する必要があります。
- 多くのファイルが変更された場合、これらの変更はまとめてグループ化する必要があります。たとえば、1000 の変更がサーバーへの 1000 の要求にならないようにします。
ご覧のとおり、目標は少し矛盾しているため、それらの間の適切な中間点を見つけるものを探しています. 2 番目の目標は、複数の変更を 1 つの http 要求にグループ化することで簡単に達成できますが、サーバーが必要とする処理 (HTTP 要求によって要求されたすべての変更を解析するため) は、コンピューティングに関して非常に安価である必要があります。
また、サーバー上で同じ構造を同期している複数のクライアントが存在する可能性があることにも言及する必要があります。したがって、1 つのクライアントによる変更を簡単に検出して、それを別のクライアントに同期させることができなければなりません (つまり、サーバーへのアップロードだけではありません)。
私は確かにこのようなことをする最初の人ではないので、利用可能ないくつかのスマートなソリューションがあると思います. たとえば、メタデータを同期する場合、Dropbox と Subversion の両方に同様の要件があると思います。彼らがそれをどのように実装したか知っている人はいますか?