2013-01-29 10 views
5

このシナリオを検討してください。 ワニスキャッシュにはMISSがあり、バックエンドサーバーは要求されたコンテンツを再生成しています。生成時間中に、2回目の要求が入り、MISSも取得されます。他のリクエストが保留されている間に、ワニスがこのリクエストをバックエンドに送信しますか?この間に千のリクエストが来たらどうなりますか?サーバーがクラッシュする可能性はありますか?すべての要求はそれを遅くするでしょう。MISSでのワニスの動作

このような問題を防ぐために、これらのシナリオを修正するのは正しいですか?

ありがとうございます!

答えて

1

ワニスはすべての要求をバックエンドに送信します。私。それは他の要求を待ち行列に入れず、1つのバックエンド要求を発行し、その応答をすべてに使用します。

しかし、Varnishにはgrace optionがあります。これにより、古いタイプの期限切れのコンテンツをキャッシュに保存しておくことができます。バックエンドが(backend pollingを参照)健康であるとMISSのリクエスト結果は、最初の要求がバックエンドに送信された場合今

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

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

は、たとえば、次のVCLを検討してください。同じコンテンツに対して別の要求が発生したが、キャッシュに年齢が< TTL + req.grace(この場合は5分)のアイテムがある場合、その要求には代わりに「古い」コンテンツが表示されます。これは、 MISSという結果になった最初のリクエストがバックエンドからの応答を取得するか、キャッシュが再び新鮮であるか、アイテムの経過時間がTTL + req.graceより大きくなるかぎり、発生します。

バックエンドがダウンしていた場合(req.backend.healthy == FALSE)、古くなったコンテンツは、年齢が< TTL + 24時間である限り提供されます。

Varnish bookSaving a requestのセクションをチェックして、より詳細な例と練習をすることもできます。

固定:アンエスケープ<文字。

固定より:私はKetolaの(受け入れ)答えが間違っていると信じて別のエスケープ文字< ...

+0

ありがとうgracetime-settingの詳細については、 – Pluto1010

+0

を参照してください。回答にエスケープされていない<文字があることがわかりました。今修正されました。以前はあまり意味がありませんでした。 =) – Ketola

+0

でも、ブラックアウトやクラッシュ後にキャッシュが空の場合に何が起こるのかという疑問があります。私たちのサイトは頻繁に訪問され、毎秒多くのリクエストが発生します。ニスが空のキャッシュを持っていれば私たちのWebサーバーを殺す可能性があると私は思っています。それはワニスが平等な要求を待って一度しか実行しないという私の希望がある理由です。それ以降は他の人がキャッシュから回答を得るでしょう。サーバーはホームページのような要求を1回だけ行います。 1000回並列ではありません。この問題に関するアイデアは何ですか? – Pluto1010

0

がありました。

同じURIのワニスに対する複数の要求は、になります。

次に、最初のリクエストの結果がキャッシュ可能かどうかによって異なります。そうであれば、他の(キューに入れられた)要求にも使用されます。 そうでない場合、キューに入れられた他のすべての要求はバックエンドに送信されます。

遅いAPIエンドポイントがキャッシュされ、キャッシュ可能(ワニスルールに関する)の場合、複数のリクエストはそのURIに対してバックエンドに1回だけヒットします。

0

@ max_iの回答にコメントや意見がありませんので、彼の代わりに別の回答を送信しています。

Ketolaの回答は完全に間違っているわけではありません。古くなった可能性があり、古いバージョンのVarnishにも当てはまる可能性があります。特にこの部分:

ワニスはすべての要求をバックエンドに送信します。私。それは他の要求を待ち行列に入れず、1つのバックエンド要求を発行し、その応答をすべてに使用します。

独立して自分自身をワニス4.1 LTSとApache 2.4の標準インストールを使用して、これをテストした後、私は次のように含まれる塩基性PHPファイル作成:次に

<?php sleep(5); echo 'hello world!'; 

は、HTTPリクエストのサイクルをテストするためにabを使用しました5つの並行処理で50の要求を使用します。その結果、ワニスはすべての単一の接続を受け入れていましたが、1つの要求がバックエンドに行われたのは、予想通り、解決に約5秒かかりました。各ワニス接続は、その後、応答を受信する前にその最小時間を待たなければならなかった。

もちろん、最初のものの後の要求はその後ろに「キュー」されていますが、これはバックエンドに一度に当たる50の要求すべてに比べてマイナーな懸念です(またはテストの場合、並行性は5です)。

関連する問題