分散ロックを使用する理由は何ですか?この問題について議論する前に、ビジネス シナリオを見てみましょう。
画像はPexelsより 分散ロックを使用する理由は何ですか? システム A は電子商取引システムであり、現在は 1 台のマシンに導入されています。システムにはユーザーが注文するためのインターフェースがありますが、注文する前に、ユーザーは在庫をチェックして、十分な在庫があるかどうかを確認する必要があります。 システムにはある程度の並行性があるため、商品の在庫は事前に Redis に保存され、ユーザーが注文すると Redis の在庫が更新されます。 この時点でのシステム アーキテクチャは次のとおりです。 しかし、これによって問題が発生します。ある瞬間に、Redis 内の特定の商品の在庫が 1 である場合です。 このとき、2 つのリクエストが同時に到着します。リクエストの 1 つは上図のステップ 3 まで実行され、データベース インベントリを 0 に更新しますが、ステップ 4 はまだ実行されていません。 もう一方のリクエストはステップ 2 に到達し、在庫がまだ 1 であることがわかったので、ステップ 3 に進みます。結果として、2 つのアイテムが販売されましたが、在庫は 1 つのアイテムのみになります。 これは明らかに間違っています!これは在庫の過剰販売による典型的な問題です。この時点で、解決策を考えるのは簡単です。ロックを使用してステップ 2、3、4 をロックし、これらのステップが実行された後に別のスレッドがステップ 2 を実行できるようにします。 上図の通り、ステップ 2 を実行する際に、Java が提供する Synchronized または ReentrantLock を使用してロックし、ステップ 4 が完了したらロックを解除します。 このように、ステップ 2、3、および 4 は「ロック」され、複数のスレッド間でのみ連続して実行できるようになります。 しかし、良い時代は長くは続かなかった。システム全体の同時実行性が急上昇し、1 台のマシンでは処理できなくなりました。次に、以下に示すようにマシンを追加する必要があります。 マシンを追加すると、システムは上記のようになります。すごいですね! 2 人のユーザーのリクエストが同時に到着したが、異なるマシンに届いたと仮定すると、これらの 2 つのリクエストを同時に実行できますか? それとも、在庫の過剰販売の問題が発生しますか? なぜ?上図の 2 つの A システムは 2 つの異なる JVM で実行されるため、追加されるロックはそれぞれの JVM 内のスレッドに対してのみ有効であり、他の JVM 内のスレッドに対しては無効です。 したがって、ここでの問題は、2 台のマシンによって追加されたロックが同じロックではない (2 つのロックが異なる JVM にある) ため、Java によって提供されるネイティブ ロック メカニズムがマルチマシン展開シナリオで失敗するという点です。 では、2 台のマシンに追加されたロックが同じロックであることを確認すれば、問題は解決するのではないでしょうか。この時点で、分散ロックが登場する時が来ました。 分散ロックの考え方は、システム全体でロックを取得するためのグローバルで一意の「もの」を提供し、各システムがロックを必要とするときにこの「もの」にロックを要求し、異なるシステムが同じロックを取得したと想定できるようにすることです。 この「もの」としては、Redis、Zookeeper、またはデータベースが考えられます。テキストの説明はあまり直感的ではありませんので、次の図を見てみましょう。 上記の分析から、在庫過剰のシナリオでは、分散展開システムで Java ネイティブ ロック メカニズムを使用するとスレッドの安全性が保証されないため、分散ロック ソリューションを使用する必要があることがわかります。 では、分散ロックをどのように実装するのでしょうか?読み続けてください! Redis ベースの分散ロックの実装 上記の分析は、分散ロックが使用される理由を説明しています。ここでは、分散ロックが実装された場合にどのように対処するかについて詳しく説明します。 ①一般的な解決策は、分散ロックにRedisを使用することです 分散ロックに Redis を使用するアイデアは、おおよそ次のようになります。Redis にロックが追加されたことを示す値を設定し、ロックが解除されたらキーを削除します。 具体的なコードは次のとおりです。
このアプローチにはいくつかの重要なポイントがあります。
これにより、A がロックを取得し、有効期限が 30 秒であるという状況を回避できます。 35秒後にロックは自動的に解除されます。 A はロックを解除しますが、この時点で B がロックを取得している可能性があります。クライアント A は B のロックを削除できません。 クライアントが分散ロックを実装する方法を考慮するだけでなく、Redis の展開も考慮する必要があります。 Redis には 3 つのデプロイメント方法があります。
分散ロックに Redis を使用する場合の欠点は、単一マシンのデプロイメント モードを採用すると、Redis に障害が発生する限り、単一ポイントの問題が発生することです。ロックしても機能しません。 マスタースレーブモードでは、ロック中に 1 つのノードのみがロックされます。 Sentinel によって高可用性が実現されていても、マスター ノードに障害が発生し、マスター スレーブの切り替えが発生すると、ロックが失われる可能性があります。 上記の考慮に基づいて、Redis の作者もこの問題を考慮し、RedLock アルゴリズムを提案しました。 このアルゴリズムの意味は、おおよそ次のようになります。Redis のデプロイメント モードが Redis Cluster であり、マスター ノードが合計 5 つあると仮定します。 次の手順に従ってロックを取得します。
ただし、このアルゴリズムはまだ議論の余地があり、多くの問題がある可能性があり、ロック プロセスが正しいという保証はありません。 ②別の方法:レディソン さらに、Redis クライアントのネイティブ API に基づいて Redis 分散ロックを実装するには、オープン ソース フレームワーク Redission を使用することもできます。 Redisson は、分散ロックのサポートも提供するエンタープライズ レベルのオープン ソース Redis クライアントです。私も皆さんにこれを使うことを強くお勧めします。なぜでしょうか? 上で述べたことを思い出してください。 Redis を通じて値を設定する独自のコードを記述する場合は、次のコマンドで設定します。
ここで設定されるタイムアウトは 30 秒です。 30 秒以内にビジネス ロジックを完了しないと、キーの有効期限が切れ、他のスレッドがロックを取得する可能性があります。 この場合、最初のスレッドがビジネス ロジックの実行をまだ完了していない状態で 2 番目のスレッドが実行されると、スレッドの安全性の問題が発生します。 したがって、この有効期限も追加で管理する必要がありますが、これは非常に面倒です。Redisson がこれをどのように実装するかを見てみましょう。 まずはRedissionを使う喜びを感じてください。
それはとても簡単です。分散ロックを完了するには、API の Lock と Unlock を使用するだけです。それは多くの詳細を考慮するのに役立ちます:
この方法では、ロックが常に保持されていても、キーの有効期限が切れて他のスレッドがロックを取得するという問題は発生しません。
以下にその実装コードの一部を示します。
さらに、Redisson は Redlock アルゴリズムのサポートも提供しており、その使い方も非常に簡単です。
概要: このセクションでは、Redis を分散ロックとして使用する具体的な実装計画とその制限事項を分析し、すべての人に使用を推奨する Redis クライアント フレームワーク Redisson を紹介します。独自のコードを書くよりも、多くの細かい点に注意を払う必要が少なくなります。 Zookeeper に基づく分散ロックの実装 一般的な分散ロック実装ソリューションとしては、Redis を使用するほか、Zookeeper を使用して分散ロックを実装することもできます。 Zookeeper (以下、ZK) を使用して分散ロックを実装する仕組みを紹介する前に、まずは ZK とは何かを簡単に紹介します。ZK は、構成管理、分散コラボレーション、命名を提供する集中型サービスです。 ZK モデルは次のとおりです。ZK には、ファイル システムと同様に、Znode と呼ばれる一連のノードが含まれており、各 Znode はディレクトリを表します。 Znode にはいくつかの特徴があります:
たとえば、子ノード「/lock/node-」を作成し、順序を指定すると、ZK は子ノードを生成するときに、現在の子ノードの数に応じて整数のシリアル番号を自動的に追加します。 つまり、最初に作成された子ノードの場合、生成される子ノードは /lock/node-0000000000、次のノードは /lock/node-0000000001 というようになります。
現在、ZK には次の 4 つのイベントがあります。
ZK の上記の特性に基づいて、ZK を使用して分散ロックを実装するためのソリューションを簡単に考え出すことができます。
たとえば、現在のスレッドによって取得されたノード番号が /lock/003 で、すべてのノードのリストが [/lock/001、/lock/002、/lock/003] の場合、イベント リスナーは /lock/002 ノードに追加されます。 ロックが解除されると、次のシーケンス番号を持つノードが起動され、ステップ 3 が再実行され、自身のノード シーケンス番号が最小であるかどうかが判断されます。 例えば、/lock/001 が解放され、/lock/002 が時間を検出すると、ノードセットは [/lock/002, /lock/003] になります。すると、/lock/002 が最小のシーケンス番号を持つノードとなり、ロックを取得します。 全体のプロセスは次のとおりです。 これが具体的な実装アイデアです。コードの書き方については、比較的複雑なのでここでは掲載しません。 キュレーター紹介 Curator は、分散ロックの実装も提供するオープンソースの ZK クライアントです。使い方も比較的簡単です。
分散ロックを実装するためのコア ソース コードは次のとおりです。
実際、Curator の分散ロック実装の基本原理は、上記の分析と似ています。ここでは、図を使ってその原理を詳しく説明します。 概要: このセクションでは、分散ロックを実装するための ZK のソリューションと ZK のオープンソース クライアントの基本的な使用方法を紹介し、その実装原則を簡単に紹介します。 2つのソリューションの長所と短所の比較 このセクションでは、2 つの分散ロック実装について学習した後、Redis と ZK の実装の長所と短所について説明します。 Redis 分散ロックの場合、次のような欠点があります。
しかし一方で、Redis を使用して分散ロックを実装することは多くの企業で非常に一般的であり、ほとんどの場合、いわゆる「非常に複雑なシナリオ」に遭遇することはありません。 したがって、Redis を分散ロックとして使用することも適切なソリューションです。最も重要な点は、Redis はパフォーマンスが高く、高並行性のロック取得および解放操作をサポートできることです。 ZK 分散ロックの場合:
ただし、ZK にも欠点があります。ロックを頻繁に申請したり解除したりするクライアントが多い場合、ZK クラスターにかかる負荷が比較的高くなります。 まとめ: まとめると、Redis と ZK にはそれぞれ長所と短所があります。これらの問題は、テクノロジーを選択する際の参考要素として使用できます。 いくつかの提案 これまでの分析から、分散ロックを実装するための一般的なソリューションは Redis と ZK の 2 つであり、それぞれに利点があることがわかりました。どのように選択すればよいでしょうか? 個人的には、ZK によって実装されたロックを好みます。Redis には隠れた危険があり、不正確なデータが発生する可能性があるためです。ただし、どのように選択するかは、企業内の具体的なシナリオによって異なります。 企業が ZK クラスターの条件を満たしている場合は、ZK の実装が優先されます。ただし、企業内に Redis クラスターしかない場合、ZK クラスターを構築するための条件はありません。 実際、Redis を使用して実装することも可能です。さらに、システム設計者は、システムにすでに Redis があるが、外部依存関係を再度導入したくないと考えているため、Redis を使用することができます。これは、システム設計者がアーキテクチャに基づいて考慮する必要があるものです。 Chinese Huperzine: 10 年以上の BAT アーキテクチャ経験、一流インターネット企業のテクニカル ディレクター。数百人のチームを率いて、数億のトラフィックを処理する複数の高同時実行システムを開発しました。長年の研究で蓄積してきた研究論文や経験の要約を文書にまとめましたので、皆様にご紹介したいと思います。 WeChat 公開アカウント: Shishan’s Architecture Notes (ID: shishan100)。 |
<<: Kafka アプリケーションを理解するための 2 つの図
>>: 5G 時代のクラウド コンピューティング市場の動向を通信事業者はどのように把握するのでしょうか?
インターネットの発展に伴い、ウェブサイトアプリケーションの規模は拡大し続けています。従来の垂直アプリ...
クラウド サーバーと仮想ホストは名前が非常に似ているため、多くの企業はそれらの違いを理解していません...
多くの人が Vultr の VPS を使用していますが、IP ブロックや「説明できない」問題、そして...
なぜこの話題を取り上げようと思ったかというと、今日のグループチャットで、ウェブサイトのプログラムと ...
7月16日、内モンゴル自治区ウランチャブ市でUCloudウランチャブデータセンターの起工式が開催され...
Hosthatchは英国ロンドンで独自のVPSクラウドサーバー事業を展開しており、安価で費用対効果が...
250MB のハード ドライブ、月間トラフィック 10G、Web サイト 1 つ、MySQL 5 つ...
[中国、北京、2021年9月27日] 2021年中国国際情報通信博覧会において、ファーウェイの5G屋...
有料リストに詳しい友人は、過去にはトップ 10 が間違いなくゲームアプリケーションだったことを知って...
最近、Forrester はクラウド コンピューティングに関するレポートを発表し、2020 年のクラ...
この記事はWeChatの公開アカウント「趙華兵」から転載したものです。この記事を転載する場合は、趙華...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますFaceb...
テンセントテクノロジーロイス11月8日総合レポート「サインインは終わった」という叫びは2012年も鳴...
ハードなプロモーションと比較すると、コンテンツマーケティングは人々に受け入れられやすく、ユーザーに認...
消費者は市場の主な消費者として、企業の発展の過去と未来を担っています。昨日の市場では、一部の消費者が...