metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2016-08-03 03:33 pm

"Асинхронный" http api

Вчера был на тусовке junolab, где их главные гуру рассказывали, как у них бекенд устроен.
В частности, на входе у них стоят гейтвеи с обычным http протоколом и минимальным набором фич - валидация, проверка авторизации по токенам и прочее такое, которые перекидывают запрос в MQ (nats.io).

При этом, насколько я понял, асинхронность там реализована поверх обычного http, без всяких http2, веб-сокетов и прочих не везде работающих протоколов - т.е. клиент api сначала делает запрос к гейтвею, ему сразу говорят - 200 ок, а потом он должен, по идее, дальше опрашивать гейтвей, пока для него из MQ придет ответ от микросервисов. Или у них там ответы от сервера бесконечно идут, я сходу не понял (т.е. ответ без content-length и соединение просто ждет пока придет что-нибудь, не помню, как эта техника называется).

В принципе, если keep-alive и соединение не обрывается - то реализация дуплексного протокола поверх синхронного http вроде приемлемая. Единственное, что в случае бесконечного ответа - если сервер и клиент долго ничего друг другу не говорят - промежуточные NAT и прочая сетевая муть могут соединение забыть, причем пока TCP keep-alive не проснется (а это два часа по умолчанию, вроде) - это обнаружено той стороной, которая молчит и ждет, не будет. Но теоретически это какие-то heart-beat слать можно со стороны сервера и запросы со стороны клиента.

не совсем так

[identity profile] wildman.livejournal.com 2016-08-03 01:37 pm (UTC)(link)
> т.е. клиент api сначала делает запрос к гейтвею, ему сразу говорят - 200 ок, а потом он должен, по идее, дальше опрашивать гейтвей, пока для него из MQ придет ответ от микросервисов.

в общем случае:
- между клиентом и сервером постоянно (до траблов в сети, обрыва, окончания авторизированной сессии) висит HTTP persistent connections (HTTP keep-alive) == stream
- клиент api сначала делает запрос к гейтвею, ему сразу (после минимальных телодвижений по обеспечению персистента если оно нужно) говорят - 200 ок
- через некоторое время в stream прилетает ответ по запросу (json c `\n` терминаторами)

по этому каналу у нас для надежности раз в секунду летает `\n` (сделано и на уровне gateway и на уровне клиента в зависимости от направления стрима)

в сумме - у нас и клиенты и сервер считают что работают по асинхронному дуплекс каналу. транспортные проблемы изолированы по коду до состояния что переход на любой другой вариант (http2, websockets, raw tcp socket, etc.) затронет до сотни строк в фреймворке на бэкенде и по такому же кусочку в клиентах
Edited 2016-08-03 14:48 (UTC)

Re: не совсем так

[identity profile] http://users.livejournal.com/_slw/ 2016-08-03 03:03 pm (UTC)(link)
а смысл? ведь в такой схеме по одному каналу нельзя сделать больше одного запроса до получения ответа.

Re: не совсем так

[identity profile] wildman.livejournal.com 2016-08-03 03:19 pm (UTC)(link)
в смысле?
запросы - в одном канале (или стрим клиент-сервер или http реквест-респонс)
ответы - в другом

RE: Re: не совсем так

[identity profile] http://users.livejournal.com/_slw/ 2016-08-03 03:50 pm (UTC)(link)
в твоем описании наличие двух каналов очень завуалированно и на самом деле не видно (более того, утверждением "по этому каналу" подразумевает что канал только один).