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?

Jawaban:


92

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.


180
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:

Connection.Broadcast(new {
    method: "addNewMessageToPage",
    name: "Albert",
    message: "Hello"
});

Dan pada klien, bukan hanya mendefinisikan

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.

Selain itu, lihat kutipan ini dari dokumentasi :

Memilih model komunikasi

Sebagian besar aplikasi harus menggunakan Hubs API. API Koneksi dapat digunakan dalam kondisi berikut:

  • Format pesan aktual yang dikirim perlu ditentukan.

  • Pengembang lebih suka bekerja dengan model pengiriman pesan dan pengiriman daripada model doa jarak jauh.

  • Aplikasi yang sudah ada yang menggunakan model pesan sedang porting untuk menggunakan SignalR.

Bergantung pada struktur pesan Anda, Anda mungkin juga mendapatkan sedikit keuntungan dari menggunakan PersistentConnection.

Anda mungkin ingin melihat contoh SignalR, khususnya di sini.


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.


5

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


4

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.