API Websocket замінити API REST?


102

У мене є програма, основна функція якої працює в режимі реального часу, через веб-розетки або тривале опитування.

Однак більша частина сайту написана RESTful способом, що приємно для додатків та інших клієнтів у майбутньому. Однак я думаю про перехід на API вебсокета для всіх функцій сайту, подалі від REST. Це полегшило б мені інтегрувати функції реального часу у всі частини сайту. Чи ускладнить це створення програм або мобільних клієнтів?

Я виявив, що деякі люди вже роблять такі речі: SocketStream


2
@ Стегі тривалий опитування працює досить добре, як резервний, не надто переймаючись цим.
Гаррі

2
Гаррі зараз через 7 років, як це тобі дійшло? Цікаво, адже я хочу рухатися і в цьому напрямку. @Harry
Дмитро Кудрявцев

2
@DmitryKudryavtsev Я в кінцевому підсумку не робив цього. Традиційний метод спрацював для мене добре і не був набагато складніше.
Гаррі

Відповіді:


97

Не кажучи про те, що інші відповіді тут не мають достоїнств, вони роблять хороші моменти. Але я збираюся йти проти загального консенсусу і погоджуюся з вами, що перехід на веб-розетки для більше ніж просто функцій у реальному часі дуже привабливий.

Я серйозно розглядаю можливість переміщення мого додатка з архітектури RESTful до більшої кількості стилів RPC через веб-розетки. Це не "додаток для іграшок", і я не кажу лише про функції в реальному часі, тому у мене є застереження. Але я бачу багато переваг у проходженні цього маршруту і вважаю, що це може виявитись винятковим рішенням.

Мій план - використовувати DNode , SocketIO та Backbone . За допомогою цих інструментів мої моделі Backbone та колекції можна передавати від / до клієнта та сервера, просто викликавши функції RPC-стилю. Більше не керувати кінцевими точками REST, серіалізувати / дезаріалізувати об'єкти тощо. Я ще не працював з socketstream, але, схоже, варто перевірити.

У мене ще довгий шлях, перш ніж я можу остаточно сказати, що це хороше рішення, і я впевнений, що це не найкраще рішення для кожної програми, але я переконаний, що це поєднання було б надзвичайно потужним. Я визнаю, що є деякі недоліки, такі як втрата здатності кешувати ресурси. Але я маю відчуття, що переваги їх переважуватимуть.

Мені буде цікаво слідкувати за вашими успіхами в дослідженні такого типу рішення. Якщо у вас є експерименти з github, будь ласка, вкажіть мене на них. У мене ще немає, але сподіваюся, що скоро.

Нижче наведено список посилань для читання, які я збирав пізніше. Я не можу сказати, що вони всі варті, тому що я лише скупив багато з них. Але, сподіваємось, деякі допоможуть.


Чудовий підручник з використання Socket.IO з Express. Він виставляє експрес-сеанси на socket.io та обговорює, як мати різні кімнати для кожного аутентифікованого користувача.

Підручник по node.js / socket.io / backbone.js / express / connect / jade / redis з аутентифікацією, хостинг Joyent тощо.

Підручник з використання Pusher з Backbone.js (з використанням Rails):

Створіть додаток з backbone.js на клієнті та node.js з express, socket.io, dnode на сервері.

Використання хребта з DNode:


1
Я просто відповів на відповідне запитання і включав кілька думок: stackoverflow.com/questions/4848642 / ...
Таурна

12
"У мене ще довгий шлях, перш ніж я можу остаточно сказати, що це хороше рішення" - Просто цікавість, чи справді це було вдале рішення? : D
inf3rno

7
Будь ласка, відповідайте @Tauren Мене дуже цікавить, що ти маєш зараз сказати.
No_name

4
@Tauren Мені також цікаво, як це вийшло?
Куррен

57

HTTP REST і WebSockets дуже різняться. HTTP не має статусу , тому веб-серверу нічого не потрібно знати, і ви отримуєте кешування у веб-браузері та проксі. Якщо ви використовуєте WebSockets, ваш сервер набуває значущого стану і вам потрібно мати з'єднання з клієнтом на сервері.

Зв'язок із запитом-відповіддю проти Push

