phòng socket.io hoặc không gian tên?


163

Tôi đang điều tra nodejs / socket.io để trò chuyện trong thời gian thực và tôi cần một số lời khuyên để thực hiện các phòng.

Cái nào tốt hơn, sử dụng không gian tên hoặc sử dụng tính năng phòng để cách ly hoàn toàn những giọt trò chuyện với nhau?

sự khác biệt kỹ thuật thực sự giữa các phòng và không gian tên là gì?

Có sự khác biệt sử dụng tài nguyên?

Câu trả lời:


216

Đây là những gì các không gian tên và phòng có điểm chung (socket.io v0.9.8 - xin lưu ý rằng v1.0 liên quan đến việc viết lại hoàn chỉnh, vì vậy mọi thứ có thể đã thay đổi):

  • Cả hai không gian tên ( io.of ('/ nsp') ) và phòng ( socket.join ('room') ) được tạo ở phía máy chủ
  • Nhiều không gian tên và nhiều phòng chia sẻ cùng một kết nối (WebSocket)
  • Máy chủ sẽ chỉ truyền tin nhắn qua mạng đến những máy khách được kết nối / tham gia nsp / room, tức là không chỉ lọc phía máy khách

Sự khác biệt :

  • không gian tên được kết nối bởi máy khách bằng cách sử dụng io.connect(urlAndNsp)(máy khách sẽ được thêm vào không gian tên đó nếu nó đã tồn tại trên máy chủ)
  • các phòng chỉ có thể được tham gia ở phía máy chủ (mặc dù việc tạo API ở phía máy chủ để cho phép khách hàng tham gia rất đơn giản)
  • không gian tên có thể được ủy quyền bảo vệ
  • ủy quyền không có sẵn với các phòng , nhưng ủy quyền tùy chỉnh có thể được thêm vào API đã nói ở trên, dễ tạo trên máy chủ, trong trường hợp người ta sử dụng phòng.
  • các phòng là một phần của không gian tên (mặc định là không gian tên 'toàn cầu')
  • không gian tên luôn bắt nguồn từ phạm vi toàn cầu

Để không nhầm lẫn khái niệm với tên (phòng hoặc không gian tên), tôi sẽ sử dụng ngăn để chỉ khái niệm và hai tên còn lại để triển khai khái niệm. Vì vậy, nếu bạn

  • cần ủy quyền cho mỗi ngăn , không gian tên có thể là con đường dễ nhất để đi
  • nếu bạn muốn các ngăn được xếp theo thứ bậc (tối đa 2 lớp), hãy sử dụng kết hợp không gian tên / phòng
  • nếu ứng dụng phía máy khách của bạn bao gồm các phần khác nhau (không quan tâm đến các ngăn nhưng) cần được tách biệt với nhau, hãy sử dụng các không gian tên.

Một ví dụ cho ứng dụng sau sẽ là một ứng dụng khách lớn trong đó các mô-đun khác nhau, có thể được phát triển riêng (ví dụ: bên thứ ba), mỗi bên sử dụng socket.io một cách độc lập, đang được sử dụng trong cùng một ứng dụng và muốn chia sẻ một kết nối mạng.

Không thực sự có điểm chuẩn này, đối với tôi, nếu bạn chỉ cần các ngăn đơn giản trong dự án của mình để phân tách và nhóm các tin nhắn, một trong hai đều ổn.

Không chắc chắn nếu điều đó trả lời câu hỏi của bạn, nhưng nghiên cứu dẫn đến câu trả lời này ít nhất đã giúp tôi thấy rõ hơn.


5
Có điều gì quan trọng đã thay đổi về điều này sau phiên bản socket.io> = 1.0 không?
Xeroxoid

2
Thay đổi trong phiên bản mới nhất, hãy đọc socket.io/docs/rooms-and-namespaces và câu trả lời này có thể hữu ích để hiểu phòng mọi thứ stackoverflow.com/questions/24041220/ trên
Gonzalo Bahamondez

1
Chúng tôi có thể nói không gian tên là một khu vực nhất định trong ứng dụng web của tôi và chứa một nhóm khách hàng trong khu vực đó không?
Onaiggac

Bạn có thể thêm một cái gì đó về khi ngắt kết nối từ một phòng / không gian tên. Điều gì xảy ra với họ khi máy khách ngắt kết nối hoặc mất kết nối tạm thời. Ở đây được viết: Sau khi ngắt kết nối, các ổ cắm sẽ tự động rời khỏi tất cả các kênh mà chúng là một phần của sự phá vỡ đặc biệt. Là một kênh tương tự như của bạn ngăn ?
Héo

