Saya telah digunakan SignalR
untuk mencapai fungsionalitas pengiriman pesan langsung di beberapa proyek saya. Tampaknya bekerja dengan andal dan sangat mudah dipelajari untuk digunakan.
Godaan, setidaknya bagi saya, adalah meninggalkan pengembangan layanan Web API dan gunakan SignalR
untuk semuanya.
Saya merasa ini bisa dicapai dengan desain yang bijaksana, dan jika ya, itu berarti jauh lebih sedikit kode klien yang diperlukan. Lebih penting lagi, itu akan berarti bahwa akan ada satu antarmuka untuk layanan daripada antarmuka terpisah, dan dalam kasus terburuk, bahwa seseorang dapat menghubungkan ini tanpa memikirkan kapan hal-hal ditampilkan, dll.
Jadi, saya ingin tahu:
- Apakah ada alasan lain untuk tidak menggunakan SignalR sebagai pengganti semua layanan web selain kinerja?
- Apakah kinerja SignalR cukup memprihatinkan sehingga tidak masuk akal untuk melakukannya?
Sudah lama menjadi impian saya untuk dapat menerjemahkan objek sisi server dan definisi layanan ke kode akses layanan sisi klien tanpa sesuatu yang konyol seperti node.js
. Misalnya, jika saya mendefinisikan objek yang menarik InterestingObject
dan layanan ke CRUD
objek tersebut InterestingObjectService
, saya dapat menentukan rute URL standar ke layanan - katakan, "/ {serviceName} / {methodName}" - tetapi saya masih perlu menulis kode klien untuk mengakses pelayanan. Karena objek akan diteruskan dari klien ke server dan kembali, tidak ada alasan praktis untuk memilikinyauntuk mendefinisikan objek secara eksplisit dalam kode sisi klien, dan juga tidak perlu secara eksplisit menentukan rute untuk melakukan operasi CRUD. Saya merasa seperti harus ada cara untuk membakukan semua ini sehingga memungkinkan untuk menulis klien dengan asumsi bahwa akses layanan berfungsi dari klien ke server dan kembali secara transparan seperti ketika saya menulis WinForms atau Java Applet atau Aplikasi Asli atau apa pun.
Jika SignalR cukup baik untuk digunakan sebagai pengganti layanan web tradisional, itu mungkin cara yang layak untuk mencapai ini. SignalR sudah menyertakan fungsionalitas untuk membuat hub berfungsi seperti layanan yang saya jelaskan, sehingga saya bisa mendefinisikan layanan common base (CRUD) yang akan menawarkan semua fungsionalitas ini di luar kotak dengan beberapa refleksi. Kemudian saya hampir dapat menerima akses layanan yang diberikan, menyelamatkan saya dari gangguan penulisan ulang kode untuk mengakses sesuatu yang dapat diakses dengan konvensi - dan yang lebih penting, waktu saya harus menghabiskan kode menulis untuk menentukan bagaimana ini diperbarui di DOM.
Setelah membaca hasil edit saya, saya merasa sedikit tidak masuk akal, jadi silakan bertanya kepada saya jika Anda memiliki pertanyaan tentang apa yang saya maksud. Pada dasarnya, saya ingin akses layanan setransparan mungkin.
sumber
Jawaban:
Kedua teknologi tersebut memiliki tujuan yang sangat berbeda.
REST untuk panggilan biasa ke API, dengan klien menjadi aktor aktif dari pertukaran. Ketika klien perlu menemukan koordinat GPS dari suatu alamat, klien memulai panggilan ke API dan menunggu sampai menerima koordinat, atau kesalahan terjadi, atau waktu habis berlalu.
Soket web adalah untuk segala sesuatu yang perlu melakukan hal-hal yang berlawanan. Misalnya, ketika saya menggunakan situs web intranet yang menunjukkan kepada saya secara real time log dan kinerja server yang berbeda, klien mungkin pasif dan menunggu sampai server mengiriminya pesan log yang baru diterbitkan atau metrik kinerja.
Perbedaannya jelas: dalam kasus pertama, klien memutuskan kapan ia membutuhkan informasi tertentu; dalam kasus kedua, klien hanya menunggu untuk dihubungi, dan mungkin tidak tahu kapan akan dihubungi.
Dalam beberapa cara, keduanya dapat dipertukarkan: Anda dapat menerapkan soket web saat Anda tidak membutuhkannya (yaitu klien akan memanggil server melalui soket web alih-alih membuat panggilan REST) dan Anda dapat menggunakan polling atau polling panjang sebagai pengganti soket web (mengingat bahwa ini digunakan dengan sukses selama bertahun-tahun sampai soket web menjadi sangat populer).
Tetapi pertukaran mereka membutuhkan biaya:
Saat Anda menggunakan polling atau polling panjang alih-alih soket web, Anda sering membuang-buang bandwidth.
Ketika Anda menggunakan soket web untuk melakukan apa yang dapat dilakukan melalui api web, Anda tetap membuka semua koneksi dari semua klien aktif, yang mungkin bukan yang Anda inginkan. Untuk situs web kecil tempat Anda berharap memiliki paling banyak 5 klien pada saat bersamaan, ini bukan masalah. Untuk layanan seperti Amazon AWS, ini tidak akan mudah dipecahkan secara teknis.
Jangan gunakan soket web saat Anda tidak membutuhkannya. Untuk mendapatkan koordinat GPS dari suatu alamat, saya tidak memperoleh apa-apa dalam membuka koneksi soket web, melakukan panggilan, menunggu jawaban dan menutup koneksi: REST memenuhi kebutuhan saya untuk skenario seperti itu.
Jika Anda menemukan diri Anda berulang kali dan sering memeriksa informasi melalui panggilan REST ke suatu layanan, ini mungkin pertanda baik bahwa Anda harus pindah ke soket web. Demikian pula, Stack Overflow mengurangi penggunaan bandwidth dengan menggunakan soket web, karena ini membantu orang untuk tidak menghabiskan waktu mereka menekan F5 di halaman rumah untuk melihat apakah mereka memiliki pesan baru.
Jika Anda menemukan Anda membuka koneksi soket web, gunakan itu untuk melakukan satu panggilan, dan kemudian tutup, atau jika koneksi Anda tetap terbuka tetapi server mengirimkan sesuatu ke klien hanya atas permintaan klien, beralihlah ke REST.
Soket web juga masih memiliki dukungan terbatas dan tidak selalu mudah diterapkan. Walaupun SignalR membuatnya mudah untuk diimplementasikan, ini tidak berarti bahwa Anda tidak akan mengalami kesulitan untuk mengimplementasikannya dalam bahasa / konteks / lingkungan lain. Dengan REST, itu mudah: itu mungkin
curl
panggilan atau fitur serupa yang tersedia di setiap bahasa utama. Dengan soket web, Anda tidak dapat memastikan berapa lama untuk membuat klien menggunakan [masukkan nama bahasa yang belum Anda ketahui di sini].Saya telah menggunakan soket web di beberapa proyek di .NET, Python dan node.js.
Di. NET, itu tidak terlalu sulit, tapi tetap saja, saya masih menghabiskan beberapa hari untuk mencari tahu beberapa masalah samar, seperti koneksi turun segera setelah dibuka. (Ini sebelum SignalR; Saya tidak pernah mencoba SignalR). Saya juga menggunakan WCF dalam mode soket web, yang juga bukan tanpa masalah (tapi saya percaya bahwa WCF selalu disertai masalah).
Di node.js, ini bisa dilakukan, tapi saya harus beralih dua kali perpustakaan sampai saya menemukan yang berfungsi. Saya percaya saya telah menghabiskan setidaknya seminggu mencoba membuat soket web Hello World.
Dengan Python, saya mencoba sekali, menghabiskan dua atau tiga hari, dan ditinggalkan. Itu tidak pernah berhasil.
Bandingkan ini dengan REST: satu-satunya masalah yang dapat dihadapi seseorang dengan bahasa / kerangka kerja baru adalah mengetahui cara mengirim file POST atau menerima respons biner yang sangat besar. Saya ingat menghabiskan beberapa jam mencari solusi untuk beberapa bahasa. Namun, beberapa jam untuk kasus khusus tidak ada artinya dibandingkan dengan hari atau minggu untuk Hello World yang sederhana.
sumber
Hanya 2 sen saya ...
Saya pikir ini bukan tentang kinerja atau apa pun. Ini tentang standar. REST adalah standar dan IMHO memiliki keunggulan sebagai berikut:
sumber