socket.io kamar atau ruang nama?

163

Saya sedang menyelidiki nodejs / socket.io untuk obrolan waktu nyata, dan saya butuh saran untuk mengimplementasikan kamar.

Mana yang lebih baik, menggunakan namespace atau menggunakan fitur kamar untuk benar-benar mengisolasi masing-masing obrolan?

apa perbedaan teknis nyata antara kamar dan ruang nama?

Apakah ada perbedaan penggunaan sumber daya?

Joseph
sumber

Jawaban:

216

Ini adalah kesamaan ruang nama dan ruang (socket.io v0.9.8 - harap dicatat bahwa v1.0 melibatkan penulisan ulang yang lengkap, sehingga hal-hal mungkin telah berubah):

  • Ruang nama ( io.of ('/ nsp') ) dan kamar ( socket.join ('room') ) dibuat di sisi server
  • Beberapa ruang nama dan beberapa kamar berbagi koneksi (WebSocket) yang sama
  • Server akan mengirimkan pesan melalui kawat hanya ke klien yang terhubung ke / bergabung dengan nsp / kamar, artinya bukan hanya pemfilteran sisi klien

The perbedaan :

  • namespaces terhubung oleh klien menggunakan io.connect(urlAndNsp)(klien akan ditambahkan ke namespace hanya jika sudah ada di server)
  • kamar hanya bisa digabung di sisi server (meskipun membuat API di sisi server agar klien dapat bergabung dengan mudah)
  • ruang nama dapat dilindungi otorisasi
  • otorisasi tidak tersedia dengan kamar , tetapi otorisasi khusus dapat ditambahkan ke API yang disebutkan sebelumnya dan mudah dibuat di server, jika seseorang ingin menggunakan kamar
  • kamar adalah bagian dari namespace (default ke namespace 'global')
  • ruang nama selalu berakar dalam lingkup global

Untuk tidak membingungkan konsep dengan nama (ruang atau namespace), saya akan menggunakan kompartemen untuk merujuk pada konsep, dan dua nama lainnya untuk implementasi konsep. Jadi jika kamu

  • membutuhkan otorisasi per kompartemen , ruang nama mungkin merupakan rute termudah untuk diambil
  • jika Anda ingin kompartemen berlapis hierarkis (maks 2 lapisan), gunakan kombo namespace / ruang
  • jika aplikasi sisi klien Anda terdiri dari bagian-bagian berbeda yang (tidak peduli dengan kompartemen tetapi) perlu dipisahkan satu sama lain, gunakan ruang nama.

Contoh untuk yang terakhir adalah aplikasi klien besar di mana modul yang berbeda, mungkin dikembangkan secara terpisah (misalnya pihak ketiga), masing-masing menggunakan socket.io secara independen, sedang digunakan dalam aplikasi yang sama dan ingin berbagi koneksi jaringan tunggal.

Tidak benar-benar membandingkan ini, menurut saya jika Anda hanya perlu kompartemen sederhana dalam proyek Anda untuk memisahkan dan mengelompokkan pesan, salah satunya baik-baik saja.

Tidak yakin apakah itu menjawab pertanyaan Anda, tetapi penelitian yang mengarah ke jawaban ini setidaknya membantu saya melihat lebih jelas.

Eugene Beresovsky
sumber
5
Apakah ada hal besar yang berubah setelah versi socket.io> = 1.0?
Xeroxoid
2
Perubahan pada versi terakhir, baca socket.io/docs/rooms-and-namespaces dan jawaban ini dapat berguna untuk memahami hal-hal kamar stackoverflow.com/questions/24041220/…
Gonzalo Bahamondez
1
Bisakah kita mengatakan namespace adalah area tertentu dari aplikasi web saya dan ruang sekelompok klien di area itu?
Onaiggac
Bisakah Anda menambahkan sesuatu tentang saat memutuskan sambungan dari ruang / namespace. Apa yang terjadi pada mereka ketika klien memutus atau kehilangan koneksi sementara. Di sini tertulis: Setelah pemutusan, soket meninggalkan semua saluran mereka bagian dari secara otomatis, dan tidak ada teardown khusus diperlukan pada bagian Anda. Apakah Saluran sama dengan Kompartemen Anda ?
Wilt
67