67

Đó là một câu hỏi cũ nhưng sau khi thực hiện một số nghiên cứu về chủ đề này, tôi thấy rằng câu trả lời được chấp nhận không rõ ràng về một điểm quan trọng. Theo chính Guillermo Rauch ( xem liên kết ): mặc dù về mặt lý thuyết có thể tạo các không gian tên một cách linh hoạt trên một ứng dụng đang chạy, bạn sử dụng chúng chủ yếu như các phần riêng biệt được xác định trước trong ứng dụng của bạn. Mặt khác, nếu bạn cần tạo các khoang ad hoc, một cách nhanh chóng, để phù hợp với các nhóm người dùng / kết nối, tốt nhất nên sử dụng phòng.


3
Thích nó! Không gian tên - Kết nối được xác định trước. Phòng - Kết nối động
Nandakumar

16

Nó phụ thuộc vào những gì bạn muốn làm.

Sự khác biệt chính là phòng khó thực hiện hơn. Bạn phải tạo một phương thức để tham gia các phòng với mỗi trang tải lại.

Với các không gian tên, bạn chỉ cần viết var example = io.connect('http://localhost/example');vào máy khách javascript và máy khách của bạn sẽ tự động được thêm vào các không gian tên.

Ví dụ về việc sử dụng:

  • phòng: trò chuyện riêng tư.
  • không gian tên: trò chuyện của trang.

2

Phòng và không gian tên giao tiếp phân khúc và ổ cắm cá nhân nhóm.

Truyền phát đến một phòng hoặc đến một không gian tên sẽ không đến được với tất cả mọi người chỉ là các thành viên.

Sự khác biệt giữa không gian tên và phòng là như sau:

  • Không gian tên: được quản lý ở frontend có nghĩa là người dùng hoặc kẻ tấn công, tham gia thông qua frontend và việc nối và ngắt kết nối được quản lý ở đây.
  • Phòng: được quản lý trong phần phụ trợ, nghĩa là máy chủ chỉ định tham gia và rời khỏi phòng.

Sự khác biệt chủ yếu là người quản lý chúng

Để quyết định sử dụng cái gì, bạn phải quyết định xem phân đoạn nên được quản lý ở lối vào hay trong phần phụ trợ


0

Không gian tên cho phép bạn tạo các đối tượng có cùng tên, nhưng chúng sẽ tách biệt vì chúng sẽ sống trong các không gian tên khác nhau, còn được gọi là phạm vi.

Đây là quá trình suy nghĩ giống như bạn nên có với các không gian tên của Socket.IO. Nếu bạn đang xây dựng một ứng dụng web Node mô-đun, bạn sẽ muốn không gian tên ra các mô-đun khác nhau. Nếu bạn nhìn lại mã không gian tên của chúng tôi, bạn sẽ thấy rằng chúng tôi có thể lắng nghe cùng một sự kiện chính xác trong các không gian tên khác nhau. Trong Socket.IO, sự kiện kết nối trên kết nối mặc định và sự kiện kết nối trên không gian tên / xxx là khác nhau. Ví dụ: nếu bạn có một hệ thống trò chuyện và nhận xét trên trang web của mình và muốn cả hai là thời gian thực, bạn có thể đặt tên cho từng trang. Điều này cho phép bạn xây dựng toàn bộ ứng dụng Socket.IO chỉ sống trong bối cảnh của chính nó.

Điều này cũng đúng nếu bạn đang xây dựng một cái gì đó để được đóng gói và cài đặt. Bạn không thể biết nếu ai đó đã sử dụng một số sự kiện nhất định trong không gian tên mặc định, vì vậy bạn nên tạo riêng của mình và lắng nghe ở đó. Điều này cho phép bạn không giẫm lên chân của bất kỳ nhà phát triển nào sử dụng gói của bạn.

Không gian tên cho phép chúng tôi khắc kết nối vào các bối cảnh khác nhau. Chúng tôi có thể so sánh điều này với các phòng, cho phép chúng tôi nhóm các kết nối lại với nhau. Chúng tôi cũng có thể có cùng kết nối với các phòng khác.

Không gian tên cho phép bạn tạo các bối cảnh khác nhau để Socket.IO hoạt động. Các phòng cho phép bạn nhóm các kết nối máy khách bên trong các bối cảnh đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.