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] http://users.livejournal.com/_slw/ 2016-08-03 12:45 pm (UTC)(link)
это можно сделать двумя коннектами на тупом http/1.0:

по одному урлу получаем ответы, там клиент делает запрос "дай штонибудь, я такой-то!" и ждет до усрачки, у сервера тймаут минут в 15. если ничего нет -- он скажет через 15 минут "нет ничего", клиент переспросит.

кажется это называется long poll mode

по второму урлу клиент срет запросами, сервер сразу отдает queue id, по которому с первого урла будет получен результат.
тут все обычно.

даже кипалив нигде не нужен.

[identity profile] juan-gandhi.livejournal.com 2016-08-03 03:21 pm (UTC)(link)
Я что-то перестал понимать, это белорусский интернет такой, по 15 минут на реакцию?

[identity profile] klonkaktusa.livejournal.com 2016-08-03 03:38 pm (UTC)(link)
https://en.wikipedia.org/wiki/Push_technology#Long_polling

[identity profile] juan-gandhi.livejournal.com 2016-08-03 04:13 pm (UTC)(link)
А. Ну это обычное ж дело. По мне так это просто синхронизация.

[identity profile] http://users.livejournal.com/_slw/ 2016-08-03 03:47 pm (UTC)(link)
я такого нигде не говорил.

[identity profile] juan-gandhi.livejournal.com 2016-08-03 04:13 pm (UTC)(link)
Я так прочитал. :)

[identity profile] chemodax.livejournal.com 2016-08-06 02:55 pm (UTC)(link)
Ждать до таймаута сервера может быть проблематично, если по дороге есть NAT ну или еще что-нить: если сервер дропнет connection, то клиент может не получить информации об: TCP FIN (или как он там называется) не будет получен, потому что NAT запись протухла. А клиент не узнает что connection умер, пока сам что-ить не начнет отправлять и не получит ACK в ответ. Можно использовать TCP keepalive, но не факт что все браузеры/intermediate proxy включают достаточно маленький TCP keepalive. Говорят что есть NAT-ы у которых дефолтная настройка таймаута 2 минуты.

[identity profile] http://users.livejournal.com/_slw/ 2016-08-06 03:27 pm (UTC)(link)
> Говорят что есть NAT-ы у которых дефолтная настройка таймаута 2 минуты.

мне кажется в такой жопе жить не стоит.
ну или тогда делать таймаут сервера 2 минуты.

[identity profile] chemodax.livejournal.com 2016-08-06 05:28 pm (UTC)(link)
Ну я так понимаю что start topic как раз и хочет чтобы работать и в жопе. А если того требования нет можно использовать WebScoket-ы или intermediate http responses (1xx)

[identity profile] http://users.livejournal.com/_slw/ 2016-08-06 05:58 pm (UTC)(link)
двух минутный таймаут у ната -- это не просто жопа, жопа жопы.
там и часть сайтов работать не будет и ssh и месанджеры...
в общем все будет очень плохо.

[identity profile] chemodax.livejournal.com 2016-08-06 06:21 pm (UTC)(link)
Я же не спорю что это плохо, но реальность такова. Я думаю не спроста Firefox использует 115 секунд для настройки TCP keep-alive.

[identity profile] berezovsky.livejournal.com 2016-08-06 06:26 pm (UTC)(link)
где-то в петербурге один невзоров радуется этому комментарию

[identity profile] chemodax.livejournal.com 2016-08-06 06:35 pm (UTC)(link)
Был неправ -- перепутал с HTTP connection keep-alive (http.keep-alive.timeout) -- он 115 секунд. С TCP keep-alive сложнее, потому что там несколько параметров для "shot-lived" и "long-lived" коннектов.

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

[identity profile] chemodax.livejournal.com 2016-08-06 06:51 pm (UTC)(link)
Я исходники не проверял, но у меня в about:config настройки есть.