シックス・一般的な並行性の高いキャッシュの問題、あなたは、いくつかを知っていますか?

序文

一般的な、現在のインターネットアプリケーションのウェブサイトやアプリで、我々はこの数字を使用することができ、全体のプロセスを開始するためのユーザの要求を表現するために示しています、このインタフェースは、アプリケーションに、ネットワークに転送、最も内側のブラウザやアプリですこのサービスは、最終的にストレージに、それは純粋にデータベース・ファイル・システムであってもよく、その後、インタフェースレンダリングコンテンツに戻ります。

v2-757a7301975f49fdf53a20f952de1e5a_b.jpg

インターネットの普及によって、コンテンツ情報や、より複雑な、ユーザーとトラフィックの数が増加し、我々はより多くの同時塗布量をサポートする必要があり、同時に、計算​​は我々のアプリケーションサーバとデータベースサーバがますますもある作らより多くの、しかし、我々のアプリケーション・サーバ・リソースへの傾向が限られており、技術変化の速度が遅いされている、彼らは毎秒要求を受信することができます制限され、書き込みやファイル限られています。

どのように限られた資源の有効利用が可能な限り最大のスループットを提供することができますか?効果的な方法は、キャッシュを導入する標準プロセスの姿を破って、それぞれのリンク要求はキャッシュから直接取得することができ、それによって効果的に応答速度を向上させるために、彼らの計算量を減らすこと、対象データに戻すされるように、限られた資源サービスより多くのユーザーは、我々は、それが実際にすべての面で1-4でキャッシュ発生する可能性がありますを示し、この図を使用したいです。

キャッシュ・コヒーレンシの問題

非常に高いデータ適時要件、データベースの一貫性のあるキャッシュデータを確保する必要がある、時およびデータキャッシュノードとコピーを確保する必要性が現象で一貫性の違いが現れることができないもあります。

これは、キャッシュの有効期限と更新ポリシーの詳細依存しています。変更がデータに発生した場合、一般的に、キャッシュ内のデータを更新したり、対応するキャッシュを削除するためのイニシアチブをとります。

V2-b0f017438bbff4a021184bcf5e6e1808_b.jpg

キャッシュの並行性の問題

キャッシュ後にもっともらしいプロセスであるバックエンドデータベースからデータを取得しようとする試みが満了します。しかし、並行性の高いシナリオの下で、バックエンドデータベースに大きな影響をもたらし、データベースからデータを取得するために、複数の同時要求があるかもしれない、とさえ「雪崩」現象につながります。

また、ときに更新されながら、キャッシュキー、だけでなく、一貫性の問題につながることができます得るために多数の要求であってもよいです。その後、同様の問題を回避する方法?

私たちは、キャッシュの更新または期限切れの場合には、まずあなたができる、唯一のを待つためにいくつかの時間を犠牲にする必要がある他の要求から取得したロックデータベースを解放し、ロックを取得しようとする、または更新が終了すると、「ロック」機構のような何かを考えますキャッシュから直接データを取得し続けます。

V2-dd7ec6329841388c010b7af9e0ed5b10_b.jpg

キャッシュ貫通質問

またとして知られているいくつかの場所では、キャッシュの浸透、「内訳。」理解を貫通キャッシュの多くの友人がある:キャッシュの障害やキャッシュの有効期限は、データベースに大きな影響を引き起こして、バックエンドデータベースサーバーへの浸透多数の要求につながったので。

这其实是一种误解。真正的缓存穿透应该是这样的:

在高并发场景下,如果某一个key被高并发访问,没有被命中,出于对容错性考虑,会尝试去从后端数据库中获取,从而导致了大量请求达到数据库,而当该key对应的数据本身就是空的情况下,这就导致数据库中并发的去执行了很多不必要的查询操作,从而导致巨大冲击和压力。

可以通过下面的几种常用方式来避免缓存传统问题:

1、缓存空对象

对查询结果为空的对象也进行缓存,如果是集合,可以缓存一个空的集合(非null),如果是缓存单个对象,可以通过字段标识来区分。这样避免请求穿透到后端数据库。

