夜も更けたので、分散ロックについて学んでみましょう

夜も更けたので、分散ロックについて学んでみましょう

[[354141]]

この記事はWeChatの公開アカウント「故郷でJavaを学ぶ」から転載したもので、著者は故郷です。この記事を転載する場合は、地元Java学習公開アカウントまでご連絡ください。

今日の記事を書き始めた時刻を00:53と記録します。夜も遅いので、分散ロックについて学んでみましょう。静かに学び、そしてみんなで経験するべきです。

分散ロックとは何ですか?分散ロックはどのような問題を解決できますか?

システムで分散アーキテクチャを使用していなかったときは、同期ロックまたは Lock ロックを使用して、複数のスレッドが同時に実行されているときに、1 つのスレッドだけが共有変数を変更したり、同時にコード ブロックを実行したりするようにできました。ただし、現在、当社のシステムのほとんどは分散クラスターに導入されています。単純な同期ロックとロック ロックでは、単一のインスタンス上のデータの一貫性しか保証できず、複数のインスタンスは役に立ちません。

現時点では、共有リソースのアトミック性を保証するために分散ロックが必要です。例えば、当社の電子商取引システムで在庫を減算する場合、注文数量が少ないと大きな問題にはなりません。ただし、注文数量が多く、複数のインスタンスが同時に在庫減算業務を並行して処理している場合は、過剰販売の問題が発生する可能性があります。

分散ロックを実装するにはどうすればいいですか?

一般的な分散ロックには、データベース実装の分散ロック、Zookeeper 実装の分散ロック、Redis 実装の分散ロック、Redisson 実装の分散ロックなどがあります。その中でも、データベースにおける分散ロックの実装は比較的単純で理解しやすいものです。データベースに基づいて直接実装できます。一部の分散型ビジネスでもよく使用されます。ただし、この方法は最も効率が悪いため、通常は使用されません。他の 3 つの方法の実装に焦点を当てます。

Zookeeperは分散ロックを実装する

分散ロックを実装するには、Zookeeper を使用するのが一般的です。たとえば、多くのプロジェクトでは、分散登録センターとして Zookeeper を使用し、分散ロックを実装するために Zookeeper を使用することを好みます。これは主に、Zookeeper の 2 つの主要機能、つまり連続した一時ノードとウォッチ メカニズムによるものです。

連続した一時ノード: Zookeeper に精通している学生は、Zookeeper が複数レベルのノード名前空間を提供し、各ノードがフォルダーと同様にスラッシュで区切られたパスで表されることを知っています。ノードは永続ノードと一時ノードに分けられます。ノードは順序付きとしてマークすることもできます。ノードが順序付きとしてマークされている場合、そのノードは順次自己増分の特性を持ちます。この特性を利用して必要なノードを作成できます。

監視メカニズム: 監視メカニズムは Zookeeper のもう 1 つの重要な機能です。指定されたノードにいくつかのウォッチャーを登録し、特定のことがトリガーされたときにユーザーにイベントを通知することができます。

Zookeeperが分散ロックを実装するプロセス

まず、親ノードとして永続ノードを作成します。分散ロックにアクセスして作成する必要があるときはいつでも、この親ノードの下に対応する一時的な連続した子ノードを作成し、その特性名は一時ノード名、親ノード名、およびシーケンス番号で構成されます。子ノードが作成された後、親ノードの下にあるこの子ノードの名前で始まる子ノードがソートされ、新しく作成されたノードのシーケンス番号が最小であるかどうかが判断されます。最小であればロックが取得されます。最小ノードでない場合は、待機中のロックがブロックされ、そのノードの前のシーケンスノードにウォッチャーが登録され、そのノードに対応する操作がロックを取得するのを待機します。

ビジネスが処理されると、ノードが削除され、zk が閉じられ、Watcher がトリガーされてロックが解除されます。

上図は、厳密に順番にアクセスされる分散ロックの実装です。多くの場合、最も一般的に使用される Curator フレームワークなど、実装に役立つフレームワークをいくつか導入します。コードは次のとおりです。

  1. InterProcessMutex ロック = 新しい InterProcessMutex(client, lockPath);
  2. ロックを取得する場合(maxWait、waitUnit) {
  3. 試す {
  4. //ビジネス処理
  5. }
  6. ついに{
  7. ロックを解除します。
  8. }
  9. }

