12

最近リリースされたGizzardシャーディングフレームワークに関する記事をTwitterで読んでいます(http://engineering.twitter.com/2010/04/introducing-gizzard-framework-for.html)。高い信頼性を確保するには、すべての書き込み操作がべき等でなければならないと記載されています。

ウィキペディアによると、「べき等演算は、結果を変更せずに複数回適用できる演算です。」ただし、IMHOの場合、Gizzardの場合、べき等の書き込み操作は、順序が重要ではない操作である必要があります。

さて、私の質問は次のとおりです。書き込み操作をべき等にするにはどうすればよいですか?

私が想像できる唯一のことは、各書き込みにバージョン番号を付けることです。たとえば、ブログシステムでは、各ブログに$blog_id$contentが必要です。アプリケーションレベルでは、常にこのwrite($ blog_id、$ content、$ version)のようなブログコンテンツを書き込みます。$ versionは、アプリケーションレベルで一意であると判断されます。したがって、アプリケーションが最初に1つのブログを「Helloworld」に設定しようとし、次にそれを「Goodbye」にしたい場合、書き込みはべき等です。このような2つの書き込み操作があります。

write($blog_id, "Hello world", 1);
write($blog_id, "Goodbye", 2);

これらの2つの操作は、DB内の2つの異なるレコードを変更することになっています。したがって、これら2つの操作が何度実行され、どのような順序で実行されても、結果は同じです。

これは私の理解です。私が間違っている場合は訂正してください。

4

2 に答える 2

6

あなたは、絶対に正しい。べき等演算自体は、「最後の書き込みが勝つ」という1つの競合解決パターンしか提供できません。書き込みを時間内に並べ替えることができない場合は、解決策として考えられます。可能であれば、競合解決を自動化するための追加情報を提供する必要があります。そして、あなたのアイデアは新しいものではありません。一般的な場合、それはベクトルクロックと呼ばれます。

システム内のオブジェクトの変更履歴を収集するシステムの1つで、バージョンベースの競合解決を使用します。クライアントは、完全なオブジェクトの状態とバージョン情報を履歴モジュールに(非同期で)送信します。その後、履歴モジュールはオブジェクトの状態を正しい方法で並べ替えて、永続ストレージにデルタのみを保存できます。唯一の制限は、クライアントがオブジェクトに変更を加えるときに、ある種の同時実行制御を使用する必要があることです(オブジェクトの状態バージョンを追跡する場合は、楽観的ロックが非常に優れた方法です)。

于 2010-04-22T07:27:18.203 に答える
4

あなたは正しい考えを持っています。特定の値を設定することはべき等です。その操作を複数回実行すると、同じ結果が得られるためです。繰り返しを行うと複数のコピーが追加されるため、従来の非べき等書き込みは追加です。

また、この前のスタックオーバーフローの質問を参照してください。

于 2010-04-08T06:24:57.000 に答える