分散ロックのいくつかの実装方法(Java)
1332 ワード
Zookeeperベースの分散ロック
zookeeper一時秩序ノードに基づいて実現できる分散ロック.大まかな考え方は、各クライアントがメソッドにロックをかけると、zookeeper上のメソッドに対応する指定ノードのディレクトリの下で、一意の瞬時秩序ノードが生成されることである.ロックを取得するかどうかを判断する方法は簡単で,順序ノードの中でシーケンス番号が最も小さいものを判断するだけである.ロックを解除する場合は、この瞬時ノードを削除するだけでよい.同時に、サービスダウンによるロックが解放されず、デッドロックの問題が発生することを回避できます.再読み込み可能なロックサービスがカプセル化されたzookeeperサードパーティ製ライブラリCuratorクライアントを直接使用できます.
キャッシュベースの分散ロック
Redisベース
Redisを使用するクライアントRedisson
Redisson Lock API:
Tairベース
参考資料
Curator Recipesインスタンスに従ってZooKeeperの使い方を学ぶ:分散ロック「Redis公式ドキュメント」はRedisで分散ロックRedisson Distributed locks and synchronizersを構築する
zookeeper一時秩序ノードに基づいて実現できる分散ロック.大まかな考え方は、各クライアントがメソッドにロックをかけると、zookeeper上のメソッドに対応する指定ノードのディレクトリの下で、一意の瞬時秩序ノードが生成されることである.ロックを取得するかどうかを判断する方法は簡単で,順序ノードの中でシーケンス番号が最も小さいものを判断するだけである.ロックを解除する場合は、この瞬時ノードを削除するだけでよい.同時に、サービスダウンによるロックが解放されず、デッドロックの問題が発生することを回避できます.再読み込み可能なロックサービスがカプセル化されたzookeeperサードパーティ製ライブラリCuratorクライアントを直接使用できます.
キャッシュベースの分散ロック
Redisベース
Redisを使用するクライアントRedisson
org.redisson
redisson
3.3.1
org.redisson
redisson
2.8.1
Redisson Lock API:
RLock lock = redisson.getLock("anyLock");
// Most familiar locking method
lock.lock();
// Lock time-to-live support
// releases lock automatically after 10 seconds
// if unlock method not invoked
lock.lock(10, TimeUnit.SECONDS);
// Wait for 100 seconds and automatically unlock it after 10 seconds
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
...
lock.unlock();
Tairベース
参考資料
Curator Recipesインスタンスに従ってZooKeeperの使い方を学ぶ:分散ロック「Redis公式ドキュメント」はRedisで分散ロックRedisson Distributed locks and synchronizersを構築する