Zookeeper を使用して分散ロックを実装する自然な利点は、Zookeeper がクラスター内に実装されることです。当社の本番環境は、通常、クラスターに展開されます。これにより、単一点の問題を回避でき、安定性が向上し、操作ごとにロックを解除できることが保証されます。

欠点は、ノードの頻繁な作成と削除、および監視イベントの登録により、Zookeeper クラスターに大きな負荷がかかり、Redis によって実装された分散ロックほどパフォーマンスが良くないことです。

Redisは分散ロックを実装する

Redis によって実装される分散ロックは最も複雑ですが、そのパフォーマンスは確かに最高であるため、より高いパフォーマンス要件を持つシステムでは、Redis を使用して分散ロックを実装することを選択します。分散ロックは通常、SETNX を使用して Redis で実装されます。以下に簡単な例を示します。

  1. 公共 静的ブール値 getDistributedLock(Jedis jedis、文字列 lockKey、文字列 requestId、 int expireTime) {
  2.  
  3. 文字列結果 = jedis.set (lockKey、requestId、SET_IF_NOT_EXIST、SET_WITH_EXPIRE_TIME、expireTime);
  4.  
  5. if ( "OK" .equals(結果)) {
  6. 戻る 真実;
  7. }
  8. 戻る 間違い;
  9. }

SETNX メソッドは、ロックとロック有効期限の設定のアトミック性を保証しますが、ロック有効期限の設定には注意を払う必要があります。

時間が比較的長く、設定した有効期限が比較的短い場合、業務が完了する前にロックが解除されます。そのため、業務が正常に処理されることを確認するために、実際の業務処理に応じてロックの有効期限を評価する必要があります。

Redissonは分散ロックを実装

Redisson は、Redis をベースにした Java インメモリ データ グリッドです。 NIO ベースの Netty フレームワークに基づく Redisson は、Redis キー値データベースが提供する利点を最大限に活用し、Java ユーティリティ パッケージでよく使用されるインターフェイスに基づいて、分散特性を持つ一連のよく使用されるツール クラスをユーザーに提供します。パフォーマンスも普段使用しているジェダイよりも優れています。

Redisson は、シングルノード モードとクラスター モードの両方で分散ロックを非常に適切に実装します。一般的にはクラスター モードがより頻繁に使用されます。クラスター モードでは、Redisson は RedLock アルゴリズムを使用して、マスター ノードがダウンしたときに別のマスター ノードに切り替えるプロセス中に複数のアプリケーションによるロックの取得を処理します。

Redisson クラスター モードでロックを取得する実装は、異なるノードでロックを取得することです。各ノードでロックを取得するにはタイムアウトがあります。ロックの取得がタイムアウトすると、ノードは使用不可とみなされます。正常に取得されたロックの数が Redis ノードの半数を超え、ロックの取得に費やされた時間がロックの有効期限を超えていない場合、ロックは正常に取得されたと見なされます。ロックが正常に取得された後、元のロック解除時間からロックの取得にかかった時間を差し引いて、ロック解除時間が再計算されます。最終的にロックの取得に失敗した場合、ロックを正常に取得したノードもロックを解放します。

具体的なコード実装:

依存関係の導入

  1. <依存関係>
  2. <グループID>org.redisson</グループID>
  3. <artifactId>redisson</artifactId>
  4. <バージョン>3.13.1</バージョン>
  5. </依存関係>

