2017-12-20 16 views
1

ほとんどのCDNサーバーは頻繁にアクセスされるコンテンツにキャッシュを使用します。キャッシュ投入アイテムの並行性とスループット

シナリオ: が思う誰かがその写真をアクセスしようとする非常に傾向PICと同じ場所から多くのユーザー(1000)をアップロードすることができます。

質問: がx秒とサーバーがためにその間999より多くの要求を持って言うことができますウェブサーバは、それがキャッシュ要求を最初にチェックを受信し、それがそのPICのコンテンツミスを発見し、CDN.Ifプルからコンテンツを引っ張って取るとしましょう同じ内容。

サーバーはコンテンツをサーバーから999回も取得します(サーバーは引き続きデータを取得しており、キャッシュにデータはありません)とキャッシュを更新しますか?

このような状況を回避するために、どのようなスキームサーバーが実装されていない場合。

答えて

0

CDNへのリクエストが多すぎないように、サーバー側にロックを設定できます。

サーバは要求を受信:キーが存在する場合

  1. 作業スレッドチェックを。キーが存在する場合は、値を返します。
  2. キーが存在しない場合、つまりキャッシュミスの場合、動作中のスレッドはミューテックスをロックしようとします。
  3. ロックが成功すると、この作業スレッドはCDNからデータをフェッチし、キャッシュを更新し、ミューテックスをロック解除します。
  4. このスレッドがmutexのロックに失敗した場合、つまり、他のスレッドがCDNに要求を送信している場合、それはしばらくの間スリープします。 1秒後、手順1に進んでプロセス全体を再試行します。

サーバーが多数あり、キャッシュがこれらのサーバー間で共有されている場合(複数のプロセス)。分散ロックを使用することができます(例: Redis 'SETNX

手順3注意:サーバーが正常にロックされている場合は、ロックを解除する前にクラッシュします。他のサーバーは永遠に待機します。したがって、ロックの有効期限も設定する必要があります。