2017-02-20 29 views
1

Можно ли передать ответ обратно в браузер, от узла, возможно, используя http2?Могу ли я передать ответ обратно в браузер с помощью http2?

В моем веб-приложении пользователь нажимает кнопку, которая запускает процесс сервера. Для завершения этого процесса может потребоваться 10 минут или дольше. Я хочу передать обновления статуса обратно клиенту/браузеру.

Я считаю, что могу сделать это с помощью websockets, но я надеялся, что у http2 есть что-то, чтобы сделать это проще. Я знаю, что он поддерживает «push», но, насколько я знаю, это только для толкания файлов, которые могут понадобиться пользователю в будущем.

Или, может быть, мне даже не нужен http2? Как долго браузер будет поддерживать соединение открытым? Могу ли я просто держать res.write() до бесконечности?

+1

Возможно, вы захотите использовать [SSE] (https://en.wikipedia.org/wiki/Server-sent_events). Я не думаю, что HTTP/2 vs HTTP/1.1 имеет значение здесь. – kennytm

+0

@kennytm Ох, это звучит многообещающе. Благодаря! – mpen

ответ

2

В принципе вы можете передавать данные с сервера на клиент с любой версией HTTP, просто отправив только фрагменты данных в тело ответа. Однако текущие HTTP-API-браузеры (XHR и выборка) еще не позволяют считывать тело ответа потоковым способом, вместо этого они будут буферизовать весь ответ (что не имеет смысла для бесконечного потока). Работа с потоковым корпусом ответа будет возможна в будущем, когда функция потоковой передачи API-интерфейса Fetch полностью доступна, см.: https://www.chromestatus.com/feature/5804334163951616. Вы уже можете использовать ее в Chrome, но, насколько я понимаю, она пока не полностью стандартизирована и широко доступна.

Исключением из этого общего правила являются события, связанные с сервером (SSE), которые являются ответами HTTP от браузера, которые следуют четко определенному кодированию преобразования (text/event-stream). Браузеры поддерживают API SSE для работы с ответами SSE, а API-интерфейсы SSE позволяют вам получать событие для каждого принятого блока данных. API довольно прост, и вам не нужно изобретать собственный механизм chunking, поэтому он может быть хорошим вариантом для вашего приложения.

Относительно HTTP/1.1 и HTTP/2: Основное отличие в том, что вы будете наблюдать за ним количество одновременных потоков, которые вы можете создать с ними. Для HTTP/1.1 для каждого потока требуется полное TCP-соединение, а браузеры ограничивают подключения к удаленному хосту (я думаю, менее 10). Таким образом, создание 50 потоков SSE невозможно - и я бы пошел еще дальше и сказал бы, что вы, вероятно, должны использовать только один поток SSE и поместить в него все данные событий. HTTP/2, с другой стороны, позволяет мультиплексировать множество HTTP-запросов (и тем самым также передавать потоковые ответы тела) по одному TCP-соединению, что означает, что большее количество параллельных потоков SSE здесь меньше.

+0

Спасибо за отличную информацию! Я просто пытался использовать SSE, и до сих пор у меня есть большой успех. Даже лучше того, на что я надеялся, я могу отправлять отчеты о проделанной работе всем, у кого есть открытая страница! Мониторинг в реальном времени без веб-портов. Neato! – mpen