現在、単一プロジェクト構造は基本的に残っておらず、分散クラスターやマイクロサービスがほとんどです。サーバーが複数あるため。資源共有の問題は避けられません。リソース共有であるため、同時実行の問題は避けられません。これらの問題に対して、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 をインストールするにはどうすればいいですか?
ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスいわゆるネガティブ情報と...
外部リンクは、SEO 最適化において比較的重要な要素です。昨年以来、Green Radish Alg...
ご存知のとおり、ウェブサイトの運用とメンテナンスの最適化は体系的なプロセスです。業界やウェブサイトの...
EIG による domain.com のクリスマス プロモーション: すべての仮想ホストが 50% ...
大手インターネット企業はクラウドサービスを立ち上げ、買収や登録を通じてクラウドドメイン名を取得しまし...
catalysthost の情報が hostcat に掲載されました: catalysthost-$...
近年、中国の越境電子商取引は急速な成長傾向を示しており、ブランド拡大は越境電子商取引の新たな転換点と...
長い間記事を書いていませんでした。最近とても忙しかったです。百度の頻繁な更新は、主要な草の根ウェブマ...
[[377410]] 2021年は新たな5年間の始まりであり、誰もが新たな窓と新たな機会を求めていま...
インターネット時代においては、電子商取引であれ、オフラインの実店舗であれ、トラフィックの考え方を持つ...
Pacificrack は現在、自社の米国 VPS (ロサンゼルス データ センター) を 20% ...
ブログを再開して以来、シャオ・イーさんは記事を書き、自分の気持ちを表現し、おそらくシンプルだがユニー...
食料は国民の第一のニーズであり、農産物や副産物の生産は国民の日常生活と密接に関係しています。中国は伝...
CrownCloud はオーストラリアで設立された VPS プロバイダーであり、1990 年から仮想...
サンクトペテルブルクはロシアで 2 番目に大きな都市です。Justhost はサンクトペテルブルクの...