Получение правильных тегов ETags

Я читал книгу, и у меня есть конкретный вопрос по главе ETag. Автор говорит, что ETags могут нанести вред производительности и что вы должны их точно настроить или полностью отключить.

Я уже знаю, что такое ETags, и понимаю риски, но так ли сложно правильно понять ETags?

Я только что создал приложение, которое отправляет ETag, значением которого является хэш MD5 тела ответа. Это простое решение, которое легко реализовать на многих языках.

  • Неправильно ли использовать хеш MD5 тела ответа в качестве ETag? Если да, то почему?

  • Почему автор (явно перехитривший меня на много порядков) не предлагает такого простого решения?

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


person Pablo Fernandez    schedule 18.02.2010    source источник
comment
Никогда не безопасно предполагать, что автор немного перехитрит вас.   -  person spender    schedule 18.02.2010
comment
@spender: Согласен, но еще менее безопасно предполагать, что вы перехитрили автора.   -  person Oddthinking    schedule 18.02.2010
comment
и мы даже не будем трогать сообразительность веб-комментаторов, так или иначе ;-)   -  person Will Hartung    schedule 18.02.2010
comment
вы сделали MD5-хэш тела ответа, это означает, что вашему серверу пришлось снова сгенерировать тот же ответ, чтобы вычислить хеш !? если да, то вы сохранили передачу данных, но не загрузку сервера.   -  person Kambiz    schedule 24.07.2013
comment
@Kambiz Даже загрузка сервера может быть сохранена, когда после первого вычисления значение кэшируется, вы знаете, какие события могут сделать его недействительным, и можете подписаться на все такие события. Это может быть сложно ...   -  person maaartinus    schedule 04.06.2017


Ответы (4)


ETag похож на заголовок Last-Modified. Это механизм определения изменений со стороны клиента.

ETag должен быть уникальным значением, представляющим состояние и конкретный формат ресурса (ресурс может иметь несколько форматов, каждый из которых требует своего собственного ETag). Не уникальна для всей области ресурсов, а просто внутри ресурса.

Теперь технически ETag имеет бесконечное разрешение по сравнению с заголовком Last-Modified. Last-Modified изменяется только с шагом в 1 секунду, тогда как ETag может быть меньше секунды.

Вы можете реализовать как ETag, так и Last-Modified, или просто одно или другое (или, конечно, ни одного). Если вам недостаточно Last-Modified, рассмотрите вариант ETag.

Обратите внимание, я бы не стал устанавливать ETag для каждого ресурса. По сути, я бы не стал устанавливать его для чего-либо, что не предполагает кэширования (особенно динамического содержимого). В этом случае нет никакого смысла, просто потраченная впустую работа.

Изменить: я вижу ваше редактирование и уточняю.

MD5 в порядке. Единственный недостаток - постоянный расчет MD5. Использование MD5, скажем, для файла PDF размером 200 КБ обходится дорого. Запуск MD5 на ресурсе, который не ожидает кэширования, просто расточителен (т. Е. Динамический контент).

Хитрость заключается в том, что какой бы механизм вы ни использовали, он должен быть таким же дешевым, как и Last-Modified. Last-Modified, опять же, как правило, является свойством ресурса и обычно очень дешево для доступа.

ETags также должны быть дешевыми. Если вы используете MD5 и можете кэшировать / сохранять связь между ресурсом и хешем MD5, то это прекрасное решение. Однако пересчет MD5 каждый раз, когда требуется ETag, в основном противоречит идее использования ETags для повышения общей производительности сервера.

person Will Hartung    schedule 18.02.2010
comment
Спасибо. В моем конкретном случае у меня уже есть MD5, потому что я подписываю запросы цифровой подписью, но я вижу, что это может быть проблемой производительности для других сценариев. Спасибо! - person Pablo Fernandez; 18.02.2010
comment
ETag, который ПРОСТО ПРОИСХОДИТ, чтобы быть датой последнего изменения (т. е. тот же текст), соответствует всем критериям, необходимым для ETag. Это неверно, потому что и Gzip-ответ, и unGzip-ответ будут иметь одинаковую дату изменения; однако у них должны быть разные Etags: issues.apache.org/bugzilla/show_bug.cgi ? id = 39727 - person johnstok; 11.02.2011
comment
Запуск MD5, скажем, файла PDF размером 200 КБ обходится дорого - обычно нет, на современных процессорах MD5 во много раз быстрее, чем даже Gbit Ethernet, не говоря уже о подключениях конечных пользователей к Интернету. Если у ваших ETags есть шанс избежать даже 1% передач, это, вероятно, компенсирует затраченное процессорное время. - person intgr; 18.02.2014
comment
@ Отредактировал ли я ваш ответ, чтобы он был более верным с точки зрения фактов, пожалуйста, не стесняйтесь вносить дальнейшие изменения, если вы считаете, что это еще не оптимально. - person Félix Adriyel Gagnon-Grenier; 27.05.2021

