ZooKeeper 分散ロック キュレーター ソース コード 1: 再入可能ロック

ZooKeeper 分散ロック キュレーター ソース コード 1: 再入可能ロック

序文

一般的な作業でよく使用される分散ロックは、Redis と ZooKeeper に基づいています。上記ではRedissonロックに関連するソースコードを紹介しました。それでは、ZooKeeper に基づくロックを見てみましょう。それが Curator フレームワークです。

Curator ロックには多くの種類があります。この記事では、共有再入可能ロックを分析します。

記事が長すぎると読みにくくなることを考慮したので、記事を適切に分割しています。

1環境設定

このマシンには3つのノードがあります

バージョン: 3.7.0 システム: macOS インストール方法: brew install zookeeper Curator Maven 依存関係バージョン: 5.1.0

  1. <依存関係>
  2. <グループ ID>org.apache.curator</グループ ID>
  3. <artifactId>キュレーターレシピ</artifactId>
  4. <バージョン>5.1.0</バージョン>
  5. </依存関係>

2 ロックの例

詳細については公式ドキュメント[1]を参照してください。

ロックする前に

ロックする前は、ZooKeeper にはノード/Zookeeper が 1 つだけあります。

ロック

/locks/lock_01 パスにロックを追加します。

ロック後:

  • 永続ノード /locks/lock_01 が作成され、その下に子ノード _c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000 が存在します。
  • ノード /locks/lock_01/_c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000 は一時ノードです
  • ノード/locks/lock_01/_c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000のデータはマシンのIPアドレスです

3 ソースコードをロックする

PS: 以下のコード スクリーンショットのコード スタイルは、Curator ソース コードのコード スタイルです。

入り口

プロセス間ミューテックス#内部ロック

まず、threadData から現在のスレッドを取得します。ここでは現在のスレッドは確実に存在しないため、attemptLock メソッドを入力します。

この方法には、後で紹介するロック再入のロジックも含まれます。

ロック

ロック内部#ロックの試行

核となる部分は次の 2 行です。

  • 一時的なシーケンスノードを作成する
  • internalLockLoopは作成が成功したかどうかを決定します

一時的なシーケンスノードを作成する

StandardLockInternalsDriver#createsTheLock

ノードのモードが CreateMode.EPHEMERAL_SEQUENTIAL であることがわかります。これは、これが一時的なシーケンシャル ノードであることを意味します。

CreateBuilderImpl#forPath(java.lang.String, byte[]) を入力します。

client.getDefaultData() はローカル IP アドレスです。

adjustPath メソッドは、その名前が示すように、パスを調整するために使用されます。 UUID が生成され、/locks/lock_01 に連結されて、/locks/lock_01/_c_UUID-lock- になります。

一時的なシーケンシャルノードが作成されるため、末尾にシーケンスが自動的に追加され、最終的に /locks/lock_01/_c_UUID-lock-0000000000 になります。

ノードの具体的な作成は CreateBuilderImpl#pathInForeground にあります。

一時ノードを作成します。パスが存在する場合は、正常に作成されます。パスが存在しない場合は作成に失敗します。

作成に失敗した場合は、まずパスを作成し、次にノードを作成します。

4 結論

この記事では、ZooKeeper をベースにした分散ロック フレームワークである Curator の使い方と、ロック プロセス、ソース コード分析について主に紹介します。

内容の概要は次のとおりです。

注目すべき重要なポイントは次のとおりです。

  • ZooKeeper ベースの分散ロックは一時的なシーケンシャル ノードを使用し、親ノードは永続ノードです。
  • 一時ノードを作成するときに、親ノードが存在しない場合は、まず親ノード (パス) が作成されます。
  • ロック構造はロック /locks/lock_01 で、実際のロックは /locks/lock_01/_c_UUID-ロック-シリアル番号です。たとえば、/locks/lock_01/_c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000

参考リンク:

[1]ZooKeeper共有再入可能ロック: https://curator.apache.org/curator-recipes/shared-reentrant-lock.html

この記事はWeChatの公開アカウント「Programmer Xiaohang」から転載したもので、以下のQRコードからフォローできます。この記事を転載する場合は、プログラマーXiaohangの公式アカウントまでご連絡ください。

<<:  消費者実装ロジック - Kafka 知識システム (IV)

>>:  Docker 以上の 8 つのオープンソース コンテナ管理ソリューション

推薦する

Kubernetes の他に、重要なコンテナ オーケストレーション ツールは何ですか?

Kubernetes は現在最も人気のあるコンテナ オーケストレーション プラットフォームであり、実...

zgovpsはどうですか?ロサンゼルスグローバルVPSシリーズVPS実テストデータ共有!

昨日、zgovps はロサンゼルス データ センターを拠点とする純粋に国際的な VPS シリーズ「ロ...

WeChat R&Dシステムにおける分散構成システムの設計の概要

[[347509]]著者: ypaapyyang、Tencent WXG バックエンド開発エンジニア...

常に変化するマーケティングにおいて、広告主はどのようにしてトレンドに沿った行動をとる機会をつかむことができるのでしょうか?

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

iOS 11.4へのアップデートには注意が必要。iPhone X/8/8 Plusでシステムフリーズが発生

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

bluehost - $12/年/無制限ホスティング/サイバーマンデー

Bluehost は、サイバーマンデーに 6 時間のクレイジーなプロモーションを実施しています。月額...

オフシーズンとピークシーズンがはっきりしている教育業界におけるインターネットマーケティング

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

ウェブサイトを目立たせるための 8 つのヒント

最近は個人のウェブサイトが増えており、ランキング付けがますます難しくなっています。多くのウェブサイト...

徐明軍がWeiboマーケティングの近道について簡単に語る

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス最近何がより速く情報を広...

友好的なリンクを交換する際に注意すべき点

フレンドリー リンクの交換は、SEO 最適化プロセスの非常に一般的かつ重要な部分であるため、フレンド...

侵入することなく Kubernetes に OpenTelemetry プローブをインストールする方法を学びましたか?

背景OpenTelemetry プローブOpenTelemetry (略して Otel、最新バージョ...

#hostwinds# 個人と企業の両方に適した、1時間あたり5セント相当の強力な「クラウドサーバー」

良心的なホスティング会社である Hostwinds は、完璧なサービスを提供します。 hostwin...

WeChatプロモーション:WeChatパブリックアカウントプッシュの仕組みを1つの記事で理解する

1. WeChatパブリックアカウントメッセージプッシュの定義開発モードでは、エンタープライズ メッ...

ウェブサイトでの robots.txt の使用に関するよくある誤解

数日前、robots.txt のルールに関する誤解について書き、Baidu と Google のロボ...