8 януари 2019 г. 4 минути четене
Преди няколко дни Quora ме „помоли“ да отговоря на някой, който попита дали „AWS API Gateway поддържа различен протокол от REST“. Въпреки концептуалната грешка във въпроса - мисля, че знаете какво е - отговорих много бързо, но Серджо ще говори много скоро и по-подробно за API Gateway. Така че следете! Работата е там, че този въпрос ме вдъхнови да напиша днешната публикация и да направя кратко сравнение между REST (HTTP) и WebSocket.
Повече от сравнение „REST срещу WebSocket“, това е сравнение HTTP срещу WebSocket (ws). Е, както добре си спомняте, REST (Reprezentative State Transfer) е модел или стил на архитектурен дизайн, а не транспортен протокол. Протоколът HTTP е изпълнение на REST архитектурата.
Много кратко и обобщено - можете да намерите повече информация тук, или тук, REST API е набор от правила, които позволяват комуникация между уеб приложения. REST използва HTTP протокола и много от неговите функции като част от своята API структура. Всъщност някой отдавна е казал, че „REST е мрежата, а мрежата е REST“. Ще се съгласите или не, но днес това е най-използваният стил.:)
Websocket е комуникационен протокол, който осигурява "пълен дуплекс" комуникационни канали през една и съща TCP връзка. Това е същата концепция на класическите UNIX сокети, но в мрежата и с идеята да се улесни прехвърлянето на данни в реално време от сървъра и към сървъра. Като двупосочна комуникация, сървърът може да изпраща информацията директно на клиента по време на свързването. Както добре знаете, REST не го прави лесно. Въпреки че на пазара има много мощни рамки, които знаят как да се справят с REST и backkends в реално време.
Както казахме по-рано, REST е архитектурен стил, а WebSocket протокол, следователно има смисъл, ако сравним HTTP с WebSocket. Това са някои от разликите:
С WebSockets изпращате прости сървърни съобщения с данни към сървъра и сървърът обработва данните и отговорите. Комуникацията е по-ефективна от HTTP, ако се фокусираме върху размера на съобщението и върху скоростта, особено за големи съобщения, тъй като в HTTP, например, трябва да изпращате заглавията във всяка заявка. Това добавя байтове. Също така в REST имате ресурси в URL адреси и HTTP методи. Което означава, че за всяка заявка получавате отговор.
Може би е добра идея да разгледаме бенчмаркинга от Дейвид Люке, за да сравним производителността на HTTP срещу WebSockets. Ще видите, че за повече от 50 едновременни заявки Websockets могат да бъдат с 50% по-бързи от HTTP! Това означава, че в много случаи и в зависимост от нуждите на вашия проект, WebSockets могат да бъдат по-бързи от традиционните HTTP API.
Друга основна разлика между двете за мен е, че WebSockets са протоколи с държавно състояние, докато HTTP връзките са без гражданство. Това означава, че WebSockets създават връзка, която остава жива на сървъра, докато сокетът се затвори и съобщенията се обменят двупосочно. Докато при HTTP връзките, при които дадена заявка означава отговор - валиден или не -, достъпът от различни сървъри не прекъсва тяхната работа, което от моя гледна точка е идеално, например за микроуслуги. Е, всеки сървър може да обработва всяка заявка и не е необходимо да синхронизирате някое от споделените състояния, с изключение на базата данни.
За финал и дори ако е възможно, мисля, че внедряването на 100% система WebSocket може да бъде лоша идея в смисъл, че трябва да внедрите функционалности, които вече съществуват в REST и HTTP. Преоткрийте колелото? Така че защо да не използваме WebSockets за транзакции с данни в реално време - например за чат - и REST за обратния случай?
Мисля, че при избора на най-добрия вариант е важно също така да се вземат предвид определени подробности, като например тази в HTTP връзките, браузърът ограничава броя на едновременните заявки, но няма ограничения за броя на съобщенията, че връзка от WebSocket можете да изпратите или да получите. Препоръчвам също така да следите метрики, свързани с трансфера на данни, времето за зареждане и мащабируемостта. И за да имате всичко много по-контролирано, защо не създадете системи, които ви позволяват лесно да изберете най-подходящите транспортни протоколи за всяка ситуация?
В кои случаи използвате Websockets вместо HTTP или обратно?