Використовуйте WebSockets лише в разі потреби PUSH даних від сервера до клієнта, що шаблон зв'язку не входить в HTTP (тільки обхідні шляхи). PUSH корисний, якщо події, створені іншими клієнтами, повинні бути доступними для інших підключених клієнтів, наприклад, в іграх, де користувачі повинні діяти на поведінку інших клієнтів. Або якщо ваш веб-сайт щось відстежує, коли сервер постійно надсилає дані клієнту, наприклад, фондові ринки (наживо).

Якщо вам не потрібно PUSH даних з сервера, зазвичай простіше використовувати сервер HTTP REST без стану. HTTP використовує просту схему зв'язку " Запит-відповідь" .


5
Ми дуже звикли до єдиного напрямку, тому що раніше ніколи не було альтернатив. Але тепер, коли моє додаток стає більш розвиненим, мені стає більш очевидним, що чим більше місць, в яких використовується технологія push, тим більш чуйним і тим привабливішим стає додаток.
Гаррі

У моєму додатку відображається список друзів і кількість балів, наприклад, вони. Чому б не оновити його в режимі реального часу. Якщо користувачі можуть бачити, як їхні друзі прогресують, вони можуть схильні більше наздогнати. У мене є певні моделі документів, які, хоча точно не змінюються часто, змінюються достатньо, щоб його оновлення в режимі реального часу може спричинити невелику плутанину. У якийсь момент достатньо вашого сайту виграє від оновлень натискань, що ви починаєте дивитися на свій код, а половина - про REST, а інша половина - про сокети, і ви добре говорите, я хочу це уніфікувати.
Гаррі

3
Це можливість використовувати веб-розетки лише для надсилання повідомлення / команди на ваш веб-сервер (наприклад, getUpdate або refreshObjectWithId з параметрами). Ця команда може бути проаналізована у вашому веб-сервері (клієнті), після чого слід запит на відпочинок, щоб отримати конкретні дані, а не транспортувати самі дані через веб-розетки.
Beachwalker

2
Є ціла маса причин, що веб-розетки можуть бути простішими, ніж REST-дзвінки - не лише для натискання websocket.org/quantum.html
BT

WebSockets є дивовижним та безкоштовним сервером будь-коли надсилати клієнтські дані, не лише у відповідь на повідомлення клієнта. WebSockets реалізує протокол на основі повідомлень, щоб клієнти могли отримувати повідомлення в будь-який час, і якщо вони чекають певного повідомлення, вони можуть чергувати інші повідомлення для подальшої обробки, переупорядковувати чергові повідомлення, ігнорувати натиснуті повідомлення залежно від стану програми тощо. I ' Ніколи більше не напишу ще одну програму на основі REST. Flash також робить його легким, з реалізацією WebSocket на базі відкритого коду та реалізацією резервного копіювання до браузера за допомогою методів ExternalInterface. (AddCallback / call).
Трайнко

40

Я думаю про перехід на api WebSocket для всіх функцій сайту

Ні. Ви не повинні цього робити. Немає шкоди, якщо ви підтримуєте обидві моделі. Використовуйте REST для одностороннього спілкування / прості запити та WebSocket для двостороннього спілкування, особливо коли сервер хоче надіслати повідомлення в режимі реального часу.

WebSocket - це більш ефективний протокол, ніж RESTful HTTP, але все-таки RESTful HTTP забиває більше WebSocket у нижчих областях.

  1. Ресурси створення / оновлення / видалення добре визначені для HTTP. Ви повинні реалізувати ці операції на низькому рівні для WebSockets.

  2. З'єднання WebSocket масштабуються вертикально на одному сервері, де HTTP-з'єднання масштабуються горизонтально. Існує кілька фірмових нестандартних рішень для горизонтального масштабування WebSocket.

  3. HTTP поставляється з великою кількістю хороших функцій, таких як кешування, маршрутизація, мультиплексування, gzipping тощо. Вони повинні будуватися поверх Websocket, якщо ви вибрали Websocket.

  4. Оптимізація пошукової системи добре працює для HTTP-URL-адрес.

  5. Усі проксі, DNS, брандмауэры ще не повністю усвідомлюють трафік WebSocket. Вони дозволяють порт 80, але можуть обмежити трафік, перенісши його спочатку.

  6. Безпека за допомогою WebSocket - це підхід «майже або нічого».

Погляньте на цю статтю для більш детальної інформації.


3
Це найкраща відповідь.
MattWeiler

1
Краща відповідь на тему
Sanandrea

10

