Mengapa REST umum digunakan sebagai pengganti mekanisme mirip RPC dalam aplikasi web?

18

Saya mulai baru-baru ini di sebuah perusahaan yang menggunakan kerangka kerja kustom yang agak tidak biasa untuk aplikasi web mereka, setidaknya dibandingkan dengan kerangka kerja aplikasi web khas yang saya tahu. Alih-alih layanan web yang tenang, mekanisme RPC digunakan untuk berkomunikasi dengan server.

Berkomunikasi dengan server terlihat seperti pemanggilan fungsi sederhana, tetapi fungsi dieksekusi di server, bukan klien. Di sisi server ada cara untuk menentukan fungsi mana yang dapat dipanggil klien. Rincian tentang bagaimana ini diterjemahkan ke dalam permintaan http diabstraksikan sepenuhnya.

Saya hanya menggunakan ini dalam waktu singkat sekarang, tetapi tampaknya cukup nyaman. Tapi saya bertanya-tanya apa kelemahan dari pendekatan ini yang saya lewatkan. Semua orang tampaknya melakukannya secara berbeda, yang biasanya merupakan pertanda bagi saya bahwa saya mungkin melakukan sesuatu yang bodoh atau cemerlang, dengan peluang yang jauh lebih tinggi pada yang sebelumnya.

Vivian
sumber
5
Saya kira (tapi saya tidak 100% yakin jadi saya hanya akan meninggalkan ini sebagai komentar dan membiarkan seseorang yang benar - benar tahu barang mereka memposting jawaban yang tepat) bahwa REST digunakan lebih dari RPC karena antarmuka REST biasanya lebih mudah diterapkan , dan kurang tergantung pada kerangka / teknologi spesifik yang mendasarinya.
FrustratedWithFormsDesigner
11
Kesan saya adalah bahwa sebagian besar konsumen REST lebih peduli tentang memiliki http + json API sederhana daripada tentang REST sendiri.
CodesInChaos
4
Karena seluruh industri sudah gila.
Mike Nakis
Mungkin menarik bagi Anda stackoverflow.com/q/15056878/5934037
Laiv
1
Pendapat yang kontroversial: sebagian besar perbedaan antara REST dan RPC sebagian besar bersifat akademis.
whatsisname

Jawaban:

33

REST dirancang untuk web, dan web dirancang untuk REST. Keduanya pas akan bersama-sama. Tesis 2.000 PhD Roy Fielding, Gaya Arsitektur dan Desain Arsitektur Perangkat Lunak Berbasis Jaringan mendefinisikan dan memperkenalkan istilah REST , dan terdapat interaksi yang signifikan antara web dan REST: Roy Fielding bekerja pada HTTP / 1.1, di mana ia adalah penulis utama, dan dia menggunakan apa yang dia pelajari di sana untuk menggambarkan REST dalam disertasinya.

Jadi, alasan sederhana mengapa web dan REST berjalan sangat baik bersama adalah bahwa definisi REST diambil dari bagaimana web bekerja, dan web adalah implementasi dari REST.

Itu sebabnya REST sangat cocok untuk layanan web dan aplikasi web: karena Anda hanya melakukan hal yang sama yang telah terbukti bekerja di web "manusia", dan menerapkannya ke web "mesin".

Masalah besar dengan RPC (tergantung pada implementasi yang tepat ) pada dasarnya terletak pada Fallacy of Distributed Computing , yang dijelaskan secara lebih rinci dalam whitepaper ini oleh Arnon Rotem-Gal-Oz :

  1. Jaringan ini dapat diandalkan
  2. Latensi adalah nol
  3. Bandwidth tidak terbatas
  4. Jaringan aman
  5. Topologi tidak berubah
  6. Ada satu administrator
  7. Biaya transportasi nol
  8. Jaringannya homogen

Ini semua adalah asumsi yang biasanya dibuat oleh pendatang baru ketika mereka mulai membuat sistem terdistribusi. Tentu saja, semua itu salah. Dan Anda perlu memperhitungkan semuanya saat membuat sistem terdistribusi.

