ホームページ  >  記事  >  Java  >  Java MQ メッセージキューの基本的な知識は何ですか?

Java MQ メッセージキューの基本的な知識は何ですか?

王林
王林転載
2023-04-21 23:16:071135ブラウズ

キャッシュ雪崩

まず、この通常のキャッシュ プロセスがどのようなものかを見てみましょう。以下の図に示すように:

java mq消息队列的知识点有哪些

最初にユーザーがこの何かにアクセスし、次にこの何かが Redis にアクセスすることがわかります。Redis にアクセス データがある場合、Redis は直接アクセスします。キャッシュから取得したデータを返します。データが Redis キャッシュに見つからない場合は、MySql データベースでクエリが実行されます。結果があれば、MySql で見つかったデータが Redis キャッシュに同期され、クエリが実行されます。結果が返されます。

これは単純な通常のキャッシュ プロセスです。それでは、この通常のキャッシュ プロセスに基づいてキャッシュ アバランシェがどのようなものであるかを見てみましょう。

まず、例をあげますと、ダブルイレブンの期間中、東洞で何かを買うとき、そのホームページに入りますが、ダブルイレブンなので、ホームページへのアクセス数が非常に多く、そのため、ホームページには大量のデータが Redis にキャッシュされます。

ホームページ データが Redis の 100 キーに保存され、キャッシュの有効期限が 2 時間に設定されているとします。ダブル イレブン期間中、2 時間以上買い物をした後、ホームページ データの Redis キャッシュはすべてが瞬時に失敗し、すべてのリクエストが MySql データベースにヒットします。このとき、データベースへのアクセス圧力が増大し、MySql データベースが時間内に応答できずにハングアップします。その結果、ドンドンのホームページは外部サービスの提供を続けることができなくなり、ドン兄弟は非常に不満になり、今回の担当技術者をアフリカに派遣しました。

それでは、この例を通して、次の図を見てみましょう:

java mq消息队列的知识点有哪些

つまり、ユーザーが何かにアクセスすると、大量のキーが表示されます。 redis が無効なため、この Dong がデータベースに直接アクセスし、データベースに大量のリクエストが送信されるこの現象が Cache Avalanche です。簡単に言うと、まさに雪崩が起きているかのように、大量のredisキャッシュが同時に無効化されてしまうのです。

それでは、雪崩のキャッシュに対する解決策は何でしょうか?

  • # このキャッシュの有効期限を設定して、多数のキーが同時に無効になるのを防ぎます。キャッシュでは、キーの有効期限を設定できます。時間は に分散されます。

  • 通常、Redis はクラスター内にデプロイされます。これらのホット スポットのキーが異なる Redis ノードに均等に分散されるように、これらのホット スポットのキーを異なるノードに配置できます。 。 優れた###。

  • さらに乱暴な方法もあります。これは、キャッシュの有効期限を設定せず、キーが期限切れにならないようにするというものです。

キャッシュペネトレーション

次に、キャッシュペネトレーションとは何かを紹介します。

例を挙げてみましょう: たとえば、ある老人が Web サイトを開発し、その Web サイトが非常に人気になりました。ある日突然、その Web サイトがハッカーによって狂ったように攻撃されました。彼の攻撃方法は、このキャッシュ トンネルを使用したものでした。 . 透明性の原則。

通常、データベースの主キーは 0 から増加し、負の数は存在しないことは誰もが知っているため、このハッカーはこれを利用し、0 未満の ID を持つパラメーターを含むリクエストを送信し続けました。この男は最初に Web サイトのすべてのデータを Redis キャッシュに入れましたが、ハッカーは 0 未満の ID を持つ番号を使用してそれをリクエストしました。Redis キャッシュには 0 未満の ID を持つデータがないため、Redis は見つけることができませんその結果、redis が結果を見つけることができないと、データベース内でその結果をチェックし、その後、すべてのリクエストがデータベースにヒットし、redis キャッシュ レイヤーがそのようなデータをインターセプトできないため、常にデータベースにヒットします。全て。

