現在、単一プロジェクト構造は基本的に残っておらず、分散クラスターやマイクロサービスがほとんどです。サーバーが複数あるため。資源共有の問題は避けられません。リソース共有であるため、同時実行の問題は避けられません。これらの問題に対して、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 をインストールするにはどうすればいいですか?
Liziqiは「消去」されています。 7月14日、李子奇は主要プラットフォームでビデオ「米、油、塩、...
【TechWeb Report】7月22日、Taobaoは偽造品販売に関する最新の管理規則を発表した...
自分のウェブサイトが含まれていない場合はどうすればいいですか? 重みが足りない場合は、フレンドリーリ...
Alpharacks は、DDOS 保護、OpenVZ ベースの VPS、サーバー レンタルを提供す...
[[319472]]分散アーキテクチャは近年最もホットなトピックかもしれません。この記事では、集中型...
ポストトラフィック時代では、モバイルインターネットと消費者インターネットの配当は消え、コンテンツ電子...
クラウド テクノロジーが IT 業界を席巻している今日、クラウド コンピューティングの出現後に会社が...
少し前に読んだレポートでは、その概要はさまざまな業界におけるクラウド コンピューティングの適用に関す...
vpsdatabaseは2017年5月に設立され、競争力のあるVPS製品を提供しています。販売中の2...
Hostyunは最近、香港のクラウドデータセンターに「[Hong Kong AMD-Puhui]」と...
SEO 担当者は、ウェブサイトに最適化されたキーワードがキーワード検索ランキングで上位に表示されるよ...
マイクロソフトのインスタント メッセージング ソフトウェア Windows Live Messeng...
gigsgigscloud は本日、香港データセンターで Windows VPS を正式に開始しまし...
2 月 16 日に、「SEM の医療 PPC の、少ない労力で機能する高コンバージョン ランディング...
陳念が以前書いた「ソーシャル ネットワーキング プラットフォームと SEO が出会うとき」という記事...