Masalah dengan banyak implementasi RPC adalah mereka mencoba membuat panggilan jarak jauh terlihat seperti panggilan lokal. Tetapi mereka tidak sama:

  • panggilan lokal tidak pernah gagal; yang subroutine yang Anda disebut mungkin gagal, tetapi panggilan itu sendiri tidak pernah melakukan - panggilan jarak jauh mungkin tersesat pada jaringan
  • panggilan lokal bersifat instan; yang subroutine yang Anda disebut dapat menjalankan untuk waktu yang lama (atau bahkan selamanya jika mendapat terjebak dalam infinite loop), namun panggilan itu sendiri membutuhkan waktu sama sekali (baik, beberapa petunjuk CPU paling banyak, kurang jika panggilan tersebut sebaris, tetapi sangat cepat) - panggilan jarak jauh mungkin macet di jaringan untuk waktu yang lama
  • jika subrutin kembali normal, hasilnya selalu kembali - dengan panggilan jarak jauh, hasilnya mungkin hilang di jaringan
  • pengembalian bersifat instan - hasil jarak jauh dapat melakukan perjalanan di jaringan untuk waktu yang lama
  • jika saya memanggil subrutin sekali, itu akan berjalan tepat sekali - panggilan jarak jauh mungkin hilang di jaringan, atau digandakan sehingga rutin jarak jauh dapat berjalan antara 0 dan berapa kali
  • Saya mendapatkan kembali tepat satu hasil - hasil jarak jauh mungkin hilang atau terduplikasi, sehingga Anda bisa mendapatkan hasilnya 0 kali atau lebih
  • jika saya memanggil subrutin dua kali, saya mendapatkan dua hasil dan saya mendapatkan hasil dari panggilan pertama sebelum hasil dari panggilan kedua - Anda mungkin dapat menebaknya sekarang: dengan RPC, Anda mungkin tidak mendapatkan kembali hasil, atau hanya yang pertama , atau hanya yang kedua, atau yang kedua sebelum yang pertama, atau yang pertama bisa hilang dan Anda mendapatkan yang kedua dua kali, atau sebaliknya, dan seterusnya ...
  • jika saya menelepon adan kemudian b, saya mendapatkan kembali hasil adan kemudian hasil b - ini hanya versi yang lebih umum dari poin sebelumnya, dengan RPC, Anda dapat memperoleh salah satu dari dua jawaban 0 kali atau lebih dalam urutan apa pun

Anda akan harus berurusan dengan semua di atas untuk panggilan jarak jauh. Tetapi jika kerangka kerja Anda membuat panggilan jarak jauh tidak dapat dibedakan dari panggilan lokal, maka Anda tidak bisa , karena Anda tidak tahu mana yang merupakan panggilan jarak jauh. Kerangka kerja mungkin mencoba dan menangani semua itu untuk Anda, tetapi masalahnya adalah: kerangka kerja tidak tahu sebanyak mungkin tentang sistem Anda. Tidak tahu apakah ada panggilan di mana sebenarnya tidak masalah jika seseorang tersesat sesekali. Jadi, kerangka kerjanya harus sangat defensif, dan itu mahal dalam hal latensi dan bandwidth.

Terutama karena kerangka itu sebenarnya tidak bisa melindungi Anda. The CAP Teorema mengatakan bahwa sebuah sistem terdistribusi tidak bisa Konsisten, Tersedia, dan Partisi-Toleransi pada saat yang sama; lebih tepatnya, dikatakan bahwa begitu Partisi terjadi, sistem tidak dapat terus menjadi Konsisten dan Tersedia, ia harus memilih satu (bertentangan dengan kepercayaan populer, teorema tidak mengatakan bahwa Anda tidak dapat memiliki ketiganya, ketika sistem sedang berjalan biasanya, Anda dapat memiliki ketiganya, tetapi begitu Anda memiliki Partisi, Anda harus memilih salah satu dari dua lainnya). The PACELC Teorema memperluas CAP Teorema dengan menunjukkan bahwa bahkan ketika sistem bekerja, Anda harus trade-off Latency vs Konsistensi.

