Ограничьте время ожидания клиента лака, а не время ожидания - PullRequest
1 голос
/ 04 марта 2011

Я ищу решение, гарантирующее время отклика клиента лаком без ограничения времени отклика бэкэнда.

У меня есть около 100 различных ресурсов (http://host/resource.js?id=1 и т. Д.), Которые в среднем вычисляются в течение секунды на сервере. Ресурсы кэшируются лаком, поэтому каждый из них может обслуживаться одновременно многими клиентами. Ресурсы включены как синхронный (блокировка страницы) 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) будет временно приемлемым. Есть ли способ распределить запросы по времени? (Устаревшие данные предпочтительнее ошибок выше).

Спасибо, Ivor

1 Ответ

0 голосов
/ 14 марта 2011

Одним из самых простых решений было бы то, что не делайте свой бэкэнд общедоступным, пока вы не кэшируете некоторые из своих ресурсов (после перезапуска сервера установите некоторое время ожидания, например, 10 минут).

...