Как работать с 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.

Другие вопросы по тегам