Єдина проблема, яку я можу використовувати TCP (WebSockets) в якості основної стратегії доставки веб-контенту, - це те, що там дуже мало читає матеріалів про те, як створити архітектуру та інфраструктуру веб-сайту за допомогою TCP.

Таким чином, ви не можете вчитися на чужих помилках, і розвиток буде повільнішим. Це також не "перевірена" стратегія.

Звичайно, ви також втратите всі переваги HTTP (більші переваги мають стан без громадянства та кешування).

Пам'ятайте, що HTTP - це абстракція для TCP, призначена для розміщення веб-контенту.

І не будемо забувати, що SEO та пошукові системи не роблять веб-розетки. Тож ви можете забути про SEO.

Особисто я б рекомендував проти цього, оскільки існує занадто великий ризик.

Не використовуйте WS для розміщення веб-сайтів, використовуйте його для розміщення веб-додатків

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


7

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

Це почалося з доказу концепції, і працювало чудово. Але тоді, коли ми хотіли зробити це доступним для публіки, нам довелося додати сеанс користувача, тому нам були потрібні функції входу. І як би ви не дивилися на це, вебсокет повинен знати, з яким користувачем він має справу, так ми взяли ярлик використання веб-сокетів для аутентифікації користувачів . Це здавалося очевидним, і це було зручно.

Нам фактично довелося провести тишу деякий час, щоб зробити зв’язки надійними. Ми розпочали з деяких дешевих навчальних посібників для веб-сокетів, але виявили, що наша реалізація не змогла автоматично підключитися під час розриву зв’язку. Це все покращилося, коли ми перейшли на socket-io. Socket-io - це обов’язково!

Сказавши все це, чесно кажучи, я думаю, що ми пропустили деякі чудові функції socket-io.Socket-io може запропонувати ще багато, і я впевнений, якщо ви врахуєте це у своєму первісному дизайні, ви можете отримати більше від нього. На відміну від цього, ми просто замінили старі веб-розетки функціями websocket socket-io, і це було все. (немає кімнат, немає каналів, ...) Перероблення могло б зробити все більш потужним. Але ми на це не встигли. Це щось запам'ятати для нашого наступного проекту.

Далі ми почали зберігати все більше даних (історія користувача, рахунки-фактури, транзакції, ...). Ми зберігали все це в базі даних AWS dynamodb, і ПРОТИ, ми використовували socket-io для передачі операцій CRUD від переднього кінця до бекенда. Я думаю, що ми помилилися там. Це була помилка.

  • Тому що незабаром ми з'ясували, що хмарні сервіси Amazon (AWS) пропонують чудові інструменти для балансування / масштабування навантаження для RESTful додатків .
  • Зараз у нас складається враження, що нам потрібно написати багато коду для виконання рукостискань операцій CRUD.
  • Нещодавно ми реалізували інтеграцію Paypal. Нам вдалося змусити його працювати. Але знову ж таки, всі підручники роблять це за допомогою RESTful API . Нам довелося переписувати / переосмислювати їх приклади, щоб реалізувати їх за допомогою веб-розетки. Ми дістали це працювати досить швидко, хоча. Але відчувається, що ми йдемо проти течії.

Сказавши все це, ми будемо жити наступного тижня. Ми потрапили вчасно, все працює. І це швидко, але чи буде масштабуватися?


Тільки цікаво, як ми намагаємось прийняти це рішення самостійно, чи добре воно масштабується із AWS?
Гейб

1
@Gabe, мабуть, вузол може легко взяти 100-ю з’єднань socket-io на дешевому екземплярі aws Ми ще не помітили жодних проблем із ефективністю. Одним із дивних ефектів є те, що люди, які відвідують ваш веб-сайт один раз, але потім залишають веб-сайт відкритим на вкладці, продовжують використовувати з'єднання. (і це часто трапляється на мобільних телефонах). Отже, вам потрібен хоча б якийсь механізм, щоб вигнати непрацюючих користувачів. Я ще не доклав зусиль для цього, хоча наша вистава зовсім не страждає від цього. - Тож, жодне лущення не потрібно було.
bvdb

4

Я б розглядав можливість використання обох . Кожна технологія має свої достоїнства, і не існує однорозмірного рішення, яке підходить для кожного рішення

