インタビュアー: あなたのシステムでは分散ロックをどのように実装していますか? 私:Redis 分散ロックを使用しました。具体的なアプローチとしては、バックエンドがリクエストを受信した後、分散ロックを追加します。ロックが成功すると、ビジネスが実行されます。ロックが失敗した場合は、ロックを待機するか、要求を拒否します。業務実行が完了するとロックが解除されます。 インタビュアー:具体的にどのようなコマンドが使われているのか教えていただけますか? 私: SETNX コマンドは次のように使用します。
設定が成功した場合は 1 が返されます。それ以外の場合は 0 が返されます。次の図に示すように、クライアント 1 はロックを正常にロックしましたが、クライアント 2 はロックを取得できませんでした。 インタビュアー:この設定に問題はありますか?正常にロックされたクライアントがクラッシュした場合はどうなりますか? 私:例えば、上の図のクライアント 1 がクラッシュした場合、ロックを解除することはできません。有効期限を設定できます。コマンドは次のとおりです。
インタビュアー:有効期限を設定した場合、業務が完了していないのにRedisロックの有効期限が切れてしまった場合はどうすればいいでしょうか? 私:鍵を交換しなければなりません。 インタビュアー:どのように機能するのか教えていただけますか? 私: ロックの設定に成功したら、ウォッチドッグを起動して、一定時間 (たとえば 10 秒) ごとに現在の分散ロックを更新します。つまり、現在のキーのタイムアウトを 10 秒ごとにリセットします。コマンドは次のとおりです。
全体のプロセスは次のとおりです。 インタビュアー: ウォッチドッグを実装するにはどうすればいいですか? 私: クライアントが正常にロックされると、スケジュールされたタスクが開始され、10 秒ごとに (できれば構成サポートを使用して) ビジネスが処理されたかどうかを確認できます。検出の基礎は、分散ロックのキーがまだ存在するかどうかを判断することです。そうであれば更新されます。 インタビュアー: 現在のスレッドが処理されている場合、このキーは別のクライアントによって書き込まれますか? 私: クライアントごとに clientID を指定し、VALUE に clientID プレフィックスを追加できます。このように、ロックを更新するときに、現在の分散ロックの値のプレフィックスを判断して、それが現在のクライアントに属しているかどうかを判断できます。一致する場合はロックを更新し、そうでない場合は何もしません。 インタビュアー:再ロック機能はご自身で実装されたのですか? 私:私たちはredissonの分散ロックソリューションを使用しています。 redisson を使用して分散ロックを取得するのは非常に簡単です。コードは次のとおりです。
具体的な原則は次のとおりです。クライアント 1 が正常にロックした場合、この分散ロックのデフォルトのタイムアウトは 30 秒です (Config.lockWatchdogTimeout を通じて変更できます)。ロックが正常に追加されると、ウォッチドッグが開始されます。ウォッチドッグは、クライアント 1 がまだロック キーを保持しているかどうかを 10 秒ごとにチェックするバックグラウンド スレッドです。そうであれば、ロックキーの寿命が延長されます。拡張操作は、ロック キーのタイムアウトを再度 30 秒に設定することです。 インタビュアー:redisson ではタイマーはどのように実装されていますか? 私: redisson タイマーは、netty-common パッケージの HashedWheelTime を使用して実装されています。 インタビュアー: クライアント1がクラッシュした場合、分散ロックは更新できますか? 私:分散ロックの更新はクライアント上で実行されるため、クライアント1がダウンすると更新スレッドが動作できなくなり、ロックを更新できなくなります。この時点で、分散ロックは削除され、他のクライアントが取得できるようにする必要があります。 インタビュアー: クライアント 1 がクラッシュした場合、他のクライアントはロックを取得するのに 30 秒待たなければなりません。ロックをすぐに削除する方法はありますか? 私: client1 がダウンしているため、タイムアウト期間後にロックが自動的に削除されるまで待つことしかできません。すぐに削除したい場合は、センチネルがすべての Redis クライアントのリストを維持できるようにセンチネル メカニズムを追加するなどの追加作業を行う必要があります。センチネルはクライアントがダウンしているかどうかを定期的に監視します。ダウンタイムが検出されると、クライアントのロックは直ちに削除されます。以下のように表示されます。 ここでのセンチネルは、Redis のセンチネルではなく、クライアントの障害を検出するためにビジネス システム自体によって作成されたセンチネルです。 インタビュアー:redisson を使用しない場合、分散ロック継続をどのように実装しますか?たとえば、springboot2.0 で使用されるデフォルトの Redis クライアントは Lettuce です。 私:Lettuce は redisson のようなウォッチドッグ メカニズムを提供していないため、ロックの更新はビジネス システム自体で実装する必要があります。これは次の手順で実現できます。 1. ロック コマンドについては、Spring パッケージ内の分散ロック コードを参照します。ロックが存在し、現在のクライアントによって追加された場合は、ロックを更新します。ロックが存在しない場合は、ロックを追加します。コードは次のとおりです。
2. ロックを HashMap などのデータ構造に保存します。スケジュールされたタスクは定期的にマップをスキャンし、各ロックを更新します。コードは次のとおりです。
3. 再ロックコマンド
4. 現在のクライアントによってロックが追加された場合はロックを更新し、そうでない場合は失敗します。 ロック継続コードを定期的に実行するスケジュールされたタスクを記述します。
インタビュアー:この質問はここまでにしましょう。次の質問に移りましょう... |
<<: Kafka の運用とメンテナンス |データ移行を本当に理解していますか?
検索エンジン最適化とは、大まかにまとめると、内部リンクと外部リンクに過ぎません。内部リンクは制御しや...
日本のVPSと日本のクラウドサーバーは中国本土に非常に近く、速度も速いです。同時に、日本のVPSは申...
デジタルアーカイブ管理システムの構築により、従来の閉鎖的なアーカイブ管理モデルを打破し、アーカイブ業...
外部リンクを構築する際には、品質と長期性を追求します。これらの要件を見ると、最初の反応はおそらく B...
[51CTO.com クイック翻訳] 今日、多くの企業が顧客向けの Web サイトやアプリケーション...
全文検索エンジン検索エンジンの分類のセクションでは、Web サイトから情報を抽出して Web ページ...
検索エンジンがウェブサイトの品質の基準として外部リンクの投票を使用するようになって以来、多くのウェブ...
より優れたインドネシアの VPS (インドネシア VPS) またはインドネシアのクラウド サーバー ...
画像を読む時代において、人々は記事の中心となるテーマを素早く明確に理解することを求めています。これは...
Ye Meng Chu Chen 氏の記事のタイトル「SEO 業界はいつまで存続するのか?」を見たら...
スタートアップチームの初期段階では、チャネルが未熟で、予算が不十分で、ユーザーが定着していない場合に...
一般的に、マルチクラウドに関する議論を推進する力は 2 つあります。組織が必要とするクラウド コンピ...
Microsoft は、Windows 365 を通じて、ますます多くの Windows 機能とコン...
検索エンジンは互いに学び合いながら改善していきます。例えば、マクドナルドやKFCの店長は、自分の店の...
月給5,000~50,000のこれらのプロジェクトはあなたの将来ですナビゲーションは、Web サイト...