Ini adalah pertanyaan lama tetapi setelah melakukan penelitian pada topik saya menemukan bahwa jawaban yang diterima tidak jelas pada poin penting. Menurut Guillermo Rauch sendiri ( lihat tautan ): meskipun secara teori dimungkinkan untuk membuat ruang nama secara dinamis pada aplikasi yang sedang berjalan, Anda menggunakannya terutama sebagai bagian terpisah dari aplikasi Anda. Jika, di sisi lain Anda perlu membuat kompartemen ad hoc, on the fly, untuk mengakomodasi kelompok pengguna / koneksi, yang terbaik adalah menggunakan kamar.

Julio Garcia
sumber
3
Suka itu! Namespaces - Koneksi yang ditentukan sebelumnya. Kamar - Koneksi Dinamis
Nandakumar
16

Itu tergantung apa yang ingin Anda lakukan.

Perbedaan utama adalah kamar lebih sulit untuk diimplementasikan. Anda harus membuat metode untuk bergabung dengan kamar dengan setiap ulang halaman.

Dengan ruang nama Anda hanya perlu menulis var example = io.connect('http://localhost/example');di klien javascript Anda dan klien secara otomatis ditambahkan dalam ruang nama.

Contoh pemanfaatan:

  • kamar: obrolan pribadi.
  • namespaces: obrolan halaman.

sumber
2

Kamar dan ruang komunikasi segmen dan soket grup individu.

Siaran ke sebuah ruangan atau ruang nama tidak akan menjangkau semua orang hanya anggota.

Perbedaan antara ruang nama dan kamar adalah sebagai berikut:

  • Namespaces: dikelola dalam frontend yang berarti pengguna, atau penyerang, bergabung melalui frontend dan penggabungan dan pemutusan diatur di sini.
  • Kamar: dikelola di backend, artinya server ditugaskan untuk bergabung dan meninggalkan kamar.

Perbedaannya adalah siapa yang mengelola mereka

Untuk memutuskan apa yang akan digunakan, Anda harus memutuskan apakah segmentasi harus dikelola di frontend atau di backend

zardilior
sumber
0

Namespaces memungkinkan Anda untuk membuat objek dengan nama yang sama, tetapi mereka akan terpisah karena mereka akan hidup di ruang nama yang berbeda, atau dikenal sebagai lingkup.

Ini adalah proses pemikiran yang sama yang harus Anda miliki dengan Socket.IO namespaces. Jika Anda sedang membangun aplikasi web Node modular, Anda akan ingin namespace keluar modul yang berbeda. Jika Anda melihat kembali kode namespace kami, Anda akan melihat bahwa kami dapat mendengarkan acara yang sama persis di ruang nama yang berbeda. Di Socket.IO, acara koneksi di koneksi default dan acara koneksi di a / xxx namespace berbeda. Misalnya, jika Anda memiliki sistem obrolan dan komentar di situs Anda dan ingin keduanya menjadi waktu nyata, Anda dapat menggunakan namespace masing-masing. Ini memungkinkan Anda untuk membangun seluruh aplikasi Socket.IO yang hanya hidup dalam konteksnya sendiri.

Ini juga berlaku jika Anda sedang membangun sesuatu untuk dikemas dan diinstal. Anda tidak dapat mengetahui apakah seseorang sudah menggunakan acara tertentu di namespace default, jadi Anda harus membuatnya sendiri dan mendengarkan di sana. Ini memungkinkan Anda untuk tidak menginjak-injak pengembang mana pun yang menggunakan paket Anda.

Namespaces memungkinkan kita untuk mengukir koneksi ke dalam konteks yang berbeda. Kita dapat membandingkan ini dengan kamar, yang memungkinkan kita untuk mengelompokkan koneksi bersama. Kita kemudian dapat memiliki koneksi yang sama bergabung dengan kamar lain, juga.

Namespaces memungkinkan Anda untuk membuat konteks berbeda agar Socket.IO berfungsi. Kamar memungkinkan Anda untuk mengelompokkan koneksi klien di dalam konteks tersebut.

faridcs
sumber