Розмежування роботи йде таким чином:

  1. WebSockets був би основним методом програми для спілкування з сервером, де потрібен сеанс. Це усуває багато хак, які потрібні для старих браузерів (проблема полягає в підтримці старих браузерів, що усуне це)

  2. API RESTful використовується для GET-дзвінків, не орієнтованих на сеанс (тобто не потрібна автентифікація), які отримують користь від кешування браузера. Хорошим прикладом цього можуть слугувати довідкові дані для спадів, що використовуються веб-додатком. Однак. може змінитися трохи частіше, ніж ...

  3. HTML та Javascript. Вони містять інтерфейс користувача webapp. Це, як правило, вигідно розмістити на CDN.

  4. Використання веб-служб WSDL, як і раніше є найкращим способом корпоративного рівня та міжпідприємницької комунікації, оскільки він забезпечує чітко визначений стандарт для передачі повідомлень та даних. В першу чергу ви завантажили це на пристрій Datapower, щоб проксі-сервер обробляв ваш веб-сервіс.

Все це відбувається за протоколом HTTP, який вже використовує захищені сокети через SSL.

Для мобільного додатку веб-розетки не можуть знову підключитися до відключеного сеансу ( Як підключитися до веб-сокета після тісного з'єднання ) і керувати цим не тривіально. Так і для мобільних додатків я все-таки рекомендую API REST та опитування.

Ще одна річ, на яку слід звернути увагу при використанні WebSockets vs REST - це масштабованість . Сеансами WebSocket все ще керує сервер. API RESTful при правильному виконанні без стану (а це означає, що немає стану сервера, яким потрібно керувати), тому масштабованість може зростати горизонтально (що дешевше), ніж вертикально .


2

Чи хочу оновлення з сервера?

  • Так: Socket.io
  • Ні: REST

Недоліками Socket.io є:

  • Масштабованість: WebSockets вимагають відкритих підключень та значно іншого налаштування Ops для веб-масштабу.
  • Learnin: У мене немає необмеженого часу на навчання. Треба робити справи!

Я все одно буду використовувати Socket.io у своєму проекті, але не для основних веб-форм, які REST чудово зробить.


1

Транспорт на основі WebSockets (або тривалий опитування) в основному служить для (найближчого) спілкування в режимі реального часу між сервером і клієнтом. Хоча існують численні сценарії, коли потрібні такі види транспорту, як чат або якісь канали в режимі реального часу або інші речі, не всі частини певної веб-програми повинні бути обов'язково з'єднані двосторонньо із сервером.

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

Я припускаю, що з часом у майбутньому з'явиться більше орієнтованих на WebSockets фреймворків, таких як socketstream, коли цей транспорт буде більш розповсюдженим і краще зрозумілим / задокументованим у вигляді типу даних / форми агностичної доставки. Однак, я думаю, це не означає, що він / повинен замінити REST лише тому, що він пропонує функціонал, який не обов'язково потрібен у численних випадках використання та сценаріях.



-1

Це не дуже гарна ідея. Стандарт ще не доопрацьований, підтримка змінюється в різних браузерах і т. Д. Якщо ви хочете це зробити зараз, вам, в кінцевому підсумку, доведеться відпадати для спалаху чи тривалого опитування тощо. Надалі він, ймовірно, все ще не створить багато сенсу, оскільки сервер повинен підтримувати з'єднання відкритими для кожного користувача. Натомість більшість веб-серверів створені для того, щоб швидко відповідати на запити та закривати їх якомога швидше. Хак, навіть ваша операційна система повинна бути налаштована на роботу з великою кількістю одночасних з'єднань (кожне з'єднання використовує більше ефемерних портів і пам'яті). Дотримуйтесь використання REST для якомога більшої кількості сайтів.


Так, більшість веб-сервісів чудові на HTTP. Але node.js - це не веб-сервер, це бібліотека io. Це може зробити TCP просто чудово. По суті питання полягає в тому, чи можемо ми створити веб-сайти для використання TCP замість HTTP.
Райнос

Діють ті самі обмеження, як і раніше вичерпаєтеся ефемерними портами / пам'яттю, це все одно обмежить кількість людей, якими ви можете одночасно обслуговувати, і покладете непотрібне навантаження на систему.
zeekay

так, є обмеження, але я не думаю, що це така велика справа, якщо ви не створите новий потік за з'єднання.
Райнос

У мене вже є розетка для кожного користувача. глобальний чат + стрічка новин.
Гаррі

1
Я думаю, у 2011 році це було великим прихильником. - Отже, я бачу, звідки ти родом. Але в 2019 році веб-розетки дозріли.
bvdb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.