Які підводні камені використання Websockets замість RESTful HTTP?


79

Зараз я працюю над проектом, який вимагає від клієнта запиту на велику роботу та надсилання її на сервер. Потім сервер розподіляє завдання і відповідає масивом URL-адрес, щоб клієнт здійснив виклик GET і передав дані назад. Я - зелений голос у проекті, і зараз я використовую веб-сокети Spring для підвищення ефективності. Замість того, щоб клієнти постійно пінгували сервер, щоб перевірити, чи є у нього готові результати для потокової передачі назад, веб-сокет зараз просто зв’яжеться з клієнтським ура!

Чи погано було б, щоб веб-сокети керували всім процесом від кінця до кінця? Я використовую STOMP з веб-сокетами Spring, чи все ще будуть серйозні проблеми з відривом REST?

Відповіді:


128

З RESTful HTTP у вас є система запитів / відповідей без стану, де клієнт надсилає запит, а сервер повертає відповідь.

З webSockets у вас є система передачі повідомлень із станом (або, можливо, зі статусом), де повідомлення можна надсилати в будь-який спосіб, і надсилання повідомлення має нижчі накладні витрати, ніж при запиті / відповіді RESTful HTTP.

Це досить різні конструкції з різною міцністю.

Основними перевагами підключеного webSocket є:

  1. Двостороння комунікація. Отже, сервер може повідомити клієнта про що завгодно в будь-який час. Отже, замість опитування сервера через певний проміжок часу, щоб побачити, чи є щось нове, клієнт може встановити webSocket і просто прослуховувати будь-які повідомлення, що надходять з сервера. З точки зору сервера, коли відбувається подія, що цікавить клієнта, сервер просто надсилає повідомлення клієнту. Сервер не може зробити це за допомогою простого HTTP.

  2. Зменшення накладних витрат на повідомлення. Якщо ви передбачаєте велику кількість трафіку, що протікає між клієнтом і сервером, тоді на повідомлення з веб-сокетом є менші накладні витрати. Це пов’язано з тим, що TCP-з’єднання вже встановлено, і вам просто потрібно надіслати повідомлення у вже відкритому сокеті. За запитом HTTP REST вам слід спочатку встановити TCP-з'єднання, яке складається з декількох пунктів між клієнтом та сервером. Потім ви надсилаєте запит HTTP, отримуєте відповідь і замикаєте TCP-з'єднання. Запит HTTP обов'язково включатиме деякі накладні витрати, такі як усі файли cookie, які вирівняні з цим сервером, навіть якщо вони не стосуються конкретного запиту. HTTP / 2 (найновіша специфікація HTTP) забезпечує певну додаткову ефективність у цьому відношенні, якщо він використовується як клієнтом, так і сервером, оскільки одне TCP-з'єднання може використовуватися не лише для одного запиту / відповіді.

  3. Вища шкала за деяких обставин. З меншими накладними витратами на повідомлення та відсутністю опитування клієнта, щоб з’ясувати, чи є щось нове, це може призвести до додаткової масштабованості (більша кількість клієнтів, які може обслуговувати даний сервер). Є і мінуси масштабованості webSocket (див. Нижче).

  4. Державні зв’язки. Не вдаючись до файлів cookie та ідентифікаторів сеансів, ви можете безпосередньо зберігати стан у своїй програмі для певного з'єднання. Незважаючи на те, що для розв’язання більшості проблем було зроблено багато розробок зв’язку без громадянства, іноді з підключеннями з підтримкою стану це просто.

