2011-05-23 3 views
3

Я новичок в лаке, и я хотел знать, поддерживает ли лак кэширование с http-заголовком. Мы разработали базовый веб-сервис Rest, и я думаю об использовании Varnish для кэширования результатов. Как-то часть информации запроса (apikey) передается через HTTP-заголовок, и я хотел знать, может ли мы, Varnish, принять это во внимание при проверке входящего запроса (vs строка запроса).лак и заголовок http

ответ

10

Да, вы можете. Как следует учитывать этот ключ API? Если вам нужны уникальные записи кэша для каждого пользователя, кеш используется, только если конкретный пользователь запрашивает одни и те же данные более одного раза. Вы можете пройти долгий путь без использования кэширующего прокси-сервера, такого как лак, настроив правильные заголовки HTTP-ответа Cache-Control (хотя свежесть данных не проверяется).

Для этого в лаке есть как минимум два подхода;

  1. Пусть ваше приложение возвращает заголовок HTTP-ответа Вари: apikey .Это инструктирует любой кэш уровня HTTP (например, лак) только в результате повторного использования кэша, если заголовки запроса apikey одинаковы.

  2. Или, более эффективно, изменить функцию vcl_hash в вашей конфигурации vcl, чтобы принять во внимание заголовок apikey.

    sub vcl_hash { set req.hash + = req.http.apikey; }

+0

Почему вы считаете изменение vcl_hash быть более эффективным, чем заголовок Варах? Я бы подумал, что вариант заголовка «Vary: apikey» - лучший выбор, так как он будет работать с любыми промежуточными кешами и не полагается на «волшебство» лака, которое скрыто от вашей логики приложения. –

+3

Поиск Hash/Key - это O (1), а поиск в заголовке Vary - O (n), где n - количество различных ключей api. Если у вас много разных записей кэша с одним и тем же хэшем, вы должны рассмотреть каждую запись и проверить, соответствуют ли все Vary-заголовки текущему запросу. Это может быть неэффективным, если у вас много разных ключей api и только несколько кеш-ключей/ответов. Проверьте код в bin/varnishd/cache_vary.c, в методе VRY_Match. – ivy

+1

Для # 2 вам также нужно возвращать (хеш); 'в конце вашего' vcl_recv', чтобы избежать логики по умолчанию, которая по умолчанию будет «передавать» все запросы с заголовками 'Authorization' или' Cookie'. –