Redis キャッシュにはこの種のデータが直接侵入し、データベースに直接侵入します。同様に、次の図を見てみましょう:

java mq消息队列的知识点有哪些

まず、悪意のあるユーザーが何かにアクセスし、id=-1 のデータを要求し、次に id=-1 のデータを要求します。 Redis キャッシュで見つからなかった場合は、データベースにアクセスしてクエリを実行しましたが、データが見つからなかったため、フロントエンドには空のデータしか返せませんでした。

この悪意のあるユーザー (ハッカー) は、スクリプトを使用してこのデータをリクエストに継続的に送信し、redis に直接侵入してデータベースにアクセスします。これは、いわゆる

キャッシュ侵入です。キャッシュペネトレーションとは、簡単に言うと、キャッシュやデータベースにそのようなデータが存在しない状態を指し、一般的には通常のユーザーはアクセスしない状態です。

したがって、キャッシュ侵入の解決策は次のとおりです。

  • リクエストが Redis を通過してデータベースに直接送信される場合、どのような結果が見つかっても問題はありません。データベース内のリクエストは Redis キャッシュに書き戻されるため、次回同じパラメータでリクエストが送信されると、そのリクエストは Redis キャッシュによって直接インターセプトされ、データベース にヒットされません。

  • 要求されたパラメータの有効性を確認してください

  • より直接的で単純かつ粗雑な方法は、この IP をブラックリストに登録することです。

  • 最後に、ブルーム フィルターを使用します。これは非常に良い方法です。

キャッシュの内訳

最後の問題であるキャッシュの内訳について話しましょう。

ダブル イレブンを例に挙げてみましょう。ダブル イレブンの期間中、ドン兄弟は大きなイベントを開催したいと発表し、20 年前に使用していたコンピューターをオークションに出品したいと言いました。私はこのコンピュータに興味があったので、Dong Ge さんは Double eleven の 9 時にそのコンピュータをオークションに出すことにしました。その後、Dong 氏の開発プログラマーはコンピュータのデータを Redis キャッシュに置きました。Redis キャッシュは Redis キャッシュのキーに対応します。

オークション中、誰もが非常に熱心でした。オークションは 3 時間近く続きました。オンライン オークションはまだ終了していませんが、このコンピューターに対応する Redis キャッシュ キーの有効期限は 3 日半です。 。 時間。全員が 3 時間半オークションを行っていたとき、このコンピューターのキャッシュ キーが突然無効になり、その結果、大量のオークション リクエストが Redis 内のデータを見つけることができず、これらの大量のリクエストが直接アクセスされました。このとき、データベースの瞬間的な圧力が増加し、システムの応答が間に合わずハングアップします。
このとき、ドン兄弟は自分のコンピュータがまだオークションに出品されていないのを見て少し怒ったため、プログラマーをアフリカに送りました。

同様に、次の図を見てみましょう:

java mq消息队列的知识点有哪些

#ユーザーは特定の Web サイトにアクセスし、Redis にアクセスしてオークションのフラッシュ セール商品をリクエストします。キャッシュに無効化はありません。現時点では、redis はクエリされたキャッシュ キーの結果を返すことができますが、キャッシュ キーが無効になると、リクエストは redis を通過してデータベースに直接ヒットします。

ここで皆さんが注意すべき点は、これが特定のホットスポットのキーであるということです。 このホットスポットのキーには、多数のユーザー リクエストがアクセスし続けています。このホットスポットのキーが突然故障した場合、すべてのリクエストはブロックされます。データベースにとって、このプロセスは キャッシュ ブレークダウン と呼ばれます。 これが非常にホットなスポットに侵入するための鍵であることを忘れないでください。 このキャッシュの故障に対する解決策は次のとおりです。

  • このホットスポット キーを期限切れにしないようにします。つまり、有効期限を設定しません (推奨されません)。

  • 分散ロックを使用します。単一アプリケーションの場合は、ミューテックス ロックを使用します (分散ロックについては後続の記事で説明します)

以上がJava MQ メッセージキューの基本的な知識は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。