2015-02-12 2 views
1

У нас есть веб-служба, которая в настоящее время отвечает примерно на 3 миллиона HTTP-запросов в секунду. Каждый сервер на задней панели способен обслуживать около 5 миллионов запросов. Таким образом, бутылочная горловина - это передние концы HTTP.Стандартный протокол для мультиплексирования HTTP (для нескольких запросов)

Таким образом, проблема обращена к проблеме ситуации балансировки нагрузки. Мы решили проблему, позволяя многим серверам переднего плана суммировать входящие запросы в течение 1 миллисекунды. Как только полная миллисекунда будет достигнута для определенного сервера переднего конца, мы отправляем все запрошенные пакеты (около 100) на задний сервер с использованием существующего соединения с одним сокетом.

Это означает, что наши серверы back end получают запросы, содержащие сотни оригинальных HTTP-запросов и ответов с ответом, содержащим сотни запросов.

Существует ли стандартный протокол для мультиплексных/пакетных/агрегатных HTTP-запросов? Мультиплексирование в швах HTTP2 фокусируется на нескольких ответах на один запрос.

ответ

0

Нет, мультиплексирование HTTP/2 представляет собой полные пары запросов и ответов по одному физическому соединению. В случае HTTP/2 браузер должен иметь возможность просматривать сайт с сотнями объектов, используя одно TCP-соединение.

Таким образом, это звучит как протокол, который может удовлетворить ваш прецедент.

1

HTTP2 мультиплексирование НЕ для нескольких ответов на один запрос. HTTP2 был разработан, чтобы разрешить несколько запросов по одному соединению без блокировки строки - т.е. ответы могут возвращаться в произвольном порядке.

В зависимости от размера ваших ответов, я думаю, что HTTP2 может предложить вам что-то ..... однако, если ваши ответы велики и/или все они принимают примерно одно и то же время, так что глава блокировки строк не является проблема, тогда конвейерный HTTP1, вероятно, будет меньше потреблять процессор.

0

Предполагая, что вы отправляете запросы от с разными клиентами, прежде чем отправлять их на сервер, между клиентом и интерфейсным сервером нет протокола обмена данными, который может помочь вам, поскольку протоколы на основе TCP разрешают только подключение между одним клиентом (идентифицируется IP + Port) и одним сервером (то же самое).

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

Например, выполнение ваших требований в Vert.x довольно тривиально, но могут работать и другие фреймворки/серверы (Node.js, Apache 2.4/Nginx с Lua-скриптами и т. Д.).

Смежные вопросы