Как работать с Cache-Control с использованием WebRequest и WebResponse?
Представьте себе ряд сервисов в архитектуре микросервисов. Служба A запрашивает ответ от службы B, а служба B устанавливает Cache-Control
заголовок к public, max-age=78261
,
Не существует ли способа.NET для работы с запрошенным объектом и какого-либо объекта "Кэш"?
Можно подумать, что должно быть Cache
недвижимость в WebResponse
или же HttpWebResponse
класс, интерфейс Cache-Control
заголовок.
Действительно ли необходимо разобрать Cache-Control
строка, найти значение и реализовать поддержку заголовка вручную?
1 ответ
Служба B указывает, что ее данные могут быть кэшированы где угодно, например, на любых последующих прокси-серверах, если вы передаете запрос через CDN (пограничное кэширование). Последующие запросы к службе B будут затем выполняться либо пограничным кешем, и не будут выполнять код в источнике для извлечения данных для следующего запроса.
Это следует рассматривать отдельно от проблем Службы А, которая может захотеть кэшировать данные ответа в течение некоторого периода времени, прежде чем сделать другой запрос Службе Б.
Вещи, которые вы хотите минимизировать, - это стоимость межпроцессного взаимодействия (HTTP Call, Service A -> Service B) и требуемая работа по сериализации / десерилизации.
Распространенным шаблоном здесь является кэш для сквозного чтения, где служба A проверяет наличие кэшированного ответа от операции, прежде чем принять решение сделать обратный вызов службе B (которая может по- прежнему отвечать данными с крайним кэшированием)
Служба A должна определиться со своей стратегией кеширования, как долго она будет кешировать ответ либо в MemoryCache на основе экземпляра, либо в совместно используемом кеше (например, Redis). Служба B, вероятно, возвращает данные о каком-либо полезном объекте в виде его содержимого, сериализованного в некоторой форме - "A" должен десерилизовать и кэшировать этот ответ.
Я бы оставил требования к кешированию для этих сервисов раздельными, не используйте значение max-age, чтобы решить, как долго следует кэшировать ответ в Сервисе A. Это привело бы к соединению между сервисами - если разработчик Сервиса B изменил максимальное значение возраста, то это повлияет на поведение службы А.
Вместо этого имейте значение конфигурации для Сервиса A, которое определяет, как долго можно кэшировать ответы от Сервиса B, используйте это, чтобы спроектировать реализацию чтения через кэш. Сохраните десериализованные ответы от Сервиса B в кеше для этого периода времени
NB. Я ссылался на изображения из http://jakeydocs.readthedocs.io/en/latest/performance/caching/response.html и http://blog.ragozin.info/2011/10/grid-pattern-proactive-caching.html.