内側の質問:どのように、二重書き込みバッファの一貫性を確保するためには、データベースAPI広西チワン族自治区の公式サイトにはとても満足しているのですか?

限りキャッシュとして、それはキャッシュAPIおよびデータベースストレージダブルダブル書き込み広西チワン族自治区の幸せ非常にvip7.maltapi.comの公式ウェブサイトに関連している可能性があり、限り、あなたがそうであるように、二重書き込みデータの一貫性は確かに問題がありますので、どのように整合性の問題を解決するのです?

フェイス質問解析

キャッシュは、お使いのシステムが厳しく要求されていない場合は、「キャッシュ+データベースは、」一致していなければならないことを意味データベース、とわずか時折矛盾を許可することができれば一般的には、それはつまり、このプログラムを行うことが最善ではありません:読み取り要求メモリキューに文字列をシリアライズ書き込み要求が行きます。

直列化は矛盾が発生しないことが保証されますが、また、要求をサポートするために、マシンの通常のラインよりも数倍で、システムスループットの大幅な削減につながります。

キャッシュ別にパターン

最も古典的なデータベースの読み取りおよび書き込みキャッシュ+モード以外にもパターンのキャッシュです。

先読みキャッシュ、キャッシュではない、学校のデータベース、および、データ・キャッシュに取り出し、応答を返し、お読みください。

あなたは、データベースを更新し、キャッシュを削除したときに更新しました。

なぜキャッシュを削除し、代わりにキャッシュを更新しますか?

その理由は、より複雑なシナリオのキャッシュに、キャッシュは直接取り出したデータベースの値だけではない、シンプルな、何回もあります。

例えば、フィールドがテーブルは、対応するキャッシュを更新することができる、他の2つは、キャッシュの新しい値を計算するために、データ・テーブルと操作を照会する必要があります。

また、キャッシュを更新するコストは、時には非常に高いです。それはあなたがデータベースを変更するたびに、対応するキャッシュの更新を持つようにしてくださいと言っているわけではありませんか?たぶん、このようないくつかのシーンは、より複雑なキャッシュ・データ・コンピューティングのシナリオのために、それはそうではありません。あなたが頻繁にキャッシュに関わる複数のテーブルを変更した場合、キャッシュが頻繁に更新されます。しかし、問題は最終的にキャッシュが頻繁にアクセスされないことがありますか?

しかし、1分でキャッシュのみ1回読み込まれ、栗の場合は、キャッシュテーブルのフィールドは、変更1分で20倍、または100倍、キャッシュが更新さ20倍、100倍の関与します、コールドデータの数が多いです。あなたはちょうどその1分で、キャッシュを削除しますが、キャッシュは一度だけ再計算されます場合は、コストが大幅に削減され、実際には、キャッシュはキャッシュをカウントするために使用されました。

実際には、常にそれが使用されていないかどうか、複雑な計算を再実行しない、代わりに怠惰な思考によって算出されたキャッシュの更新、キャッシュを削除しますが、それは、再計算を使用する必要があります。MyBatisのと同じように、休止状態、遅延ロードの考えを持っています。1000年スタッフがデータ内にある部門、スタッフのリストを持つ部門、各クエリの各部門を言うする必要はありませんが、照会もああチェックしてください。例の80%は、調査部門は、ちょうどその上に、この分野での情報にアクセスすることができます。まず、あなたは従業員の内部にアクセスすると同時に、部署を確認するので、あなたはスタッフの内部にアクセスする場合にのみ、この時間は、データベースクエリ従業員1000人の内側に移動します。

ほとんどの一次キャッシュ矛盾の問題と解決策

質問:最初にデータベースを変更して、キャッシュを削除します。あなたはキャッシュが失敗した削除した場合、データベースは新しいデータにつながる、キャッシュが古いデータで、矛盾がありました。

