Плагин Diskcache в Imageresizer игнорирует дату изменения изображений, полученных с помощью AzureReader2

Когда я загружаю новую версию изображения (с тем же именем, но с новым свойством Last Modified) в хранилище Azure, измененная версия, вызываемая через API URL, не обновляется.

Новое изображение появляется при просмотре непосредственно с этого URL: [отредактировано].blob.core.windows.net/xlenz/ified-test.jpg

Но когда я смотрю кешированную версию с измененным размером, я все же получаю старую версию: [отредактировано].com/cloud/xlenz/ified-test.jpg? Width=700

Last-Modified: Thu, 08 May 2014 09:22:46 GMT
ETag: "ddf1d8129f6acf1:0"
Content-Type: image/jpeg
Cache-Control: public

Запрос новой некэшированной версии изображения показывает новую версию: [отредактировано].com/cloud/xlenz/ified-test.jpg? Width=800

Last-Modified: Thu, 08 May 2014 10:12:20 GMT
ETag: "a28693ffa56acf1:0"
Content-Type: image/jpeg
Cache-Control: public

Когда я отправляю новую версию изображения по FTP прямо на сайт, измененная версия, вызываемая через API URL, обновляется: [отредактировано].com /ified-test.jpg? Width=700

Я знаю, что проблема с DiskCache, а не с AzureReader2, потому что, когда я отключаю DiskCache через <diskCache enabled="false" /> проблема уходит.

Это ошибка в плагине DiskCache? Разве DiskCache не проверяет дату последнего изменения файлов в хранилище BLOB-объектов Azure?

Я использую последние версии 3.4.2 ImageResizer, ImageResizer.Plugins.AzureReader2 и ImageResizer.Plugins.DiskCache.

Вывод страницы диагностики: https://gist.github.com/anonymous/e104f8127969cedf92fd

2 ответа

Решение

Глядя на S3Reader2 (эквивалентный плагин для хранилища Amazon S3), я пришел к выводу, что это не ошибка, а отсутствующая функция.

S3Reader2 имеет параметр конфигурации 'checkForModifiedFiles':

Если true, S3Reader будет проверять наличие обновленных исходных файлов на S3 при запросе кэшированного файла. Метаданные кэшируются в течение часа после последнего доступа (настраивается кодом). Если установлено значение false, S3 никогда не будет проверяться на наличие новых версий кэшированных файлов, что снижает затраты на задержку на 50%. По умолчанию false.

Это именно то, что я искал в AzureReader2!

Я добавил это в качестве запроса на официальный сайт ImageResizer UserVoice: http://resizer.uservoice.com/forums/108373-image-resizer/suggestions/5900800-add-checkformodifiedfiles-configuration-setting-l

Пожалуйста, добавьте свой голос!

В качестве временного решения (пока мы ждем исправления) мы добавим текущую дату к запросам ImageResizer, которые относятся к изображениям, которые (частично) обновляются ежедневно.

ОБНОВЛЕНИЕ 2015-02-26: @ nathanael-jones написал по http://resizer.uservoice.com/forums/108373-image-resizer/suggestions/5900800-add-checkformodifiedfiles-configuration-setting-l: "Эта функция завершена и присутствует в V4 и развивает ветку на GitHub."

Спасибо за голосование!

Когда кэширование отключено, каждый запрос загружает новую копию исходного изображения из Azure.

Чтобы обеспечить недействительность на основе даты последнего изменения, вам придется проверять Azure на каждый запрос (или кэшировать метаданные на основе еще большего количества правил истечения срока действия).

AzureReader2 не позволяет DiskCache получать доступ к измененной дате больших двоичных объектов, так как это даже делает доступ к кэшированному изображению довольно медленным. Сетевая задержка не шутит:)

При работе с BLOB-объектами или удаленным хранилищем лучшая стратегия аннулирования вообще отсутствует - обрабатывайте BLOB-объекты как неизменные. Это не означает, что вы не можете обновить ответы для существующих URls изображений - это просто означает, что вам придется где-то поддерживать таблицу перезаписи.

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