Как проверить, был ли ответ Cloud CDN попаданием в кеш (или исходит от CDN)

У меня есть бэкэнд-ведро GCS за балансировщиком нагрузки Google Cloud HTTP (S) с включенным Cloud CDN.

Я пытаюсь ответить на эти вопросы, основываясь на заголовках ответов:

  • был ли этот ответ отправлен из CDN
  • если да, то какое место / регион
  • это было попадание / промах в кеш

Вот заголовки ответов. Основываясь на cache-control, теоретически это должно быть кэшировано. Однако я не вижу указаний на это, чтобы проверить правильность работы CDN. Точно так же все остальные заголовки x-goog-* и Server: UploadServer, похоже, поступают с сервера GCS, а не CDN.

accept-ranges: bytes
age: 551
alt-svc: clear
cache-control: public, max-age=3600
content-length: 298303
content-type: image/jpeg
date: Wed, 05 Aug 2020 23:07:33 GMT
etag: "f0b6c60f635c784dd7f34ab9c1527867"
expires: Thu, 06 Aug 2020 00:07:33 GMT
last-modified: Wed, 05 Aug 2020 23:07:16 GMT
server: UploadServer
status: 200
X-DNS-Prefetch-Control: off
x-goog-generation: 1596668836233926
x-goog-hash: crc32c=rD4sZw==
x-goog-hash: md5=8LbGD2NceE3X80q5wVJ4Zw==
x-goog-metageneration: 1
x-goog-storage-class: STANDARD
x-goog-stored-content-encoding: identity
x-goog-stored-content-length: 298303
x-guploader-uploadid: AAANsUktJ98kPCHjiR2oBi6N-[...]

Например, Cloudflare предоставляет следующие заголовки ответов:

  • где был обработан запрос: cf-ray: 5be4505beb76bca2-SEA
  • каков был статус кеша: cf-cache-status: REVALIDATED
  • попал ли мой запрос напрямую в CDN или в серверную часть server: cloudflare

person Ahmet Alp Balkan    schedule 05.08.2020    source источник


Ответы (2)


Теперь есть новая переменная {cdn_cache_status}, которую вы можете установить в ответе: https://cloud.google.com/load-balancing/docs/custom-headers#variables

Используя gcloud SDK v309.0.0 или выше:

➜  gcloud beta compute backend-services update my-backend --global \
--enable-cdn \
--custom-response-header='Cache-Status: {cdn_cache_status}' \
--custom-response-header='Cache-ID: {cdn_cache_id}'

Пример вывода:

< HTTP/2 200
< content-type: text/plain; charset=utf-8
< date: Mon, 14 Sep 2020 21:40:05 GMT
< server: Google Frontend
< content-length: 1098
< via: 1.1 google
< cache-control: public, max-age=10
< age: 2
< x-frame-options: DENY
< cache-status: hit
person elithrar    schedule 14.09.2020

На данный момент вы не можете ответить на вышеперечисленные вопросы, просто взглянув на заголовки на стороне клиента.

Одним из индикаторов того, был ли запрос обслужен кешем или нет, является заголовок age, который Cloud CDN будет добавлять в ответы.

Если вы включили ведение журнала кеша на уровне балансировщика нагрузки HTTP, вы можете получить всю вышеуказанную информацию из журналов.

Точнее из полей:

httpRequest.cacheHit, которые указывают, был ли запрос обслужен из кеша или нет. jsonPayload.cacheId - расположение и экземпляр кеша, из которого был получен ответ кеша.

Более подробную информацию по вышеизложенному можно найти здесь 1.

person Kostikas Visnia    schedule 06.08.2020
comment
Так будет ли справедливо сказать, что отсутствие заголовка age означает промах? Я тестировал и заметил, что как только я запросил ресурс, заголовок age остается, хотя он продолжает расти. Затем, если я оставлю его ненадолго и перезагружу, иногда заголовок age отсутствует. Я полагаю, это означает, что сеть CDN GCP обновила ресурс из источника? - person antun; 01.09.2020
comment
Это правильно. Обычно контент, к которому не осуществляется доступ, очень часто, как правило, удаляется из кеша независимо от времени истечения срока действия контента. Так что это будет промах в кеше, и его нужно будет получить из источника. cloud.google.com/cdn/docs/overview#eviction - person Kostikas Visnia; 02.09.2020
comment
Оказывается, теперь в ответе можно настроить настраиваемый заголовок, чтобы указать состояние кеша. Ознакомьтесь с утвержденным ответом. - person Ahmet Alp Balkan; 21.09.2020