Redisson 設定ファイル:

  1. @ビーン
  2. public RedissonClient redissonClient() {
  3. 設定 config = new Config();
  4. config.useClusterServers()
  5. .setScanInterval(3000) // クラスターステータススキャン間隔(ミリ秒単位)
  6. .addNodeAddress( "redis://192.168.0.1:6379).setPassword(" 666")
  7. .addNodeAddress( "redis://192.168.0.2:6379" ).setPassword( "666" )
  8. .addNodeAddress( "redis://192.168.0.3:6379" )
  9. .setPassword( "666" );
  10. Redissonを返します作成(設定);
  11. }

ロック取得操作:

  1. 長い waitTimeout = 10;
  2. 長いリース時間 = 1;
  3. RLock lock1 = redissonClient1.getLock( "lock1" );
  4. RLock lock2 = redissonClient2.getLock( "lock2" );
  5. RLock lock3 = redissonClient3.getLock( "lock3" );
  6.  
  7. ロック1、ロック2、ロック3を設定します。
  8.  
  9. redLock.trylock(waitTimeout,leaseTime,TimeUnit.SECONDS);
  10. 試す{
  11. //...
  12. }ついに{
  13. redLock.ロック解除();
  14. }

要約する

分散ロックを実装する方法は 3 つ以上あります。最も単純なのはデータベースの実装です。 Zookeeper の実装も比較的シンプルですが、最高のパフォーマンスは依然として Redis の実装です。ただし、信頼性の面では、Zookeeper は分散クラスターをベースとしており、自然な利点があり、比較的信頼性が高くなります。ビジネス シナリオにそれほど高いパフォーマンス要件がない場合は、分散ロックを実装するために Zookeeper を使用することをお勧めします。

<<:  クラウド コンピューティング クイック スタート ガイド

>>:  Kingsoft Cloudをサポートし、ビデオ業界のイノベーションを加速させるドルビービジョンクラウドトランスコーディングを初めて提供

推薦する

インターネット時代の消費パターンの進化:本物の製品から私たちはどれだけ離れているのか?

インターネット上では、正規品に関する議論がますます増えています。インターネットは著作権侵害を助長し、...

新世代のクラウドストレージUbuntuサーバーが正式にリリースされる

次世代の Ubuntu Linux オペレーティング システムは、企業がクラウド ストレージやクラウ...

Veeble は、Windows 2003 に無制限のトラフィックを提供する VPS サービス プロバイダーです。

Server 2003 システムをサポートする海外の VPS を見つけるのは簡単ではありません。結局...

実用的な情報:クラウドストレージの7つの利点と5つの欠点、この記事を読んでください

最近はすべてがクラウドに移行しているようですが、ストレージはどうでしょうか?高価なデータセンターのス...

クラウドネイティブの可観測性データに溺れないようにする方法

従来のアプリケーション パフォーマンス監視 (APM) は、規模とデータ量に根本的な違いがあるため、...

検索、WeChatの自己ゲーム

WeChat Open Class PROでは、WeChatがSouYisouを積極的に開発するとい...

IDC: 世界のパブリッククラウドサービスの収益は2021年に29%増加し、4,000億ドルを超える

IDC の半期ごとのグローバル パブリック クラウド サービス トラッカーによると、インフラストラク...

ユーザーエクスペリエンスがキーワード変動の根本的な原因

ある時、新人の SEO 担当者から、ウェブサイトのキーワードがなぜいつも変動するのかと尋ねられました...

Amazon SageMaker は、Xingzhe AI がゲーム コンテンツのフィルタリングで 96% の精度を達成するのを支援します

記者が星浙AI(成都千智人工知能科技有限公司傘下のブランド、星浙.ai)から得た情報によると、同社が...

テンセントのSogou買収の真意

Sogouは上場廃止、Sohu は手放し、Ogawa は撤退し、 Tencent が引き継いだ。すべ...

小玖同:オンラインとオフラインをリンクして広告主のマーケティングを支援するこのモデルは、将来の広告の新たなトレンドになるかもしれない

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますXiaoq...

racknerd: 米国の大型ハードディスク サーバー、509 ドル、2*e5-2640v2、64G メモリ、250gSSD+160T SAS、200T トラフィック/月

Racknerdはこれまで、米国ユタ州で超大型160Tハードドライブを搭載したストレージサーバーを発...

企業は、ニーズに基づいて最適なクラウド ストレージ プロバイダーをどのように選択できるでしょうか?

ほとんどの企業が依然としてオンプレミスのデータセンターにデータを保存していますが、企業がクラウドスト...