現在、単一プロジェクト構造は基本的に残っておらず、分散クラスターやマイクロサービスがほとんどです。サーバーが複数あるため。資源共有の問題は避けられません。リソース共有であるため、同時実行の問題は避けられません。これらの問題に対して、Redis は分散ロックという優れたソリューションも提供します。この記事では、分散ロックがなぜ必要なのかというトピックについて主に説明します。 少し前に、グループ内の仲間が、分散ロックでほとんどの運用上の問題を解決できるのであれば、Java が提供するロックは何の役に立つのかと質問しました。分散ロックを直接使用したほうが良いのではないでしょうか?私はこの質問についてよく考え、最初は同様の答えがあるかどうかオンラインで調べました。それから私はそれについて考えました。この問題を解決するには、本質から分析する必要があります。 よし、車に乗って出発しよう。 1. はじめに これは分散ロックであるため、サーバーが 1 つだけではなく、複数存在する可能性があります。例を使って段階的に説明します。あるウェブサイトにフラッシュセール商品があり、まだ 100 個残っているとします。すると、陝西省、江蘇省、チベットなどの人々がこのイベントを見て、狂ったように買い始めるのです。このフラッシュセール商品の数量値が Redis データベースに保存されていると仮定します。 ただし、異なる地域のユーザーはフラッシュセールに異なるサーバーを使用します。これにより、クラスター アクセス メソッドが形成されます。 Redis を統合するために Springboot を使用します。 2. プロジェクトの準備 (1)POM依存関係を追加する
(2)属性設定を追加する
(3)新しい設定パッケージを作成し、RedisConfigクラスを作成する
(4)新しいコントローラーを作成し、Mycontrollerクラスを作成します。
非常にシンプルな統合チュートリアル。ポートは 8080 です。プロジェクトをコピーし、ポートを 8090 に変更し、負荷分散として nginx を使用してクラスターを構築します。これで環境が整理されました。以下の分析を始めましょう。 3. 分散ロックが必要なのはなぜですか? フェーズ1: ネイティブアプローチの採用 ポート 8080 にアクセスするために複数のスレッドを使用します。ロックがないため、この時点で同時実行の問題が確実に発生します。したがって、この商品は共有リソースであり、複数のスレッドによってアクセスされるため、Java のさまざまなロックをすぐに思い浮かべることができますが、その中で最も有名なのは synchronized です。したがって、上記のコードを最適化したほうがよいでしょう。 フェーズ2: 同期ロックの使用 この時点でコードを変更します。
ご覧のとおり、現在、 synchronized キーワードを使用してロックを追加しているため、複数のスレッドが同時にアクセスするときにデータの不整合やその他の問題が発生しません。このアプローチは、単体構造では確かに役立ちます。現在、単一の構造を持つプロジェクトは非常に少なく、大部分はクラスター化されています。この時点で同期は機能しなくなります。なぜ同期が機能しないのですか? フラッシュセール製品にアクセスするためにクラスター アプローチを使用します (nginx が負荷分散を行います)。データの不一致が表示されます。つまり、 synchronized キーワードのスコープは実際にはプロセスであり、このプロセスの下のすべてのスレッドをロックできます。ただし、マルチプロセスは不可能です。フラッシュセール商品の場合、この値は固定です。ただし、各地域にサーバーが存在する可能性があります。このように、異なる地域のサーバーは異なり、アドレスも異なり、プロセスも異なります。したがって、同期ではデータの一貫性を保証することはできません。 フェーズ3: 分散ロック 上記の synchronized キーワードでは、複数のプロセスのロック メカニズムを保証することはできません。この問題を解決するには、Redis 分散ロックを使用できます。では、コードをもう一度変更してみましょう。
とても簡単です。文章を追加して判断するだけです。実際、setIfAbsent メソッドの機能は、redis の setnx と同じです。つまり、現在のキーがすでに存在する場合、操作は実行されず、false が返されます。現在のキーが存在しない場合は、操作できます。最後に、他のユーザーがインスタント キル操作を実行できるように、このキーを放すことを忘れないでください。 もちろん、これは単なる基本的な例です。実際、分散ロックを実装するには多くの手順があり、多くの落とし穴が指摘されていません。いくつか解決してみましょう: フェーズ4: 分散ロックの最適化 (1)第一の落とし穴:フラッシュセール商品では例外が発生し、分散ロックが解除できない
この時点では、try ステートメントと finally ステートメントを追加するだけです。ロックは最終的には削除する必要があります。 (2)2つ目の落とし穴:フラッシュセールに時間がかかり、他のユーザーが待てない
これに有効期限を追加します。つまり、10 ミリ秒以内にフラッシュ セールが成功しない場合は、フラッシュ セールが失敗したことを意味し、次のユーザーが置き換えられます。 (3)3番目の落とし穴:同時実行性の高いシナリオでは、フラッシュセールが長くなりすぎてロックが永久に無効になる 先ほど設定したロックの有効期限は 10 ミリ秒です。ユーザーのフラッシュセール時間が 15 ミリ秒の場合、そのユーザーがフラッシュセールに成功する前に他のユーザーが参加する可能性があることを意味します。このような状況が頻繁に発生すると、製品の購入に成功するまでに多数のユーザーが流入する可能性があります。他のユーザーが事前にロックを解除したが、現在のユーザーはまだフラッシュセールに成功していない可能性があります。これは最終的にデータの不整合につながります。解決方法をご覧ください:
つまり、ロックを削除するときに、それが現在のスレッドであるかどうかを判断します。そうであれば削除します。そうでない場合は削除しません。こうすることで、他のスレッドが侵入しても、ロックがランダムに削除され、混乱が生じることはありません。 さて、ここまでは分散ロックの理由について基本的に紹介しました。 Redisson は分散ロックにおいて素晴らしい仕事をしました。次の記事でも、Redisson に焦点を当てて、分散の実装方法とその背後にある原則を紹介します。 この記事はWeChat公式アカウント「Yugong Yaoyishan」から転載したものです。下のQRコードからフォローできます。この記事を転載する場合は、Yugongyaoyishanの公式アカウントまでご連絡ください。 |
<<: 企業はどのようにしてクラウド移行を段階的に進めることができるのでしょうか?
>>: Ubuntu Server に Docker なしで Kubernetes をインストールするにはどうすればいいですか?
中国の商社A400 Interconnectは現在、米国西海岸ロサンゼルスの3つのネットワークのAS...
この間、ウェブマスター界隈では「共通参照」が「アンカーテキスト」に取って代わるという話が出てきており...
cloudcone は、ロサンゼルス DC1 データセンター、KVM 仮想化、エンタープライズ レベ...
[51CTO.comからのオリジナル記事] クラウドコンピューティング、ビッグデータ、モノのインター...
[[409707]]序文分散ロックに加えて、Redisson は追加の同期コンポーネントである Se...
SEO キャリアから何が得られるかを事前に考えておくのがベストです。 SEO をキャリアとして選択す...
みなさんこんにちは。私はNezhaです。数日前、私の友人が面接に行き、Kafka トランザクションに...
誰かが私に、6G メモリを搭載した vpsdime の VPS は信頼できるかどうか尋ねました。この...
新快報によると、深セン在住の姚さんは、アップルのiPhoneにはプリインストールされたソフトウェアを...
豆板創始者阿倍氏(右) Doubanの創設者Abeiは、Geek Park Innovation C...
携帯アプリを開いたとき、携帯を軽く振ると広告ページや関連アプリが表示されるという状況に遭遇したことは...
月給5,000~50,000のこれらのプロジェクトはあなたの将来です通常、ユーザーがタオバオのパスワ...
今年1月に終了したダボス会議の世界経済フォーラム2024年年次総会では、 「生成型人工知能:第4次産...
入札操作は自慢ではなく、あなた自身の実践経験に依存します。春節前にA5に「ウェブマスターが損をする4...
SDN は、従来の IP ネットワークに大きな変化をもたらします。これは、3 つの側面で IP ネッ...