Чому в веб-додатках зазвичай використовується REST замість механізмів, подібних до RPC?


18

Я почав зовсім недавно в компанії, яка використовує досить незвичну власну рамку для своїх веб-додатків, принаймні порівняно з типовими рамками веб-додатків, які я знаю. Замість RESTful веб-сервісу для зв'язку з сервером використовується механізм RPC.

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

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


5
Я б здогадався (але я не впевнений на 100%, тому я просто залишу це як коментар, і нехай хтось, хто справді знає їхні речі, розмістить належну відповідь), що REST використовується більше, ніж RPC, оскільки інтерфейси REST зазвичай простіші в реалізації , і менш залежать від конкретних базових рамок / технологій.
FrustratedWithFormsDesigner

11
Моє враження, що більшість користувачів REST більше дбають про те, щоб мати простий http + json API, ніж про сам REST.
CodesInChaos

4
Тому що вся галузь зійшла з розуму.
Майк Накіс

Це може зацікавити вас stackoverflow.com/q/15056878/5934037
LAIV

1
Суперечлива думка: здебільшого відмінності між REST та RPC здебільшого є академічними.
whatsisname

Відповіді:


33

REST був розроблений для Інтернету, а веб - для REST. Двоє просто підходять разом. Докторська дисертація Роя Філдінга 2000 р. " Архітектурні стилі та дизайн мережевих програмних архітектур" визначила і ввела термін REST , і між Інтернетом та REST існує значна взаємозв'язок: Рой Філдінг працював над HTTP / 1.1, головним автором якого є, і він використав те, що там дізнався, щоб описати REST у своїй дисертації.

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

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

Велика проблема з RPC ( в залежності від точної реалізації) лежить в основному в Хибні уявлення заважають розподілених обчислень , які більш детально описані в цьому документі по Арнон Ротем-Гал-Оз :

  1. Мережа надійна
  2. Затримка дорівнює нулю
  3. Пропускна здатність нескінченна
  4. Мережа захищена
  5. Топологія не змінюється
  6. Є один адміністратор
  7. Вартість транспорту дорівнює нулю
  8. Мережа однорідна

Це все припущення, які зазвичай роблять новачки, коли вони починають створювати розподілені системи. Звичайно, всі вони помилкові. І їх потрібно враховувати при створенні розподілених систем.

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

  • місцевий дзвінок ніколи не виходить з ладу; підпрограми , які ви назвали , може потерпіти невдачу, але виклик сам ніколи не робить - віддалений виклик може заблукати в мережі
  • місцевий дзвінок миттєвий; підпрограма , що ви назвали , може працювати в протягом тривалого часу (або навіть назавжди , якщо він застряє в нескінченному циклі), але виклик сам по собі не має взагалі ніякого часу (ну, кілька інструкцій процесора в кращому випадку , менше , якщо виклик вбудований, але це дуже швидко) - віддалений дзвінок може застрягти в мережі на тривалий час
  • якщо підпрограма повертається нормально, результат завжди повертається - при віддаленому дзвінку результат може загубитися в мережі
  • віддача миттєва - віддалені результати можуть довго подорожувати по мережі
  • якщо я зателефоную підпрограмі один раз, вона запуститься рівно один раз - віддалений виклик може загубитися в мережі або дублюватися, так що віддалена програма може працювати між 0 і будь-якою кількістю разів
  • Я повертаю рівно один результат - віддалений результат може втрачатися або дублюватися, тож ви можете отримати результат 0 і більше разів
  • якщо я дзвоню в підпрограму двічі, я отримую два результати, і я отримую результат першого дзвінка перед результатом другого виклику - ви, напевно, можете це здогадатися вже зараз: з RPC ви можете отримати жодних результатів або лише перший , або тільки другий, або другий перед першим, або перший може бути загублений, і ви отримуєте другий двічі, або навпаки, і так далі ...
  • якщо я дзвоню aі потім b, я отримую результат, aа потім результат b - це просто більш загальна версія попереднього пункту, з RPC, ви можете отримати будь-який з двох відповідей 0 або більше разів у будь-якому порядку

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

Тим більше, що рамка насправді не може захистити вас. CAP теорема говорить про те , що розподілена система не може бути послідовною, в наявності, і секції Стійкі в той же час; точніше, це говорить про те, що як тільки відбувається Розділ, система не може продовжувати бути послідовною і доступною, вона повинна вибрати один (всупереч поширеній думці, теорема не говорить про те, що у вас не може бути всіх трьох, коли система працює як правило, ви можете мати усі три, але як тільки у вас є розділ, ви повинні вибрати один з двох інших). PACELC теорема розширює CAP теорему, показавши , що навіть тоді , коли система працює, ви повинні знайти компроміс латентності по порівнянні з консистенцією.

Це важливі компроміси, від яких рамки практично не можуть захистити вас, оскільки вони є доменними і важливими для основної конструкції.

Порівняйте це з підходом , як Erlang, який робить роботу: в Erlang, все повідомлення посилів розглядаються як віддалені, навіть якщо вони є локальними. Це означає, що ви завжди готові вирішити всі вищезазначені проблеми (та багато іншого). Для локальних процесів вони, однак, створюють трохи накладні витрати. Для того, щоб допомогти у цьому, існує велика кількість інструментів, рамок, бібліотек, шаблонів та ідіом для вирішення проблем та контролю над помилками.

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

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


Чи не є проблемою і стандартизація (враховуючи, що між HTTP та RPC немає зіставлення 1: 1)?
Джиммі Т.

Ну, є рамки моделі Actor Model, які вирішують усі ці проблеми.
Роберт Харві

Звичайно, все, що потрібно, - це певний ентузіазм, щоб створити шар абстракції через інтерфейс REST, і він швидко стає невідрізним від інтерфейсу RPC.
whatsisname

1
Ще одна помилка розподілених обчислень: клієнти та сервери оновлюються одночасно.
Джек

@Jack: Це стосується помилки "Є лише один адміністратор". Він згадується в дописі:…
Jörg W Mittag

5

У коментарях вже є кілька хороших ідей, які я повторю тут:

  1. RPC, як правило, залежить від технології.
  2. Що розробників найбільше цікавить - це JSON, а не REST.

JSON має дуже приємні якості. Людина проста, легка для читання, комп'ютер проста для розбору, і Javascript миттєво розпізнає це на самому собі (це, знаєте, позначення об'єкта Javascript ).

Якщо ви готові відмовитися від обмежень, таких як REST, ви можете робити майже все, що завгодно, з JSON, включаючи виклики з віддаленою процедурою. Все, що вам потрібно зробити - це встановити відповідний протокол. Насправді такий протокол вже існує: JSON-RPC.

--> {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1}
<-- {"jsonrpc": "2.0", "result": 19, "id": 1}

-1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.