9.どのようにダブルバッファリングと書き込み、データベースの一貫性を確保するには?

著者:中国石シャン

インタビューの質問

そのダブルバッファリングと書き込みデータベースの整合性を確保するには?

心理学的分析インタビュアー

あなただけの、それはデータの整合性の問題を持っている必要があり、それはキャッシングやデータベースストレージダブルダブル書き込み、あなたは二重の限り、書き込みに関連している可能性がキャッシュを使用し、そしてどのように整合性の問題を解決するのですか?

フェイス質問解析

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

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

キャッシュ別にパターン

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

  • 読むには、先読みでないキャッシュ、キャッシュを、学校のデータベース、および、データ・キャッシュに取り出し、リターン応答を。
  • あなたは、データベースを更新し、キャッシュを削除したときに更新しました。

代わりに、キャッシュを更新するのはなぜ削除キャッシュ?

理由は単純で、何度も、より複雑なシナリオキャッシュにある、キャッシュを直接取り出したデータベースの値だけではありません。

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

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

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

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

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

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

Redisの-ジュニア、一貫性のありません

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

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

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

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

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

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

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

スレッドのワークキューが対応する、対応するシリアル動作を得るために、各ワーカースレッドは、いずれかが行われます。この場合、操作するデータの変更は、キャッシュを削除し、データベースを更新するために行くが、アップデートを完了しませんでした。読み取り要求が終わっキャッシュを読んでいない場合は、この時点では、最初のキャッシュは、キューを更新する要求を送信してもよいし、キューにあるバックログは、キャッシュの更新完全な同期を待つことになります。

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

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

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

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

  • 読み出し要求の長さをブロック

非常に穏やかな非同期の読み取り要求の結果として、そのタイムアウトを読み取る問題に注意を払うようにしてください、各読み取り要求はタイムアウト時間内に戻らなければなりません。

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

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

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

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

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

実際の概算で見てみましょう。

もし一つの第二の書き込み動作500時間をキューにすべての200msの動作100、メモリ20に書き込むために、5つに分割されている場合は、各メモリ・キューバックログ5は、書き込み動作かもしれません。通常は約20msの中で完成した各書き込み操作の性能試験、後に、各メモリのために最も確かに200msの中に返さしばらくハング、要求キューデータを読み込みます。

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

  • 同時読み取り要求が高すぎます

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

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

  • マルチサービス要求のルーティングインスタンスが展開され

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

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

  • 傾斜リクエストをリードし、ホット商品をルーティング

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

おすすめ

転載: www.cnblogs.com/morganlin/p/11980471.html