ZooKeeperの分散ロックを達成するために、学芸員のフレームワーク

 排他ロック(X)

ここでは主に排他ロックで分散ロックについて話をします。また、書込みロックまたは排他的ロックとして知られている排他ロックは、(排他ロック、Xロックと呼ぶ)、ロックは、基本的なタイプです。O1のみT1を可能トランザクションT1データオブジェクトO1プラス排他的ロック、ロックのその後の期間は、読み出しおよび他のトランザクションの更新データは、操作O1、直線T1放出の任意のタイプとすることができる場合排他ロック。

定義のロック

ZooKeeperのでは、ロックは、ZooKeeperのデータノードを作成することによって表すことができます。例えば、/ exclusive_lock /ロックノード(のznode)はロックのように表すことができます。

ロックを取得

排他ロックを取得する必要があるでは、可能なすべてのクライアントは、一時的な子ノード/ exclusive_lockノードで/ exclusive_lock /ロックを作成し、()のインターフェイスを作成しようとしているが、強い一貫性のZooKeeper最終的には、単一の顧客を確保します成功したクライアントがロックを取得していること、次に、作成しました。同時に、ロックを取得しないようにすべてのクライアントのトランザクションのみが待機状態にすることができ、事前にクライアントの待機状態は、子ノード変更ウォッチャーは、子ノードの状況を変更するために、リアルタイムで監視するために、/ exclusive_lockノード上でリッスン登録することができます。

ロックを解除

 

輸入java.util.concurrent.TimeUnit。
輸入lombok.Cleanup;
輸入lombok.SneakyThrows。
輸入org.apache.curator.RetryPolicy。
輸入org.apache.curator.framework.CuratorFramework。
輸入org.apache.curator.framework.CuratorFrameworkFactory;
輸入org.apache.curator.framework.recipes.locks.InterProcessMutex。
輸入org.apache.curator.retry.ExponentialBackoffRetry。
輸入org.apache.zookeeper.data.Stat; 


パブリック クラスZkLock { 

  @SneakyThrows 
  パブリック 静的 ボイドメイン(文字列[]引数){ 

    ファイナル=文字列":2181、ローカルホスト:ローカルホストを2182は、localhost:2183"でConnectString ; 

    //は戦略を再試行し、それぞれの間に必要な待機時間は、初期、1秒の待ち時間基準を再試行します。
    RetryPolicy = RetryPolicy 新しい新 ExponentialBackoffRetry(1000年,. 3 ); 

    // クライアント飼育係作成するために使用するデフォルトのセッション時間(60秒)と接続時間(15秒) 
    @Cleanup CuratorFrameworkクライアント= 。CuratorFrameworkFactory.builderを()
        ConnectStringの(のconnectString) 。
        connectionTimeoutMs( * 1000年15 。)
        sessionTimeoutMs( 60 * 100 
        retryPolicy(retryPolicy)。 ビルド); 

    // クライアントの起動
    client.startを(); 

    最終的な文字列lockNode = "/ lock_node"; 
    InterProcessMutexロック = 新しいInterProcessMutex(クライアント、lockNode)。
    試す{
       // ミューテックスを取得1. -それが利用可能になるまでブロックします。
      lock.acquire(); 

      // OR 

      // それが可能なのですか一定時間が経過するまでブロック- 2.ミューテックスを取得します。
      もし(lock.acquire(60 、TimeUnit.MINUTES)){ 
        スタットSTAT = client.checkExists()forPath(lockNode)。
        もしヌル!= のstat){
           // ドットトランザクション
        } 
      } 
    } 最後に{
       場合(lock.isAcquiredInThisProcess()){ 
        lock.release()。
      } 
    } 
  } 

}

 

おすすめ

転載: www.cnblogs.com/frankyou/p/11412394.html