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.
sumber
Jawaban:
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 :
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:
a
dan kemudianb
, saya mendapatkan kembali hasila
dan kemudian hasilb
- 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 punAnda 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.
sumber
Sudah ada beberapa ide bagus di komentar, yang akan saya ulangi di sini:
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.
sumber
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.
sumber