Мне сложно понять, как работает HTTP, когда несколько запросов отправляются параллельно (до получения ответа). Есть два случая:
1) С Connection: Keep-Alive
.
В соответствии с спецификацией HTTP:
Клиент, поддерживающий постоянные соединения, МОЖЕТ "конвейерно" запросов (т.е. отправлять несколько запросов, не дожидаясь ответ). Сервер ДОЛЖЕН отправлять свои ответы на эти запросы в тот же порядок, в котором были получены запросы.
Этот способ представляется довольно сложным для реализации и поддержки. Сервер должен отслеживать порядок запросов и должен отвечать в правильном порядке. Не только это может быть нелегко реализовать, но есть производительность: быстрые запросы должны ждать обработки медленных запросов, если они были выпущены позже.
Также, если мы говорим о балансировщике нагрузки, тогда прокси должен отслеживать, какой запрос был отправлен на какой-либо сервер, поэтому, когда они вернутся, он может поставить их в очередь и ответить в порядке. Так почему бы не сделать этот путь в первую очередь? То есть более естественно и проще, что клиент ставит (например) ID
заголовок, сервер обрабатывает запрос и отвечает тем же заголовком ID
, чтобы клиент мог сопоставить запрос с ответом. Это намного проще реализовать и не создает проблем с запросами на очередность (клиент должен отслеживать порядок запросов, если это необходимо).
Итак, вопрос в том, какова причина указания конвейерной обработки в том виде, в каком она была указана?
2) Без Connection: Keep-Alive
.
Я не мог найти информацию об этом случае. Скажем, что клиент выдает два запроса A и B. Без сохранения сервер закроет соединение после обработки запроса. Это, очевидно, вводит условие гонки. Так как же он должен себя вести? Должен ли он отказаться от второго запроса?