8 січня 2019 р. 4 хв
Кілька днів тому Quora "попросив" мене відповісти на запитання, чи "Шлюз API AWS підтримує інший протокол, ніж REST". Незважаючи на концептуальну помилку у питанні - я думаю, ви знаєте, що це таке, - я відповів на це дуже швидко, але Серхіо дуже скоро поговорить, і більш докладно, про API Gateway. Тож стежте за оновленнями! Справа в тому, що це питання надихнуло мене написати сьогоднішній пост і зробити коротке порівняння між REST (HTTP) і WebSocket.
Більше, ніж порівняння “REST проти WebSocket”, це порівняння HTTP та WebSocket (ws). Ну, як ви добре пам’ятаєте, REST (Представницький державний трансфер) - це шаблон або стиль архітектурного дизайну, а не транспортний протокол. Протокол HTTP є реалізацією архітектури REST.
Дуже короткий та короткий - ви можете знайти більше інформації тут, або тут REST API - це набір правил, що дозволяють спілкуватися між веб-програмами. REST використовує протокол HTTP та багато його функцій як частину своєї структури API. Насправді хтось давно сказав, що "REST - це мережа, а мережа - REST". Погодитесь чи ні, але сьогодні це найбільш вживаний стиль.:)
Websocket - це комунікаційний протокол, який забезпечує "повнодуплексні" канали зв'язку через одне і те ж з'єднання TCP. Це та сама концепція класичних сокетів UNIX, але в Інтернеті, і з ідеєю полегшити передачу даних у режимі реального часу з сервера та на сервер. Будучи двостороннім зв'язком, сервер може надсилати інформацію безпосередньо клієнту під час з'єднання. Як ви добре знаєте, REST робить це нелегко. Хоча на ринку є дуже потужні фреймворки, які знають, як поводитися з REST та бекендами в реальному часі.
Як ми вже говорили раніше, REST - це стиль архітектури, а WebSocket - протокол, тому має сенс порівняти HTTP із WebSocket. Ось деякі відмінності:
За допомогою WebSockets ви надсилаєте на сервер прості рядкові повідомлення з даними, а сервер обробляє дані та відповіді. Зв'язок є більш ефективним, ніж HTTP, якщо ми зосереджуємось на розмірі повідомлення та на швидкості, особливо для великих повідомлень, оскільки, наприклад, у HTTP ви повинні надсилати заголовки у кожному запиті. Це додає байти. Також у REST у вас є ресурси в URL-адресах та методах HTTP. Це означає, що на кожен запит ви отримуєте відповідь.
Можливо, було б непогано поглянути на порівняльний аналіз Девіда Люке, щоб порівняти ефективність HTTP та WebSockets. Ви побачите, що для більш ніж 50 одночасних запитів Websockets може бути на 50% швидшим, ніж HTTP! Це означає, що у багатьох випадках, залежно від потреб вашого проекту, WebSockets можуть бути швидшими за традиційні API HTTP.
Ще однією важливою відмінністю між ними є те, що WebSockets - це протоколи з підтримкою стану, тоді як з'єднання HTTP - без стану. Це означає, що WebSockets створюють з'єднання, яке залишається активним на сервері, доки сокет не буде закритий, а повідомлення обміняються двонаправлено. Тоді як у з'єднаннях HTTP, в яких запит означає відповідь - дійсний чи ні - доступ з різних серверів не перериває їх роботи, що з моєї точки зору є ідеальним, наприклад, для мікросервісів. Ну, будь-який сервер може обробляти будь-які запити, і не потрібно синхронізувати будь-який із загальних станів, крім бази даних.
Нарешті, навіть якщо це можливо, я думаю, що впровадження 100% системи WebSocket може бути поганою ідеєю в тому сенсі, що вам доведеться впровадити функціональні можливості, які вже існують у REST та HTTP. Знову винайти колесо? То чому б не використовувати WebSockets для транзакцій даних у реальному часі - наприклад, для чату - та REST для протилежного випадку?
Я вважаю, що при виборі найкращого варіанту важливо також враховувати певні деталі, наприклад, підключення до HTTP, браузер обмежує кількість одночасних запитів, але не існує обмежень щодо кількості повідомлень, які WebSocket ви можете надіслати або отримати. Я також рекомендую стежити за показниками, пов’язаними з передачею даних, часом завантаження та масштабованістю. І, щоб мати все набагато контрольованішим, чому б не створити системи, які дозволяють легко підбирати найбільш підходящі транспортні протоколи для кожної ситуації?
У яких випадках ви використовуєте Websockets замість HTTP або навпаки?