なぜこの記事を書くのですか? まず、キャッシュは、その高い同時実行性と高いパフォーマンスにより、プロジェクトで広く使用されてきました。キャッシュの読み取りに関しては、誰もが疑問を抱くことはなく、すべての業務操作は次の図のプロセスに従って実行されます。 しかし、キャッシュを更新する場合、データベースを更新した後、キャッシュを更新するか、キャッシュを削除するべきでしょうか?または、最初にキャッシュを削除してからデータベースを更新することもできます。実際、これについては多くの論争があります。現在、これらのソリューションを分析する包括的なブログはありません。そこでブロガーは、皆から批判されるリスクを冒して、恐る恐るこの記事を書いた。文章 まず説明させてください。理論的には、キャッシュの有効期限を設定することが最終的な一貫性を保証する解決策となります。このスキームでは、キャッシュに保存されたデータの有効期限を設定できます。すべての書き込み操作はデータベースに基づいており、キャッシュ操作は最善を尽くすだけで済みます。つまり、データベースへの書き込みは成功したがキャッシュの更新に失敗した場合、有効期限が切れている限り、後続の読み取り要求によってデータベースから新しい値が読み取られ、キャッシュが埋め戻されます。したがって、以下で説明するアイデアは、キャッシュの有効期限を設定することに依存しません。 ここでは、3 つの更新戦略について説明します。
最初にデータベースを更新し、次にキャッシュを更新します この計画は一般に皆から反対されている。なぜ?理由は2つあります。 理由1(スレッドの安全性の観点) リクエストAとリクエストBの両方が同時に更新されている場合、
これは、リクエスト A がリクエスト B よりも早くキャッシュを更新する必要があるが、ネットワーク上の理由により、B が A よりも早くキャッシュを更新することを意味します。これによりダーティ データが生成されるため、考慮されません。 理由2(ビジネスシナリオの観点) ポイントは2つあります。
まずキャッシュを削除し、次にデータベースを更新します この方式が矛盾を生じる理由は次のとおりです。同時に、更新操作のリクエスト A とクエリ操作のリクエスト B が存在します。すると、次のような状況が発生します。
中国語に翻訳された説明は
これにより、1 秒以内に作成されたキャッシュ ダーティ データを再度削除できるようになります。 では、この 1 秒はどのように決定され、どのくらいの時間眠るべきなのでしょうか? 上記の状況を考慮して、読者は自身のプロジェクトのデータ読み取りビジネス ロジックの時間消費を評価する必要があります。次に、データ読み取りのビジネス ロジックによって消費される時間に基づいて、データ書き込みのスリープ時間を数百ミリ秒増やすことができます。これを行う目的は、読み取り要求が完了し、書き込み要求によって読み取り要求によって発生したキャッシュ ダーティ データを削除できるようにすることです。 MySQL の読み取り/書き込み分離アーキテクチャを使用するとどうなるでしょうか? この場合、データの不整合の原因は次のとおりです。まだ 2 つのリクエストがあり、1 つは更新操作のリクエスト A で、もう 1 つはクエリ操作のリクエスト B です。
上記の状況がデータの不整合の原因です。二重削除遅延戦略を引き続き使用します。ただし、マスタースレーブ同期の遅延時間に基づいて、スリープ時間が変更され、数百ミリ秒が追加されます。 この同期除去戦略を採用したときにスループットが低下した場合はどうすればよいでしょうか? OK、では 2 番目の削除を非同期にします。スレッドを開始し、非同期的に削除します。この方法では、書き込み要求は戻る前に一定時間スリープする必要がありません。そうすることでスループットが向上します。 2 回目の削除が失敗した場合はどうなりますか? これは非常に良い質問です。なぜなら、2 回目の削除が失敗すると、次の状況が発生するからです。まだ 2 つのリクエストがあります。1 つは更新するリクエスト A 用、もう 1 つはクエリするリクエスト B 用です。便宜上、単一のデータベースを想定します。
はい、その通りです。 2 回目のキャッシュ削除に失敗すると、キャッシュとデータベースの不整合の問題が再び発生します。 どうすれば解決できるでしょうか? 具体的な解決策については、ブロガーによる第 3 回目の更新戦略の分析を参照してください。 まずデータベースを更新し、次にキャッシュを削除します まず、これについてお話しさせてください。外国人は「Cache-Aside パターン」と呼ばれるキャッシュ更新ルーチンを提案しました。それは指摘する
さらに、有名なソーシャル ネットワーキング サイト Facebook も、「Facebook での Memcache のスケーリング」という論文で、最初にデータベースを更新してからキャッシュを削除するという戦略を採用することを提案しました。 この場合、同時実行の問題はありませんか? いいえ。クエリ操作 A のリクエストと更新操作 B のリクエストの 2 つがあると仮定すると、次の状況が発生します。
はい、上記のような状況が発生すると、確かにダーティデータが発生します。 しかし、これが起こる可能性はどれくらいでしょうか? 上記の状況が発生するには、ステップ(3)のデータベース書き込み操作にかかる時間がステップ(2)のデータベース読み取り操作にかかる時間よりも短いという前提条件があり、これによりステップ(4)がステップ(5)に先行することが可能になります。しかし、考えてみてください。データベースの読み取り操作の速度は、書き込み操作の速度よりもはるかに高速です (そうでなければ、なぜ読み取りと書き込みを分離するのでしょうか? 読み取りと書き込みを分離する意味は、読み取り操作の方が高速で、消費するリソースが少ないためです)。したがって、ステップ(3)はステップ(2)よりも時間がかかりません。このような状況は起こりそうにありません。 ある人が議論を主張し、強迫性障害を患っていて、問題を解決しなければならないとします。私たちは何をすべきでしょうか? 上記の同時実行性の問題を解決するにはどうすればよいでしょうか? まず、キャッシュの有効期間を設定することが 1 つの解決策です。次に、戦略(2)で示した非同期遅延削除戦略を採用して、読み取り要求が完了した後に削除操作が実行されるようにします。 矛盾が生じる他の理由はありますか? はい、これはキャッシュ更新戦略 (2) とキャッシュ更新戦略 (3) の両方に存在する問題でもあります。キャッシュの削除に失敗した場合はどうなりますか?それは矛盾を生じさせませんか?たとえば、データの書き込み要求が行われ、データがデータベースに書き込まれても、キャッシュを削除できないため、不整合が発生します。これは、キャッシュ更新戦略(2)に残された最後の質問でもあります。 どうすれば解決できるでしょうか? 保証された再試行メカニズムを提供するだけです。ここに2つの解決策があります。 オプション1: 下の図に示すように プロセスは以下のとおりです
ただし、このソリューションには、ビジネス ライン コードへの大きな侵入を引き起こすという欠点があります。そこで、2番目の解決策があります。 2 番目のソリューションでは、サブスクリプション プログラムを起動してデータベースの binlog をサブスクライブし、操作する必要があるデータを取得します。アプリケーションで別のプログラムを起動して、サブスクリプション プログラムから情報を取得し、キャッシュを削除します。 オプション2: プロセスを次の図に示します。
注: 上記の binlog サブスクリプション プログラムには、MySQL の canal と呼ばれる既製のミドルウェアがあり、binlog ログのサブスクリプション機能を実行できます。 Oracle に関しては、現時点では既製のミドルウェアが利用可能かどうかはわかりません。さらに、再試行メカニズムとして、ブロガーはメッセージ キュー方式を使用します。一貫性の要件がそれほど高くない場合は、プログラム内で別のスレッドを直接開始し、時々再試行することができます。ご自身のアイデアを柔軟に活用できます。これは単なる提案です。 要約する この記事は、インターネット上の既存の一貫性ソリューションをまとめたものです。最初にキャッシュを削除してからデータベースを更新するという更新戦略に関しては、メモリ キューを維持するという提案もあります。ブロガーは見て、実装が非常に複雑で不必要だと感じたので、記事で紹介する必要はないと判断しました。 ***、皆さんがそこから何かを得られることを願っています。 |
<<: 【WOT2018】Li Mingyu: OpenStackクラウド上でビッグデータシステムを実行する際の難しさと方法
>>: TICのブロックチェーン技術、UCloudがブロックチェーンセキュリティアプリケーションの実装をリード
2018年に売上高500億元の賭けに失敗し、多くの株式を失ったにもかかわらず、今日頭条は確かに正式な...
ビジネス マネージャーが IT ディレクターにマルチクラウド ソリューションの実装を依頼した場合、そ...
年末の販促シーズンが近づくにつれ、消費者のショッピング意欲は高まり続けています。このシーズン中にいか...
[[419910]] 2020年以降、クラウドコンピューティングがトレンドになりました。ますます多く...
「Kubernetes ワークロード管理」では、主にステートレスアプリケーションの管理について紹介し...
1. Taobao のビジネスのほとんどは B2C によるものです。C2C モデルは死にました。Ta...
最近のユーザー検索ログでは、多くのユーザーが当社が設計したタグを使用せず、外部の検索エンジンを使用し...
fliphost.net は、2011 年に設立された小規模な VPS 販売業者です。この会社には ...
ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス2010 年に、Goog...
VMware は本日、VMware のサービスとテクノロジーを活用して優れたイノベーションと変革を達...
友人からよく「アプリを作ったんだけど、どうやって宣伝すればいいの?」とか「うちの会社がアプリを開発し...
今日、私の QQ グループの友人が私に、ここ ("http://www.hot-wow.c...
ダニエル・ブライアント企画 |ヤン・ジェンクラウドネイティブ開発の分野では、「DevOps は死んだ...
ネットワークマーケティングの真髄を知るインターネットマーケティングに対する理解は人それぞれです。さま...
二科と白象に続き、鳳華は淘宝のライブ放送室で人気を博しているもう一つの国産ブランドとなった。 5月1...