Ini adalah kompromi penting yang tidak dapat dilindungi oleh kerangka kerja Anda, karena mereka spesifik domain dan penting bagi desain inti.

Kontras ini dengan pendekatan seperti Erlang, yang tidak bekerja: di Erlang, semua pesan mengirimkan diperlakukan sebagai terpencil, bahkan jika mereka lokal. Ini berarti Anda selalu siap untuk menghadapi semua masalah di atas (dan banyak lagi). Untuk proses lokal, ini memang menimbulkan sedikit overhead. Untuk membantu ini, ada banyak alat, kerangka kerja, perpustakaan, pola, dan idiom untuk menangani penanganan kesalahan dan pengawasan.

Anda belum menjelaskan bagaimana kerangka kerja RPC Anda bekerja secara khusus, dan bahasa atau pustaka apa yang Anda gunakan, tetapi saya memiliki kecurigaan kuat bahwa itu termasuk jenis "pura-pura jaringan tidak ada". Itu tidak bekerja. Tidak apa - apa untuk menghapus perbedaan antara panggilan lokal dan jarak jauh dengan memperlakukan semuanya sebagai panggilan jarak jauh . Melakukannya sebaliknya terlalu banyak abstrak: jaringan adalah bagian dari sistem Anda, jika Anda abstrak itu, Anda abstrak sesuatu yang benar - benar perlu Anda ketahui.

Sekarang, apakah Anda harus secara khusus menggunakan REST atau tidak, itu pertanyaan yang sama sekali berbeda. Seperti yang saya jelaskan di atas, web dirancang untuk REST dan SISA dirancang untuk web, sehingga dua lakukan masuk akal bersama-sama, tetapi Anda dapat menggunakan gaya arsitektur lain, jika Anda ingin. Tetapi setidaknya sebagian dari pertanyaan Anda adalah tentang "mengapa tidak RPC", dan saya menjelaskan alasan di atas, lebih tepatnya saya menjelaskan mengapa jenis RPC yang saya duga Anda gunakan dapat membuat Anda dalam masalah.

Jörg W Mittag
sumber
Bukankah standardisasi juga merupakan masalah (mengingat bahwa tidak ada pemetaan 1: 1 antara HTTP dan RPC)?
Jimmy T.
Ya, ada kerangka Model Aktor yang menangani semua masalah ini.
Robert Harvey
Tentu saja, yang diperlukan adalah beberapa individu yang antusias untuk membuat lapisan abstraksi di atas antarmuka REST dan dengan cepat menjadi tidak dapat dibedakan dari antarmuka RPC.
whatsisname
1
Kesalahan lain dari komputasi terdistribusi: klien dan server memperbarui pada saat yang sama.
Jack
@ Jack: Itu digolongkan oleh fallacy "Hanya ada satu administrator". Disebutkan dalam whitepaper: ...
Jörg W Mittag
5

Sudah ada beberapa ide bagus di komentar, yang akan saya ulangi di sini:

  1. RPC biasanya khusus untuk teknologi.
  2. Yang paling diminati pengembang adalah JSON, bukan REST.

JSON memiliki kualitas yang sangat bagus. Ini sederhana, mudah bagi manusia untuk membaca, mudah bagi komputer untuk mem-parsing, dan Javascript secara langsung mengenalinya secara asli (karena, Anda tahu, notasi objek Javascript ).

Jika Anda ingin menghilangkan batasan seperti REST, Anda dapat melakukan hampir semua yang Anda inginkan dengan JSON, termasuk panggilan prosedur jarak jauh. Yang harus Anda lakukan adalah membuat protokol yang sesuai. Bahkan, protokol semacam itu sudah ada: JSON-RPC.

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

RPC dan REST hanya pendekatan yang berbeda dengan pro dan kontra dan keduanya bernilai tergantung pada konteksnya. REST paling baik dijelaskan untuk bekerja dengan sumber daya, sedangkan RPC lebih banyak tentang tindakan. Klien RPC secara erat digabungkan dengan implementasi layanan dalam beberapa cara dan menjadi sangat sulit untuk mengubah implementasi layanan tanpa melanggar klien.

Kamal Hossain
sumber