Мы используем etags для нашего динамического контента в instela.

Наша стратегия находится в конце вывода, генерируя хэш md5 контента для отправки, и если заголовок if-none-match существует, мы сравниваем заголовок с сгенерированным хешем. Если два значения совпадают, мы отправляем код 304 и прерываем запрос, не возвращая никакого содержимого.

Это правда, что мы потребляем немного процессора для хеширования контента, но, в конце концов, мы значительно экономим полосу пропускания.

У нас есть главная страница в стиле ленты новостей facebook, содержание которой разное для каждого пользователя. Поскольку содержание новостной ленты меняется всего 3-4 раза в час, обновления главной страницы настолько эффективны для клиентской стороны. В эпоху мобильных устройств я думаю, что лучше потратить немного больше времени на процессор, чем на пропускную способность. Пропускная способность по-прежнему дороже, чем ЦП, и это лучше для клиента.

person Çağatay Gürtürk    schedule 27.12.2014

Не прочитав книгу, я не могу говорить о конкретных опасениях автора.

Однако генерация ETag должна быть такой, чтобы ETag генерировался только один раз при изменении страницы. Создание хэша MD5 веб-страницы требует вычислительной мощности и времени на сервере; если у вас много подключенных клиентов, это может вызвать проблемы с производительностью.

Таким образом, вам нужна хорошая техника для создания ETags только при необходимости и их кэширования на сервере до тех пор, пока соответствующая страница не изменится.

person Dancrumb    schedule 18.02.2010
comment
Я должен подписывать каждый ответ сервера цифровой подписью с общим секретом. Так что ETag был приятным побочным эффектом :) - person Pablo Fernandez; 18.02.2010

Я думаю, что perceived problem с ETAGS, вероятно, заключается в том, что ваш браузер должен выдать и проанализировать (простой и небольшой) запрос / ответ для каждого ресурса на вашей странице, чтобы проверить, изменилось ли значение etag на стороне сервера.

Я лично считаю эти дополнительные небольшие обращения к серверу приемлемыми для часто меняющихся изображений, css, javascript (серверу не нужно повторно отправлять контент, если etag браузера является текущим), поскольку этот механизм позволяет довольно легко пометить «обновленный» контент.

person ChristopheD    schedule 18.02.2010
comment
Проблема, упомянутая в книге, заключается в том, что вам нужно придумать особую и, возможно, умную стратегию (автор даже рекомендует отказаться от поддержки etags, если вы не можете найти хорошую стратегию). Вот что я нахожу странным: MD5 - хорошее решение? если да, то почему бы просто не сказать это? - person Pablo Fernandez; 18.02.2010
comment
Правильный max-age или Expires позволил бы клиенту знать, сколько ждать, не отправляя даже этот крошечный ли что-нибудь новое? запрос. Так что вы можете сэкономить и на обходах. - person Nicolás; 18.02.2010
comment
@Pablo Fernandez: MD5 в порядке, но я лично не стал бы хешировать все содержимое файла. Хеширования "даты последней модификации файла" должно быть достаточно. По поводу бита why not just say that?: ответ, вероятно, прямо в названии книги (Высокопроизводительные веб-сайты). Etags (и их обратные пути) действительно добавляют некоторые накладные расходы и могут быть важным фактором, который следует учитывать на сильно загруженном веб-сервере (но в то же время они добавляют гибкости) ... - person ChristopheD; 18.02.2010
comment
@ Nicolás: верно, но max-age или expires не могут дать вам никаких гарантий, что клиент всегда (!) Получает самую свежую информацию. - person ChristopheD; 18.02.2010
comment
Хеширование даты модификации было бы бесполезно. Если вы собираетесь это сделать, вы можете также отбросить ETags и позволить клиенту использовать Last-Modified + If-Modified-Since. Весь смысл ETag заключается в том, что они имеют разрешение лучше 1 секунды и могут возвращаться к ранее отправленным ETag. - person Nicolás; 18.02.2010
comment
@ Николас: очень верно (точка взята). Комбинация last-modified / if-modified-Since будет вести себя почти так же, как etag, обозначающая отметку времени последнего изменения (и они, вероятно, лучше подходят для этой работы ;-). - person ChristopheD; 18.02.2010