SignalR: Mengapa memilih Hub vs Koneksi Persisten?
150
Saya telah mencari dan membaca di SignalR baru-baru ini dan, sementara saya melihat banyak penjelasan tentang apa perbedaan antara Hub dan Sambungan Persisten saya belum bisa mendapatkan kepala saya di tingkat berikutnya, itulah sebabnya saya akan pilih satu pendekatan dari yang lain?
Dari apa yang saya lihat di bagian Connection and Hubs, Hub tampaknya menyediakan sistem topik overlay koneksi persisten tingkat rendah.
Dari komentar sangat terpilih di bawah ini:
Sebagian benar. Anda bisa mendapatkan topik atau grup dalam koneksi persisten juga. Perbedaan besar adalah pengiriman berbagai jenis pesan. Misalnya Anda memiliki berbagai jenis pesan dan Anda ingin mengirim berbagai jenis muatan. Dengan koneksi terus-menerus Anda harus menanamkan tipe pesan di payload (lihat Sampel mentah) tetapi hub memberi Anda kemampuan untuk melakukan RPC melalui koneksi (memungkinkan Anda memanggil metode pada klien dari server dan dari server ke klien) . Hal besar lainnya adalah mengikat model. Hub memungkinkan Anda untuk melewati parameter yang diketik dengan sangat baik ke metode.
Contoh yang digunakan dalam dokumentasi menggunakan metafora ruang obrolan, di mana pengguna dapat bergabung dengan ruang tertentu dan kemudian hanya menerima pesan dari pengguna lain di ruang yang sama. Secara lebih umum, kode Anda berlangganan suatu topik dan kemudian hanya menerima pesan yang dipublikasikan ke topik itu. Dengan koneksi yang terus-menerus Anda akan mendapatkan semua pesan.
Anda dapat dengan mudah membangun sistem topik Anda sendiri di atas koneksi yang persisten, tetapi dalam hal ini tim SignalR telah bekerja untuk Anda.
Sebagian benar. Anda bisa mendapatkan topik atau grup dalam koneksi persisten juga. Perbedaan besar adalah pengiriman berbagai jenis pesan. Misalnya Anda memiliki berbagai jenis pesan dan Anda ingin mengirim berbagai jenis muatan. Dengan koneksi terus-menerus Anda harus menanamkan tipe pesan di payload (lihat Sampel mentah) tetapi hub memberi Anda kemampuan untuk melakukan RPC melalui koneksi (memungkinkan Anda memanggil metode pada klien dari server dan dari server ke klien) . Hal besar lainnya adalah mengikat model. Hub memungkinkan Anda untuk melewati parameter yang diketik dengan sangat baik ke metode.
davidfowl
1
Good point @davidfowl - Saya telah menyalin komentar Anda ke dalam jawaban karena saya pikir itu harus lebih menonjol.
ColinE
63
Perbedaan utama adalah bahwa Anda tidak dapat melakukan RPC dengan PersistentConnection, Anda hanya dapat mengirim data mentah. Jadi alih-alih mengirim pesan dari server seperti ini
Clients.All.addNewMessageToPage(name, message);
Anda harus mengirim objek dengan Connection.Broadcast()atau Connection.Send()dan kemudian klien harus memutuskan apa yang harus dilakukan dengan itu. Anda dapat, misalnya, mengirim objek seperti ini:
yourHub.client.addNewMessageToPage =function(name, message){// things and stuff};
Anda harus menambahkan panggilan balik untuk menangani semua pesan yang masuk:
function addNewMessageToPage(name, message){// things and stuff}
connection.received(function(data){var method = data.method;
window[method](data.name, data.message);});
Anda harus melakukan pengiriman yang sama di sisi server dalam OnReceivedmetode ini. Anda juga harus melakukan deserialisasi data string di sana daripada menerima objek yang sangat diketik seperti yang Anda lakukan dengan metode hub.
Tidak ada banyak alasan untuk memilih PersistentConnection daripada Hubs. Salah satu alasan yang saya ketahui adalah bahwa mungkin untuk mengirim JSON preserialisasi melalui PersistentConnection, yang tidak dapat Anda lakukan menggunakan hub. Dalam situasi tertentu, ini mungkin manfaat kinerja yang relevan.
Salah satu rekan kerja saya mengatakan kepada saya alasan dia memilih PersistentConnection atas Hubs adalah alasan keamanan, apakah ada masalah keamanan di Hubs atau sesuatu?
Mehdi Dehghani
24
Ada dua cara untuk menggunakan SignalR: Anda dapat mengaksesnya pada level rendah dengan meng-override PersistentConnectionkelasnya, yang memberi Anda banyak kontrol atasnya; atau Anda dapat membiarkan SignalR melakukan semua pekerjaan berat untuk Anda, dengan menggunakan 'Hub' tingkat tinggi.
Koneksi Persisten adalah API tingkat lebih rendah, Anda dapat melakukan tindakan pada waktu yang lebih spesifik ketika koneksi dibuka atau ditutup, di sebagian besar aplikasi Hub adalah pilihan terbaik
Ada tiga poin utama yang perlu dipertimbangkan ketika membandingkan kedua hal ini:
Format pesan
Model komunikasi
Kustomisasi SignalR
Dengan hubs, pemformatan pesan pada dasarnya ditangani dari Anda, tetapi dengan koneksi yang terus-menerus pesannya mentah dan telah di token dan diurai bolak-balik. Jika ukuran pesan itu penting, maka perhatikan juga bahwa payload dari koneksi persisten jauh lebih kecil daripada hub.
Ketika datang ke model komunikasi koneksi persisten pada dasarnya memiliki fungsi untuk mengirim dan menerima pesan sementara hub mengambil model panggilan prosedur jarak jauh dengan fungsi unik sesuai kebutuhan.
Ketika datang ke kustomisasi karena koneksi persisten lebih rendah tingkatnya, mereka dapat memberi Anda lebih banyak kontrol atas kustomisasi.
Perbedaan utama adalah bahwa Anda tidak dapat melakukan RPC dengan PersistentConnection, Anda hanya dapat mengirim data mentah. Jadi alih-alih mengirim pesan dari server seperti ini
Anda harus mengirim objek dengan
Connection.Broadcast()
atauConnection.Send()
dan kemudian klien harus memutuskan apa yang harus dilakukan dengan itu. Anda dapat, misalnya, mengirim objek seperti ini:Dan pada klien, bukan hanya mendefinisikan
Anda harus menambahkan panggilan balik untuk menangani semua pesan yang masuk:
Anda harus melakukan pengiriman yang sama di sisi server dalam
OnReceived
metode ini. Anda juga harus melakukan deserialisasi data string di sana daripada menerima objek yang sangat diketik seperti yang Anda lakukan dengan metode hub.Tidak ada banyak alasan untuk memilih PersistentConnection daripada Hubs. Salah satu alasan yang saya ketahui adalah bahwa mungkin untuk mengirim JSON preserialisasi melalui PersistentConnection, yang tidak dapat Anda lakukan menggunakan hub. Dalam situasi tertentu, ini mungkin manfaat kinerja yang relevan.
Selain itu, lihat kutipan ini dari dokumentasi :
Bergantung pada struktur pesan Anda, Anda mungkin juga mendapatkan sedikit keuntungan dari menggunakan PersistentConnection.
Anda mungkin ingin melihat contoh SignalR, khususnya di sini.
sumber
Ada dua cara untuk menggunakan SignalR: Anda dapat mengaksesnya pada level rendah dengan meng-override
PersistentConnection
kelasnya, yang memberi Anda banyak kontrol atasnya; atau Anda dapat membiarkan SignalR melakukan semua pekerjaan berat untuk Anda, dengan menggunakan 'Hub' tingkat tinggi.sumber
Koneksi Persisten adalah API tingkat lebih rendah, Anda dapat melakukan tindakan pada waktu yang lebih spesifik ketika koneksi dibuka atau ditutup, di sebagian besar aplikasi Hub adalah pilihan terbaik
sumber
Ada tiga poin utama yang perlu dipertimbangkan ketika membandingkan kedua hal ini:
Dengan hubs, pemformatan pesan pada dasarnya ditangani dari Anda, tetapi dengan koneksi yang terus-menerus pesannya mentah dan telah di token dan diurai bolak-balik. Jika ukuran pesan itu penting, maka perhatikan juga bahwa payload dari koneksi persisten jauh lebih kecil daripada hub.
Ketika datang ke model komunikasi koneksi persisten pada dasarnya memiliki fungsi untuk mengirim dan menerima pesan sementara hub mengambil model panggilan prosedur jarak jauh dengan fungsi unik sesuai kebutuhan.
Ketika datang ke kustomisasi karena koneksi persisten lebih rendah tingkatnya, mereka dapat memberi Anda lebih banyak kontrol atas kustomisasi.
sumber