同时,也需要保证缓存数据的时效性。这种方式实现起来成本较低,比较适合命中不高,但可能被频繁更新的数据。

2、单独过滤处理

对所有可能对应数据为空的key进行统一的存放,并在请求前做拦截,这样避免请求穿透到后端数据库。这种方式实现起来相对复杂,比较适合命中不高,但是更新不频繁的数据。

v2-69ccf610270889c03bf5419f4a443559_b.jpg


缓存颠簸问题

缓存的颠簸问题,有些地方可能被成为“缓存抖动”,可以看做是一种比“雪崩”更轻微的故障,但是也会在一段时间内对系统造成冲击和性能影响。一般是由于缓存节点故障导致。业内推荐的做法是通过一致性Hash算法来解决。

欢迎大家关注我的公种浩【程序员追风】,文章都会在里面更新,整理的资料也会放在里面。

缓存的雪崩现象

缓存雪崩就是指由于缓存的原因,导致大量请求到达后端数据库,从而导致数据库崩溃,整个系统崩溃,发生灾难。

导致这种现象的原因有很多种,上面提到的“缓存并发”,“缓存穿透”,“缓存颠簸”等问题,其实都可能会导致缓存雪崩现象发生。这些问题也可能会被恶意攻ji者所利用。

还有一种情况,例如某个时间点内,系统预加载的缓存周期性集中失效了,也可能会导致雪崩。为了避免这种周期性失效,可以通过设置不同的过期时间,来错开缓存过期,从而避免缓存集中失效。

从应用架构角度,我们可以通过限流、降级、熔断等手段来降低影响,也可以通过多级缓存来避免这种灾难。

また、システムの開発プロセス全体の観点から、ストレステストを強化しなければならない、現実の世界のシナリオをシミュレートしようと、警戒するためには、できるだけ早く問題を露呈しました。

v2-7fdd56f44321653f57398b6b8206f2ba_b.jpg

キャッシュ底なし現象

Facebookの2010年の周りには、Facebookのスタッフが提起した問題は、memcachedのノードは3000まであり、Gキャッシュされたコンテンツの数千人。

彼らは、効率を低下させ、接続の頻度をmemcachedを---問題を発見したので、memcachedのノードを追加し、追加した後、接続の頻度の結果として問題を参照して、依然として存在し、として知られている、改善されていない「底なし現象」。

v2-b960a4b373c906aa68d35674264fd9b2_b.jpg

現在主流のデータベース、キャッシング、NOSQL、検索ミドルウェア・テクノロジー・スタック、「高性能、高並行性、高可用性、スケーラビリティ」およびその他の要件を満たすために、「スライス」テクノロジーをサポートしています。

いくつかは、いくつかのクライアント側の方法の値の範囲にマッピングされ、モジュロ(又は同一のハッシュ)ハッシュすることによって、例えばクライアント側で異なる値にマッピングされます。もちろん、いくつかは、サーバー側で実行されます。

しかし、すべての操作は、マルチインスタンス・ノードを完了するために別のノードと通信ネットワークを必要とするかもしれない、オーバーヘッドは、より高いパフォーマンスへの影響対大きいです。

メインは回避して、次の側面を最適化することができます。

1、データ配信モード

いくつかのビジネス・データは、ハッシュのために分散されてもよいし、分布の範囲に適したいくつかのビジネスは、これはある程度ネットワークIOのオーバーヘッドを回避することができます。

2、IOの最適化

同時接続の能力を強化するために、できるだけ多くの接続コストを削減するために、接続プーリング、NIOやその他の技術を利用することができます。

3、データ・アクセス

使い捨て得る大規模なデータセットは、あなたがより少ないデータネットワークIOコストの小さなセットを取得するために何回も獲得します。

もちろん、現象は、一般的なキャッシュ底なしではありません。あなたは、会社の大半に遭遇しない場合があります。


遂に

サポートのおかげで、ヨーヨーの記事を覚えて賞賛のポイントのように、みんなと共有へようこそ!


おすすめ

転載: blog.51cto.com/14442094/2435605