http HEAD vs GET производительность

я настраиваю веб-службу REST, которая просто должна ответить да или нет, как можно быстрее.

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

Я полагаю, что я получаю поток тела, чтобы не быть открытым/закрытым на моем сервере (около 1 миллисекунды?). Поскольку количество байтов для возврата очень низкое, я получаю какое-либо время в транспорте, в номере IP-пакета?

спасибо заранее для вашего ответа!

Edit:

чтобы объяснить дальнейший контекст:

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

Так как эта последняя услуга будет вызываться очень часто очень большим набором клиентов (один вызов ожидается каждые 5 мс), мне было интересно, использует ли Метод HEAD может быть ценной оптимизацией? Около 250 символов в тексте ответа. Головной метод, по крайней мере, получить транспорт этих 250 символов, но что это влияние?

Я попытался сравнить разницу между двумя методами (HEAD vs GET), выполнив 1000 раз вызовы, но не вижу никакого усиления вообще (

7 ответов


RESTful URI должен представлять собой "ресурс" на сервере. Ресурсы часто хранятся в виде записи в базе данных или файла в файловой системе. Если ресурс большой или медленно извлекается на сервере, вы можете не увидеть измеримый выигрыш с помощью HEAD вместо GET. Возможно, извлечение метаданных происходит не быстрее, чем извлечение всего ресурса.

вы можете реализовать оба варианта и сравнить их, чтобы увидеть, что быстрее, а не микро-оптимизация, я бы сосредоточился на разработке идеального интерфейса REST. Чистый API REST обычно более ценен в долгосрочной перспективе, чем API kludgey, который может быть или не быть быстрее. Я не препятствую использованию HEAD, просто предполагая, что вы используете его только в том случае, если это "правильный" дизайн.

если информация, которая вам нужна, действительно является метаданными о ресурсе, который может быть представлен красиво в заголовках HTTP, или проверить, существует ли ресурс или нет,HEAD может сработать мило.

например, предположим, что вы хотите проверить, существует ли ресурс 123. А 200 означает "да" и 404 означает "нет":

HEAD /resources/123 HTTP/1.1
[...]

HTTP/1.1 404 Not Found
[...]

однако, если" да "или" нет", которые вы хотите от своего сервиса REST, являются частью самого ресурса, а не метаданных, вы должны использовать GET.


Я нашел этот ответ, когда искал тот же вопрос, который задал запрашивающий. Я также нашел это в http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html:

метод HEAD идентичен GET за исключением того, что сервер не должен возвращать тело сообщения в ответе. Метаинформация, содержащаяся в заголовках HTTP в ответ на запрос HEAD, должна быть идентична информации, отправленной в ответ на запрос GET. Этот метод можно использовать для получение метаинформации о сущности, подразумеваемой запросом, без передачи самой сущности-тела. Этот метод часто используется для тестирования гипертекстовых ссылок на достоверность, доступность и недавнюю модификацию.

Мне кажется, что правильный ответ на вопрос запрашивающего заключается в том, что он зависит от того, что представлено протоколом REST. Например, в моем конкретном случае мой протокол REST используется для получения довольно больших (как в более чем 10K) изображений. если я имейте большое количество таких ресурсов, проверяемых на постоянной основе, и учитывая, что я использую заголовки запроса, тогда было бы целесообразно использовать HEAD request, per w3.org рекомендации.


Я категорически против такого подхода.

служба RESTful должна уважать семантику http-глаголов. Глагол GET предназначен для извлечения содержимого ресурса, в то время как глагол HEAD не возвращает никакого содержимого и может использоваться, например, чтобы увидеть, изменился ли ресурс, узнать его размер или его тип, проверить, существует ли он, и так далее.

и помните : ранняя оптимизация-корень всех зол.


ваша производительность вряд ли изменится, используя запрос HEAD вместо запроса GET.

кроме того, когда вы хотите, чтобы он был спокойным, и вы хотите получить данные, вы должны использовать запрос GET вместо запроса HEAD.


Я не понимаю вашего беспокойства о том, что "поток тела открыт / закрыт". Тело ответа будет находиться в том же потоке, что и заголовки ответов http, и не будет создавать второе соединение (которое, кстати, находится в диапазоне 3-6ms).

Это похоже на очень преждевременную попытку оптимизации чего-то, что просто не будет иметь существенного или даже измеримого значения. Реальная разница заключается в соответствии с REST в целом, который рекомендует использовать GET to get данные..

мой ответ-нет, используйте GET, если это имеет смысл, нет увеличения производительности с помощью HEAD.


GET fetches head + body, HEAD получает только голову. Это не должно быть вопросом мнения, который из них быстрее. Я не undestand upvoted ответы выше. Если вы ищете метаинформацию, чем идти за головой, которая предназначена для этой цели.


вы можете легко сделать небольшой тест, чтобы измерить производительность самостоятельно. Я думаю, что разница в производительности будет незначительной, потому что, если вы возвращаете только " Y " или " N " в теле, это один дополнительный байт, добавленный к уже открытому потоку.

Я бы также пошел с GET, так как это более правильно. Вы не должны возвращать контент в заголовках HTTP, только метаданные.