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

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

[[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をサポートし、ビデオ業界のイノベーションを加速させるドルビービジョンクラウドトランスコーディングを初めて提供

推薦する

伝統的な広告に社会的要素がどのように適用されるかについての簡単な議論

広告には千年近い歴史があります。今日、伝統的な広告は大きな変化を遂げています。伝統的な広告の形態は何...

シャミの命はアリババによって遅らされた

著者:蘇奇 編集者:金玉凡出典: 神蘭財経あなたがXiami Music の真のファンなら、自分の ...

中小企業によくあるインターネットマーケティングの5つの手法!

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

玉橋動画:目立つCMのコピーライティングはこうやって生まれるんですか?

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

hosteons: 50% オフ、24 時間限定、1G メモリ + データ無制限、年払い $13.5

hosteons からの最新ニュース: 新しく発売された OpenVZ7 シリーズ VPS の 50...

SEO起業の条件や収益化のアイデアについて何を知っていますか?

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスSEO 最適化のテクニッ...

デジタル変革市場の価値は7,160億ドルです。イノベーションは自動車業界に何をもたらすのでしょうか?

2018年に入り、世界、特に中国はデジタル変革にとって重要な年に入りました。マイクロソフトと市場調査...

Alibaba が次世代デュアルモード SSD ストレージ アーキテクチャと世界初のデュアルモード SSD 製品である AliFlash V3 を発表

オープンチャネルモードと標準NVMeモードの両方をサポートアリババ初の自社開発ストレージコントローラ...

価値の低いページの時代は終わりました。考え方は変わりましたか?

百度が「価値の低いページはノー」と大胆に宣言して以来、業界に与えた衝撃は、間違いなく広島に投下された...

Geek Host: ラスベガス VPS、20% オフ プロモーション、月額 40 元からの支払い、Windows をサポート

10年間運営されている国内ホスティングブランドであるGeek Hostは、香港、シンガポール、日本、...

機密情報ステーションのプロモーションに関する雑感:効率的なプロモーションは意思決定から生まれる

私は長年、電子商取引サイトや地域ポータルサイトのオンラインプロモーション業務に携わってきました。その...

高齢者介護産業が爆発的に成長し、デジタル高齢者介護の構築に関する予備調査

[[257673]] 2016年には「健康中国2030」計画概要が発表され、医療産業の発展と医療サー...

AWS、Azure、Google のクラウド コンテナ レジストリの比較

3 つの主要なパブリック クラウド プラットフォームである Amazon Web Services ...

QunarのIPO成功の秘密を解明:Baiduのサポートが鍵

最新の市場を見る11月1日、オンライン旅行検索プラットフォームQunarがナスダックに上場し、投資家...

JD.comの劉強東氏:中国のインターネット産業は巨大なバブル

JD.comグループのCEO、劉強東氏は最近、共有セッションを行った。劉強東氏は、インターネット業界...