2017-01-24 6 views
3

ノード/ aが複数回更新された場合、/ aのデータを購読しているクライアントは最新のものだけでなく、すべての更新を受け取るという保証がありますか?ノードで複数の変更があった場合、ZooKeeperはサブスクライバに警告しませんか?

たとえば、クライアントAは1k/sのノード/ aを更新しようとしますが、クライアントBはすべての1k/sの更新を受信するか、その割合だけを受信しますか? Javaライブラリを使用してクライアントを実装します

+0

コードをコピー/ペーストできますか?あなたはapache-curatorを使用しますか? – sgrillon

+0

私は現在、裸のapacheの動物園の接続を使用しています。キュレーターはセッションの有効期限を正しく処理できますか? – rodi

+2

キュレーターを使用できる場合:http://curator.apache.org/curator-recipes/persistent-ephemeral-node.html – sgrillon

答えて

0

ZooKeeperは保証linearizabilitysequential consistencyを提供しています。 Apache ZooKeeperのドキュメントConsistency Guaranteesには、整合性モデルの詳細な説明があります。 ZooKeeperはこれらのプロパティを満たすように設計されているため、クライアントウォッチャーはすべての更新の通知を受け取り、複数の同時クライアントウォッチャーすべてが同じタイムラインの更新を監視します。

ZooKeeperは、zxidと呼ばれるすべての更新プログラムに一意に増加するユニークな識別子を付けることでこれを実装しています。 zxid値は、システムへの書き込みトランザクションの合計順序を定義します。

ZooKeeperクライアントは、最後に見たzxidを追跡します。誤って遅れているZooKeeperサーバに接続し、クライアントが見た最新のzxidを持っていない場合、接続は中止され、クライアントは最新のzxidを持つ別のサーバに接続しようとします。接続が成功した後、サーバがより新しいzxidを持つトランザクションを持っている場合、それらのトランザクションに一致するクライアントウォッチがトリガされます。

保証されていないいくつかのことを覚えておくことも重要です。すべての同時クライアントが常に同じ状態を維持することを保証するものではありません。上記のConsistency Guaranteesに関するリンク先のドキュメントには、これを説明する警告メッセージがあります。

さらに、クライアントプロセスが常に実行されている限り、上記で説明した内容が適用されます。プロセスが再起動されると、前回実行時に最後に表示されたzxidは保持されません。新しいプロセスは、サーバーから新しい最新のzxidを取得することによって、新しい接続とブートストラップを確立します。プロセスが停止している間に更新が適用された場合、新しい実行プロセスは変更の通知を受け取る方法がありません。

コーディングZooKeeperクライアントはすべてのエラーモードを正しく処理するのが難しいので、私はコメントからアドバイスを受けて、Apache Curatorを使用することを検討します。

関連する問題