5

次のシナリオを考えてみましょう: Varnish キャッシュに MISS があり、バックエンド サーバーが要求されたコンテンツを再生成しています。生成時間中に 2 番目の要求が着信し、これも MISS になります。ワニスは、他のリクエストが保留されている間にこのリクエストをバックエンドに送信しますか? この間に何千ものリクエストが来たらどうなるでしょうか。サーバーがクラッシュしますよね?すべてのリクエストは遅くなります。

これは正しいですか、それともワニスはこれらのシナリオを「同期」してそのような問題を防ぎますか?

前もって感謝します!

4

3 に答える 3

2

Varnish はすべてのリクエストをバックエンドに送信します。つまり、他のリクエストをキューに入れず、バックエンド リクエストを 1 つだけ発行し、そのレスポンスをすべてに使用します。

ただし、Varnish には猶予オプションがあり、このような状況で期限切れの古いコンテンツをキャッシュに保持できます。

たとえば、次の VCL を考えてみましょう。

sub vcl_recv {
  if (req.backend.healthy) {
    set req.grace = 5m;
  } else {
    set req.grace = 24h;
  }
}

sub vcl_fetch {
   set beresp.grace = 24h;
}

バックエンドが正常で (バックエンド ポーリングを参照)、リクエストの結果が であるMISS場合、最初のリクエストがバックエンドに送信されます。同じコンテンツに対する別のリクエストが来ても、キャッシュ内に経過時間 <TTL+req.grace (この場合は 5 分) のアイテムがある場合、そのリクエストは代わりに「古い」コンテンツを取得します。これは、最初のリクエストがMISSバックエンドからレスポンスを取得する (そしてキャッシュが再び新鮮になる) か、アイテムの経過時間が TTL+req.grace より大きくなる限り発生します。

バックエンドがダウンしている場合 (req.backend.healthy == FALSE)、age<TTL+24h である限り、古いコンテンツが提供されます。

より詳細な例と演習については、 Varnish ブックの「リクエストを保存する」セクションも参照してください。

修正済み:エスケープされていない < 文字。

さらに修正:別のエスケープされていない < 文字がありました...

于 2013-01-29T12:20:03.307 に答える