Spring分散ロック-RedisLockRegistryとZookeeperLockRegistry
3259 ワード
しかし、ビジネスシーンは3つの状況を満たしています.システムは分散システムである(重要なのは分散であり、ReentrantLockまたはsynchronizedコードブロックを用いて単機で実現できる) .共有リソース(各システムが同じリソースにアクセスし、リソースのキャリアが従来のリレーショナル・データベースまたはNoSQLである可能性がある) 同期アクセス(つまり、多くのプロセス同僚が同じ共有リソースにアクセスしている) 同時性の問題が発生しないように分散ロックが必要です.
RedisLockRegistryとZookeeperLockRegistryは、分散プロジェクトでのredisとzookeeperの使用をそれぞれ利用して分散ロックを作成します.
分散ロックは悲観的なロックであり、特性を満たす必要があります.
1.反発性:各スレッドの作成されたロックは反発的である.すなわち、Aスレッドが作成してロックとBスレッドが作成したロックは同時にロックできない.
2.排他性:各スレッドの作成されたロックは排他的である.すなわち、現在のスレッドが作成したロックは、現在のスレッドのみがアクセス可能(ロック解除、ロック解除)である.他のスレッドは、アクセスを許可しない.
1.RedisLockRegistry
redisに依存する必要があり、redisクラスタは分散で高同時性、パーティションフォールトトレランス、高可用性を必要とするシーンによく使用されます.
redisの分散ロックの使用は、公式ドキュメントを参照してください.https://redis.io/topics/distlock
Springはredisという特性をカプセル化している.redisを使用するポリシーは、ほとんどの高同時シーンで満たすことができます.
mavan依存の追加
この分散ロックコンポーネントが取得するロックはorgである.springframework.integration.redis.util.RedisLockRegistry.RedisLock.内部クラス
2.ZookeeperLockRegistry
zookpeerに依存する必要があり,zookpeerクラスタは,シーン下の一貫性,パーティション許容誤り性を分散するために本省が満たす.
だからZookeeperLockRegistryは特に大きくなく、スレッドの同期を完璧に保証することができます.
ZookeeperLockRegistryに依存する必要がある
この分散ロックコンポーネントが取得するロックはorgである.springframework.integration.zookeeper.lock.ZookeeperLockRegistry.ZkLock.内部クラス
ロックの使用:
両方の分散ロックは、LockRegistryに継承されます.ロックレジストリで変数を明示し、ロックを取得することができます.
lockパッケージの一般的なapi
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パッケージの一般的なapi
void
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. ロック解除