解決策:キャッシュを削除し、データベースを変更します。データベースの変更が失敗した場合、データベースは古いデータで、キャッシュが空である場合、データは矛盾するものではありません。キャッシュが読み込まれていない場合ので、その後、データベース内の古いデータを読み、[キャッシュを更新。

データの不整合のより複雑な分析

データが最初にキャッシュを削除、変更して、データベースを変更するために行くしている、それは変更されません。キャッシュを読んで、以上の要求は、キャッシュがデータベースを照会するために、空の発見された、キャッシュに、変更前の古いデータを見つけました。後続のデータ変更プログラムは、データベースの変更が終了しました。

以上、データベースのキャッシュデータとは同じではありません。

なぜ高い同時実行のシナリオでのトラフィックの何百万人があり、キャッシュは、この問題が表示されますか?

同時のデータは読み取りと書き込みのときにのみ、あなたはこの問題に直面する可能性があります。あなたは同時実行の言葉が特に10,000日あたりの低同時読み取りアクセスでは、非常に低いと言えば実際には、その後、いくつかのケースでは、今説明したシーンの種類と矛盾が存在します。毎日がトラフィックの何百万人である場合しかし、問題は、同時の数万人は、それが+データベースキャッシュの矛盾を超えるかもしれ限りのデータを更新するための要求があるとして毎秒、毎秒読み込み、、です。

次のように解決策は以下のとおりです。

データを更新すると、固有の識別データに基づいて、運転ルートの後に、JVMの内部キューを送信します。データの読み出し時に、データがキャッシュ内に見つからない場合、キャッシュ+操作を更新するために、再度データを読み込み、ルートに従い、一意に識別した後、また同じJVM内部キューを送信します。

ワークキューは、1つが実行され、対応するシリアル動作を得るために、スレッドを各ワーカースレッドに対応します。この場合、動作データの変更は、キャッシュを削除し、データベースを更新するために行くが、アップデートを完了しませんでした。このとき、読み取り要求が終わるとキャッシュを空読み、キャッシュの更新が最初のキューに要求を送信できる場合、この時間は、キューに保持され、キャッシュの同期の更新が完了するのを待ち。

最適化のポイントは、キューが、実際には、一緒に張らつ以上のキャッシュ更新要求を使用すると、フィルタリングを行うことができますので、キューがキャッシュを更新するための要求を持っていることが判明している場合、、意味がありません。その後、要求は再び生きて来た更新されませんがあります操作を行って、要求を待っている目の前で直接更新操作を完了することができます。

アクションを実行するための意志で1つのオペレーションのデータベース・スレッドを修正するために行われるべき仕事を、対応するそのキューの後、それは、キャッシュの更新操作では、データベースから最新の値を読み込み、書き込みキャッシュ。

リクエストが見つかった値を取ることができ、ポーリングを継続するために、時間範囲を待っている場合は、直接返し、待機時間が時間要求の一定の長さを超えている場合、この時間は、現在の古い値は、データベースから直接読み取ります。

高い同時実行のシナリオの下では、解決策は、問題に注意を払うことです。

1、ブロック読み出し要求の長さ

非常に穏やかな非同期の読み取り要求の結果として、そのタイムアウトを読み取る問題に注意を払うようにしてください、それぞれがタイムアウト時間内に返さなければならないリクエストをお読みください。

ソリューション、最大のリスクは、その時点で、データは内部に大きなバックログキューの更新操作で、その結果、非常に頻繁に更新することができると言い、その後、読み出し要求は、多数の要求につながる、タイムアウト発生の多くになり、データベースに直接アクセスしてください。常にいくつかのシミュレートされた実際のテストまでは、更新データのどの周波数を表示します。

また、キューので、それが故に複数のデータ項目のバックログ、独自のビジネス状況に応じてテストの必要性を更新することが、あなたはそれぞれが更新データの一部を共有し、複数のサービスを展開する必要があるかもしれません。メモリキューが実際に完了するために、10ms毎に過ごすために、在庫の変更操作を100の商品在庫の変更操作を圧迫する場合は、最後に読み出し要求グッズ、データを取得するには、10×100 = 1000ミリ秒= 1秒を待つこと、長いブロックにつながる今回はリクエストをお読みください。

それは忙しい時間を確認するために、ストレステスト、およびシミュレートされたオンライン環境の一部を実行するために、業務システムの実際の動作に応じて行わなければならない、メモリキューが更新操作を絞ることがどれだけ、対応する最後の更新操作をもたらすことができます読み出し要求を、読み出し要求は、それが最も忙しい時期であったとしても、あなたが計算した後ならば、200ミリ秒で10アップデートのバックログを返すためにならば、それは200msのまで待って、多くの時間をハングアップしますが、それも可能です。

可能なメモリキューバックログ更新の特に大規模な数が、その後、あなたがそのサービスインスタンスは、各マシンの処理より少ないデータに展開して、マシンを追加する必要がある場合は、各メモリキューバックログの更新操作が少なくなります。

実際には、プロジェクト以前の経験によると、一般的には、実際には更新操作は小さくすべきキューのバックログに、正常ですので、周波数データは、非常に低い書き込み。このような非常に同時読み取りのために、プロジェクトのキャッシュ・アーキテクチャを読んで、書き込み要求を、一般的に非常に小さく、毎秒QPSエネルギーかなり良い数百。

実際の概算

時間は5個に分割された場合に一つの第二の書き込み動作500は、キュー内のすべての200msの操作100、メモリ20に書き込むようにした場合、各メモリ・キューバックログ5は、書き込み動作かもしれません。各書き込み操作のパフォーマンステストの後、通常は、各メモリ読み出し要求キューデータのために、ほとんどは確かに200msの中に返され、しばらくの間、ハング、およそ20msの中で完成。

ただ単純に計算した後、我々は数百のシングルライトQPSのサポートは問題ありませんことを知って、あなたはQPSを書いた場合、マシンの拡大、膨張機10回、各マシン20個のキュー、その後、10倍に拡大しました。

2、読み取り要求が高すぎる同時実行であります

ここで我々はまた、ストレステストは、それが上記のような状況に遭遇してしまったときに、数十ミリ秒で読み取り要求の突然の大多数は、ライブ、必要性を運ぶことができるサービスを参照して、サービスにハングアップ遅延というリスクがあることを確認するために行う必要がありますどのように多くのマシンカン朱は最大限界状況をピークすることができます。

すべてのデータが同時に更新されていない、キャッシュが同時に、データが失敗したキャッシュされるので、すべての可能な少数派を失敗することはありませんので、しかし、その後、以上の読み取り要求に対応するこれらのデータは、同時実行は特にすべきではありません大規模な。

3、マルチサービス要求のルーティングインスタンス展開

このサービスでは、データ更新の実装だけでなく、キャッシュ更新操作は、すべて同じサービスインスタンスにnginxのサーバールートを実行するために要求することを確認する必要があり、複数のインスタンスに配備することができます。

たとえば、同じ商品の読み出し要求のために、同じマシンのすべてにルーティングされます。リクエストパラメータのハッシュに基づいて、独自のルートを行うことができ、あなたはまた、サービス間などのルーティング機能のハッシュnginxのを、使用することができます。

傾斜した要求をもたらす4、ホット商品ルーティング問題

商品の場合、読み取りおよび書き込み要求はすべて、圧力は機械が大きすぎる可能性がありどこへ行くか、同じマシン内の同じキューを打つ、特に高いです。更新頻度が高すぎない場合は更新された製品データの唯一の時間は、キャッシュを空になり、その後、同時読み取りにつながると書きますので、それが、あるので、彼らが実際のビジネス・システムに基づいて参照しようとしている、この問題の影響は、特に大規模ではありませんしかし、マシンの負荷の一部が高くなることを実際に可能。

ます。https://www.cnblogs.com/zhiyun/p/11038602.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_33826268/article/details/93438608