キャッシュアバランシェ
ピーク時にシステムに毎秒7000のリクエストがあるとします。現時点では、このような高いリクエストに抵抗するためにキャッシュを使用しています。ただし、特定の時点で多数のキャッシュに障害が発生した場合、またはキャッシュサーバーがダウンした場合、これらの要求は通常のデータベース(MySQLなど)に直接作用します。このように大量のリクエストがあると、MySQLは間違いなくそれに耐えることができず、ハングします。データベースがハングすると、システムもハングします。
キャッシュアバランシェトリガーの条件を要約します。
「「」
高い同時実行性
キャッシュサーバーがダウンしています
多数のキャッシュの一元化された無効化
結果は次のとおりです。システムがクラッシュします。
解決策は、データベースへのアクセスをキューに入れる現在の制限を増やすことです。データベースが1秒あたり最大2000のリクエストに耐えられると仮定すると、データベースをリクエストするときは、1秒あたりのリクエストを2000以内に制御する必要があり、残りのリクエストはキューに入れられます。同時に、クラスターを使用して、キャッシュサーバーの高可用性を確保する必要があります。さらに、キーが同時に期限切れにならないように、キャッシュキーの有効期限をランダムに設定する必要もあります。
雪崩の解決
電流制限操作に関しては、Spring Cloud関連の電流制限プラグインを使用できます。ここでは、セマフォセマフォを使用して、より低い電流制限操作をシミュレートします。
ここでは、同時にアクセスできるリクエストは最大5つに制限されています。9つのリクエストが着信すると、5つのリクエストのみがアクセストークンを取得し、残りの4つのリクエストは外部で待機します。前のアクセスの終わりに、トークンが解放され、次の4つのリクエストがこれらのトークンをプリエンプトし、繰り返し実行されます。
ここでは、電流制限操作を実行します。
キャッシュの浸透
キャッシュに存在しないキーがあるとすると、ハッカーがこのキーを使用してシステムを攻撃する場合(1秒あたり7000回の攻撃など)、キャッシュは使用されません。攻撃要求はデータベースに直接ヒットします。 、およびデータベースはそれを保持できない必要があります。データベースがクラッシュすると同時に、システムもクラッシュします。
浸透する
私たちの解決策は、クエリを実行する前にターゲットデータが存在するかどうかを判断し、存在しないデータを無視することです。キャッシュとデータベースの前にトラフィックを傍受します。
浸透性ソリューション
上の図に示すように、フィルターを追加します。システムを起動する前に、ホットスポットデータをキャッシュにロードする必要があります。ホットスポットデータにアクセスするときに、フィルターによって1回判断されます。リクエストがに存在しない場合キャッシュ、それは直接戻ります。、データベースを通過しません。
フィルタブルームフィルタを使用できます。ブルームフィルタのサンプルコードは次のとおりです。
ブルームフィルターは主に、キーによって計算された値をハッシュアルゴリズムを介してビットマップに分散します。ビットマップは、ビットマップに0と1として存在します。
ビットマップ
ただし、上記のアルゴリズムには欠点があります。
「「ブルームフィルターは正確にフィルターをかけることができません。(ブルームフィルターは存在しないと判断し、100%存在しないと判断し、存在すると判断した場合は存在しない可能性があります。)理論的には、ハッシュ計算値が衝突します(異なるコンテンツハッシュが同じ値を計算します)。結果として存在しない要素は存在すると判断される場合があります
」
もちろん、ブルームフィルターはすべての要求をインターセプトする必要はなく、キャッシュの内訳を特定の量に制御するだけで済みます。
キャッシュの浸透に関しては、次のソリューションも使用できます。
「「キャッシュで取得できないデータはデータベースで取得されません。このとき、キーと値のペアをキーヌルとして書き込むこともでき、キャッシュの有効時間を短時間に設定することもできます。 30秒として。使用できません)。これにより、攻撃しているユーザーが同じIDブルートフォース攻撃を繰り返し使用するのを防ぐことができます。
」
ただし、上記のスキームには欠点があります。ハッカーは、存在しない複数のキーに短時間同時にアクセスし、データベースにもアクセスする可能性があるため、実際には、シーンに応じて最適化および変更する必要があります。
キャッシュアバランシェとキャッシュペネトレーションは、一般的に同時実行性の高い状況で発生します。また、インターネット企業への頻繁なインタビューの内容でもあります。この知識を習得して、あなたは新しい世界に入ったと思います。
過去におすすめ
QRコードをスキャンして、よりエキサイティングになります。または、WeChatでLvshen_9を検索すると、返信してバックグラウンドで情報を取得できます
回复"java" 获取java电子书;
回复"python"获取python电子书;
回复"算法"获取算法电子书;
回复"大数据"获取大数据电子书;
回复"spring"获取SpringBoot的学习视频。
回复"面试"获取一线大厂面试资料
回复"进阶之路"获取Java进阶之路的思维导图
回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)
回复"总结"获取Java后端面试经验总结PDF版
回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)
回复"并发导图"获取Java并发编程思维导图(xmind终极版)
もう1つ:[マイベネフィット]をクリックして、さらに驚きを持ってください。