Основними перевагами RESTful HTTP-запиту / відповіді є:

  1. Універсальна підтримка. Важко отримати більш універсальну підтримку, ніж HTTP. Хоча зараз WebSockets користуються відносно хорошою підтримкою, все ще існують деякі обставини, коли підтримка WebSocket регулярно недоступна.

  2. Сумісний з більшою кількістю серверних середовищ. Існують серверні середовища, які не дозволяють тривалих серверних процесів (деякі ситуації спільного хостингу). Ці середовища можуть підтримувати HTTP-запит, але не можуть підтримувати тривале з'єднання WebSocket.

  3. Вища шкала за деяких обставин. Вимога webSocket для постійно підключеного сокета TCP додає деякі нові вимоги до масштабу до інфраструктури сервера, яких запити HTTP не вимагають. Отже, це закінчується компромісним простором. Якщо переваги webSockets насправді не потрібні або використовуються значним чином, то запити HTTP насправді можуть масштабуватися краще. Це точно залежить від конкретного профілю використання.

  4. Для одноразового запиту / відповіді один HTTP-запит є більш ефективним, ніж встановлення webSocket, використання його та закриття. Це пов’язано з тим, що відкриття webSocket починається із запиту / відповіді HTTP, а після того, як обидві сторони домовились про оновлення до з’єднання webSocket, фактичне повідомлення webSocket може бути надіслане.

  5. Без громадянства. Якщо ваша робота не ускладнюється наявністю інфрастуктури без громадянства, тоді світ без громадянства може значно спростити масштабування або відмову (просто додайте або видаліть серверні процеси за балансиром навантаження).

  6. Автоматичне кешування. За допомогою правильних налаштувань сервера відповіді http можуть бути кешовані браузером або проксі-серверами. Немає такого вбудованого механізму для запитів, надісланих через webSockets.


Отже, щоб звернутися до того, як ви задали питання:

Які підводні камені використання веб-сокетів замість RESTful HTTP?

  1. У великих масштабах (сотні тисяч клієнтів), можливо, вам доведеться виконати деякі спеціальні роботи на сервері, щоб підтримувати велику кількість одночасно підключених веб-сокетів.

  2. Усі можливі клієнти або набори інструментів не підтримують webSockets або запити, зроблені через них, до того самого рівня, який вони підтримують HTTP-запити.

  3. Деякі з менш дорогих серверних середовищ не підтримують тривалі серверні процеси, необхідні для підтримки webSockets.

Якщо для вашої програми важливо повернути клієнтові сповіщення про хід, ви можете або використати тривале HTTP-з'єднання, яке продовжує відправляти прогрес, або ви можете використовувати webSocket. WebSocket, швидше за все, простіше. Якщо WebSocket вам дійсно потрібен лише на відносно короткій тривалості цієї конкретної діяльності, тоді ви можете виявити, що найкращий загальний набір компромісів виходить за допомогою webSocket лише на той час, коли вам потрібна можливість надсилання даних клієнту та потім використання http-запитів для звичайних дій із запитами / відповідями.


1
Дякую за детальну відповідь. Я все ще чекаю на той магічний фреймворк, який робить веб-сокети фактичним способом створення веб-додатків. Мені дуже подобається те, що Весна робить з Websockets. Можливо, це переросте у щось велике.
контрабандні

Чому ніхто не згадує, що відповіді REST можна кешувати і немає простого / автоматичного способу кешування результатів Websocket?
metamaker

1
@metamaker - Це розумний момент, і я додаю його. Але з'єднання webSocket зазвичай не використовуються для типу діяльності запиту / відповіді, де кешування є актуальним, і насправді, http зазвичай є рекомендованим вибором для чистого запиту / відповіді.
jfriend00

@ jfriend00 Точно, але це певний випадок, коли REST блищить у порівнянні з WebSockets.
metamaker

На стороні підтримки, ми майже на 100% для браузерів: caniuse.com/#feat=websockets
Rexcirus

3

Це насправді залежить від ваших вимог. Послуги REST можуть бути набагато прозорішими та простішими для розробки розробником порівняно з Websockets.

Використовуючи Websockets, ви видаляєте більшість переваг, які пропонують веб-сервіси RESTful, такі як можливість посилання на ресурс через URI. Дійсно, що ви повинні робити, це з’ясувати, які переваги мають REST та гіпермедіа, і на основі цього вирішити, чи важливі ці переваги для вас.

Звичайно, цілком можливо створити веб-службу RESTful і доповнити її за допомогою API на основі веб-сокета для відповідей у ​​реальному часі.

Але якщо ви створюєте послугу, яку лише ви збираєтеся споживати в контрольованому середовищі, єдиним недоліком може бути те, що не кожен клієнт підтримує веб-сокети, тоді як майже будь-який тип середовища може зробити простий виклик http.


За допомогою Spring-websockets та Spring-messaging я можу зробити / @ MessageMapping, щоб мати URI. Я також можу зробити виклик Spring-mvc / @ RequestMapping! Здається, Spring-websockets можуть дозволити RESTful як абстракції? Тут я заблукав, мабуть, тому, що я наївний, але це робить розробку веб-сокетів справді привабливою, але я не чую про це багато галасу.
контрабандні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.