Spring分散ロック-RedisLockRegistryとZookeeperLockRegistry

3259 ワード

しかし、ビジネスシーンは3つの状況を満たしています.
  • システムは分散システムである(重要なのは分散であり、ReentrantLockまたはsynchronizedコードブロックを用いて単機で実現できる)
  • .
  • 共有リソース(各システムが同じリソースにアクセスし、リソースのキャリアが従来のリレーショナル・データベースまたはNoSQLである可能性がある)
  • 同期アクセス(つまり、多くのプロセス同僚が同じ共有リソースにアクセスしている)
  • 同時性の問題が発生しないように分散ロックが必要です.
    RedisLockRegistryとZookeeperLockRegistryは、分散プロジェクトでのredisとzookeeperの使用をそれぞれ利用して分散ロックを作成します.
    分散ロックは悲観的なロックであり、特性を満たす必要があります.
    1.反発性:各スレッドの作成されたロックは反発的である.すなわち、Aスレッドが作成してロックとBスレッドが作成したロックは同時にロックできない.
    2.排他性:各スレッドの作成されたロックは排他的である.すなわち、現在のスレッドが作成したロックは、現在のスレッドのみがアクセス可能(ロック解除、ロック解除)である.他のスレッドは、アクセスを許可しない.
    package org.springframework.integration.support.locks;
    
    import java.util.concurrent.locks.Lock;
    
    public interface LockRegistry {
        Lock obtain(Object var1);
    }
    
    

    1.RedisLockRegistry
    redisに依存する必要があり、redisクラスタは分散で高同時性、パーティションフォールトトレランス、高可用性を必要とするシーンによく使用されます.
    redisの分散ロックの使用は、公式ドキュメントを参照してください.https://redis.io/topics/distlock
    Springはredisという特性をカプセル化している.redisを使用するポリシーは、ほとんどの高同時シーンで満たすことができます.
    mavan依存の追加
    
                org.springframework.integration
                spring-integration-redis
                5.0.4.RELEASE
            

    この分散ロックコンポーネントが取得するロックはorgである.springframework.integration.redis.util.RedisLockRegistry.RedisLock.内部クラス
    2.ZookeeperLockRegistry
    zookpeerに依存する必要があり,zookpeerクラスタは,シーン下の一貫性,パーティション許容誤り性を分散するために本省が満たす.
    だからZookeeperLockRegistryは特に大きくなく、スレッドの同期を完璧に保証することができます.
    ZookeeperLockRegistryに依存する必要がある
    
                org.springframework.integration
                spring-integration-zookeeper
                5.0.4.RELEASE
            

    この分散ロックコンポーネントが取得するロックはorgである.springframework.integration.zookeeper.lock.ZookeeperLockRegistry.ZkLock.内部クラス
     
    ロックの使用:
    両方の分散ロックは、LockRegistryに継承されます.ロックレジストリで変数を明示し、ロックを取得することができます.
    
    Lock lock = redisLockRegistry.obtain(lockKey);
    try {
        log.info("      ");
        if (lock.tryLock(3, TimeUnit.SECONDS)) {
        //     
        log.info("     ");
         // do business
        }
    } catch (Exception e) {
        log.error("      : ", e);
    } finally {
        lock.unlock();
    }

    lockパッケージの一般的なapivoid lock() Acquires the lock. ロックが追加され、他のスレッドにロックされているか、現在のスレッドがロックを取得できない場合はブロックされます.void lockInterruptibly() Acquires the lock unless the current thread is interrupted. 現在のスレッドが中断されない限り、ロックを追加します.boolean tryLock() Acquires the lock only if it is free at the time of invocation. ロックを試み、すでに他のロックがロックされている場合、現在のスレッドを取得してロックできない場合はfalseに戻り、ロックに失敗します.ロックが成功するとtrueが返されますboolean tryLock(long time, TimeUnit unit) Acquires the lock if it is free within the given waiting time and the current thread has not been interrupted. 指定した時間内にロックをかけてみます.すでに他のロックがロックされていて、現在のスレッドがロックできない場合はfalseに戻り、ロックに失敗します.ロックが成功するとtrueが返されますvoid unlock() Releases the lock. ロック解除