1

バックエンドの応答時間を制限することなく、ワニスでクライアントの応答時間を保証するソリューションを探しています。

バックエンドで平均して 1 秒以内に計算する約 100 の異なるリソース (http://host/resource.js?id=1 など) があります。リソースは varnish によってキャッシュされるため、各リソースを多数のクライアントに同時に提供できます。リソースは同期 (ページ ブロッキング) JavaScript として含まれているため、応答は高速 (たとえば 3 秒) で提供されます。クライアントの応答時間を保証したいので、バックエンドのタイムアウトをこの 3 秒に設定する以外に良い解決策は思いつきませんでした。vcl の例は次のようになります。

backend mybackend {
  .host = "127.0.0.1";
  .port = "8080";
  .connect_timeout = 100ms;
  .first_byte_timeout = 3s;
  .between_bytes_timeout = 3s;
  .probe = {
     .url = "/resource?id=1";
     .timeout = 3s;
     .window = 4;
     .threshold = 4;
     .interval = 15s;
   }
}

sub vcl_recv {
  set req.backend = mybackend;
  set req.grace = 5d;
  return (lookup);
}

sub vcl_fetch {
  set obj.ttl = 2m;
  set obj.grace = 5d;
  return (deliver);  
}

私の問題は次のとおりです。バックエンドを 5 分間停止して再起動した後 (ワニスが猶予期間内に古いデータを提供している間)、多くの異なるリソース (TTL を超えているが猶予内) がバックエンドで同時に取得されます。これはデータベースに大きな打撃を与え、3 秒以内に配信されるリソースはなく、何もキャッシュされません。

この問題を回避するにはどうすればよいですか? クライアントの応答時間を保証したいが、バックエンドの応答時間を制限したくない. 失敗 (ダミー JavaScript) は一時的に許容されます。リクエストを時間の経過とともに分散させる方法はありますか? (古いデータはエラーより優先されます)。

ありがとう、アイバー

4

1 に答える 1

0

最も簡単な解決策の 1 つは、リソースの一部をキャッシュするまで (サーバーの再起動後にタイムアウトを設定します。たとえば 10 分)、バックエンドを公開しないことです。

于 2011-03-13T22:22:01.337 に答える