Nano Hash - криптовалюты, майнинг, программирование

Выдача нескольких запросов до получения ответа

У меня возникли проблемы с пониманием того, как работает HTTP, когда несколько запросов отправляются параллельно (до получения ответа). Есть два случая:

1) С Connection: Keep-Alive.

Согласно спецификации HTTP:

Клиент, поддерживающий постоянные соединения, МОЖЕТ «конвейерно» передавать свои запросы (т. е. отправлять несколько запросов, не дожидаясь каждого ответа). Сервер ДОЛЖЕН отправлять свои ответы на эти запросы в том же порядке, в котором они были получены.

Такой способ кажется довольно сложным для реализации и обслуживания. Сервер должен отслеживать порядок запросов и отвечать в правильном порядке. Мало того, что это может быть непросто реализовать, но это удар по производительности: быстрые запросы должны ждать, пока не будут обработаны медленные запросы, если они были отправлены позже.

Кроме того, если мы говорим о балансировщике нагрузки, то прокси должен отслеживать, какой запрос был отправлен на какой сервер, чтобы, когда они возвращаются, он мог поставить их в очередь и ответить по порядку. Так почему бы не сделать это в первую очередь? т.е. звучит естественнее и проще, если клиент помещает (например) заголовок ID, сервер обрабатывает запрос и отвечает тем же заголовком ID, чтобы клиент мог сопоставить запрос с ответом. Это намного проще реализовать, и это не создает проблем с очередями запросов (клиент может отслеживать порядок запросов, если это необходимо).

Итак, вопрос: в чем причина указывать конвейерную обработку именно так, как она была указана?

2) Без Connection: Keep-Alive.

Я не смог найти никакой информации об этом случае. Допустим, клиент отправляет два запроса A и B. Без поддержки активности сервер закроет соединение после обработки запроса. Это, очевидно, вводит состояние гонки. Так как же он должен себя вести? Должен ли он отклонить второй запрос?


Ответы:


1

1) С поддержкой активности:

Согласно этой статье в Википедии (http://en.wikipedia.org/wiki/HTTP_pipelining), это наоборот: реализация на стороне сервера на самом деле очень проста. Я полагаю, что это утверждение основано на предположении, что один поток используется для обработки всех запросов для одного соединения (что, безусловно, было общим случаем, когда этот механизм был разработан), и, таким образом, несколько запросов в одном и том же соединении последовательно обрабатываются этим потоком. (а поскольку TCP гарантирует упорядоченную доставку, ответы, естественно, принимаются в том же порядке, в котором они обрабатываются). Сегодня на неблокирующей реализации сервера все может быть по-другому.

2) Без поддержки активности:

Без поддержки активности вы не выполняете конвейерные запросы, поэтому я не вижу состояния гонки. У вас есть два отдельных соединения для запросов A и B, каждое соединение закрывается после завершения запроса.

Если клиент пытается передать запросы без поддержки активности, я считаю, что применяется следующий раздел спецификации:

Клиенты, которые предполагают постоянные соединения и конвейер сразу после установления соединения, ДОЛЖНЫ быть готовы повторить попытку соединения, если первая попытка конвейера не удалась. Если клиент выполняет такую ​​повторную попытку, он НЕ ДОЛЖЕН выполнять конвейер, пока не узнает, что соединение является постоянным. Клиенты также ДОЛЖНЫ быть готовы повторно отправить свои запросы, если сервер закроет соединение до отправки всех соответствующих ответов.

Моя интерпретация заключается в том, что сервер должен законно отклонить второй запрос и ответить только на первый, поскольку ответы FIFO. Клиент должен повторно отправить второй запрос.

Имейте в виду: это в основном предположения с моей стороны, надеюсь, они вам понятны!

20.02.2014
  • Спасибо за ответ. 1) Но поддержка активности была официально добавлена ​​в HTTP1.1. Разве не в 1999 году? Разработчики протокола должны были знать об асинхронных серверах. Хотя я могу ошибаться. 2) У вас есть отдельные подключения, если клиент открывает отдельные подключения. Я говорю о нештатной ситуации, когда клиент выдает два запроса по одному и тому же соединению. Как с этим быть? 20.02.2014
  • Я не уверен насчет сроков, но 1999 год кажется мне довольно ранним для неблокирующих серверов. Я добавил некоторые детали для 2), 20.02.2014
  • Это звучит разумно. Я приму этот ответ. :) 20.02.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..