1 秒あたり 600 リクエストのピークがある場合、TTL の期限切れのために memcache がアイテムをフラッシュすると、かなり悪影響があります。ほぼ同時に、200 のスレッド/プロセスがキャッシュが空であることを検出し、DB 要求を起動してキャッシュを再びいっぱいにします。
これらの状況に対処するためのベストプラクティスは何ですか?
ps この状況を表す用語は何ですか? (トピックに関するより良いGoogleの結果を得る機会を与えてくれます)
多数のリクエストで必要になる memcached オブジェクトがある場合 (これが事実であることを暗示しています)、これらのオブジェクトを定期的に計算して更新する別のプロセスまたは cron ジョブを検討します。そうすれば、TTLになることはありません。これは一般的なトレードオフです。トラフィックが少ない時間帯に不必要な負荷を少し追加して、ピーク時の負荷を軽減します (おそらく最も重要な時間です)。
これは memcached の人々によって「stampeding herd」と呼ばれていることがわかりました。彼らはここでそれについて議論しています:
私の次の提案は、上記のリンクで説明したように、実際にはソフト キャッシュ制限を使用することでした。
有効期限を設定したためにオブジェクトが期限切れになり、日付を過ぎている場合は、有効期限を延長する以外にできることはありません。
古いデータが心配な場合は、考慮できるいくつかの手法があります。
キャッシュを、見ているデータの信頼できるソースにすることを検討し、それを最新に保つことを仕事とするスレッドを作成します。これにより、キャッシュの補充時に他のスレッドがブロックされるため、可能な場合にのみ意味があります。
データに TTL を設定するのではなく、データを更新するプロセスを変更してキャッシュを更新します。頻繁にデータを変更するために私が使用する手法の 1 つは、これを確率的に行うことです。つまり、データが書き込まれる時間の 10% で更新されます。DB クエリのコストが高く、古いデータの影響がどれほど深刻であるかに応じて、これを適切に調整できます。