2012-02-14 37 views
142

Gần đây tôi đã tìm kiếm và đọc về SignalR và trong khi tôi thấy rất nhiều giải thích về sự khác biệt giữa Hubs và Persistent Connections, tôi không thể có được đầu xung quanh cấp độ tiếp theo, đó là lý do Tôi sẽ chọn một cách tiếp cận khác?SignalR: Tại sao chọn Hub so với Kết nối liên tục?

Trả lời

86

Từ những gì tôi thấy trong số Connection and Hubs section có vẻ như các Trung tâm cung cấp một hệ thống chủ đề che phủ các kết nối liên tục cấp thấp hơn.

Từ những nhận xét đánh giá cao lên-bình chọn dưới đây:

một phần đúng. Bạn cũng có thể nhận các chủ đề hoặc nhóm trong các kết nối liên tục. Sự khác biệt lớn là gửi các loại tin nhắn khác nhau. Ví dụ bạn có các loại thông điệp khác nhau và bạn muốn gửi các loại tải trọng khác nhau. Với các kết nối liên tục, bạn phải nhúng loại tin nhắn trong tải trọng (xem mẫu thô) nhưng các hub cho bạn khả năng thực hiện RPC qua kết nối (cho phép bạn gọi các phương thức trên máy khách từ máy chủ và từ máy chủ đến máy khách) . Một điều quan trọng nữa là mô hình ràng buộc. Hub cho phép bạn truyền các tham số được gõ mạnh mẽ cho các phương thức.

Ví dụ được sử dụng trong tài liệu sử dụng ẩn dụ phòng trò chuyện, nơi người dùng có thể tham gia một phòng cụ thể và sau đó chỉ nhận tin nhắn từ những người dùng khác trong cùng một phòng. Thông thường, mã của bạn đăng ký một chủ đề và sau đó chỉ nhận được các tin nhắn được xuất bản cho chủ đề đó. Với các kết nối liên tục, bạn sẽ nhận được tất cả tin nhắn.

Bạn có thể dễ dàng xây dựng hệ thống chủ đề của riêng mình trên các kết nối liên tục, nhưng trong trường hợp này nhóm SignalR đã làm việc đó cho bạn.

+176

Một phần chính xác. Bạn cũng có thể nhận các chủ đề hoặc nhóm trong các kết nối liên tục. Sự khác biệt lớn là gửi các loại tin nhắn khác nhau. Ví dụ bạn có các loại thông điệp khác nhau và bạn muốn gửi các loại tải trọng khác nhau. Với các kết nối liên tục, bạn phải nhúng loại tin nhắn trong tải trọng (xem mẫu thô) nhưng các hub cho bạn khả năng thực hiện RPC qua kết nối (cho phép bạn gọi các phương thức trên máy khách từ máy chủ và từ máy chủ đến máy khách) . Một điều quan trọng nữa là mô hình ràng buộc. Hub cho phép bạn truyền các tham số được gõ mạnh mẽ cho các phương thức. – davidfowl

+9

Nhận xét trên phải là câu trả lời được chấp nhận. –

+0

Liên kết bị hỏng –

21

Có hai cách để sử dụng SignalR: bạn có thể truy cập nó ở mức thấp bằng cách ghi đè lên lớp PersistentConnection, điều này mang lại cho bạn nhiều quyền kiểm soát; hoặc bạn có thể để SignalR làm tất cả việc nâng hạng nặng cho bạn, bằng cách sử dụng ‘Hubs’ cấp cao.

+0

câu trả lời đơn giản và rõ ràng :-) – WASIF

5

kết nối liên tục là một API mức thấp hơn, bạn có thể thực hiện những hành động đúng thời hạn cụ thể hơn khi kết nối được mở hoặc đóng, trong hầu hết các ứng dụng Hub là sự lựa chọn tốt nhất

60

Sự khác biệt chính là bạn có thể không làm RPC với PersistentConnection, bạn chỉ có thể gửi dữ liệu thô. Vì vậy, thay vì gửi tin nhắn từ máy chủ như thế này

Clients.All.addNewMessageToPage(name, message); 

bạn phải gửi một đối tượng với Connection.Broadcast() hoặc Connection.Send() và sau đó khách hàng sẽ phải quyết định làm gì với điều đó. Bạn có thể, ví dụ, gửi một đối tượng như thế này:

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

Và trên máy khách, thay vì chỉ đơn giản là xác định

yourHub.client.addNewMessageToPage = function(name, message) { 
    // things and stuff 
}; 

bạn phải thêm một callback để xử lý tất cả các tin nhắn gửi đến:

function addNewMessageToPage(name, message) { 
    // things and stuff 
} 

connection.received(function (data) { 
    var method = data.method; 

    window[method](data.name, data.message); 
}); 

Bạn sẽ phải thực hiện cùng một loại điều phối ở phía máy chủ theo phương thức OnReceived. Bạn cũng phải deserialize chuỗi dữ liệu ở đó thay vì nhận các đối tượng được gõ mạnh như bạn làm với các phương thức hub.

Không có nhiều lý do để chọn PersistentConnection over Hubs.Một lý do tôi biết là có thể send preserialized JSON qua PersistentConnection mà bạn không thể thực hiện bằng cách sử dụng các hub. Trong một số trường hợp nhất định, đây có thể là lợi ích hiệu suất có liên quan.

Ngoài ra, xem trích dẫn này từ documentation:

Chọn một mô hình truyền thông

Hầu hết các ứng dụng nên sử dụng API Hubs. API kết nối có thể sử dụng trong các trường hợp sau:

  • Định dạng của thư thực được gửi cần được chỉ định.

  • Nhà phát triển muốn làm việc với mô hình nhắn tin và gửi đi thay vì mô hình gọi từ xa.

  • Ứng dụng hiện có sử dụng mô hình nhắn tin đang được chuyển để sử dụng SignalR.

Tùy thuộc vào cấu trúc thư của bạn, bạn cũng có thể nhận được các lợi ích nhỏ về hiệu suất từ ​​việc sử dụng PersistentConnection.

Bạn có thể muốn xem xét các mẫu SignalR, cụ thể this here.

4

Có ba điểm chính cần xem xét khi so sánh hai:

  • Message Format
  • mô hình truyền thông
  • Tùy chỉnh SignalR

Với trung tâm tôi Định dạng ssage về cơ bản được xử lý từ bạn nhưng với các kết nối liên tục, thông báo là thô và đã được mã hóa và phân tích cú pháp qua lại. Nếu kích thước tin nhắn là quan trọng thì cũng lưu ý rằng tải trọng của một kết nối liên tục ít hơn nhiều so với trọng lượng của một hub.

Khi nói đến kết nối liên tục, mô hình liên kết về cơ bản có chức năng gửi và nhận tin nhắn trong khi các hub lấy mô hình remote procedure call với chức năng duy nhất theo yêu cầu.

Khi nói đến tùy chỉnh vì các kết nối liên tục ở mức thấp hơn, chúng có thể cho phép bạn kiểm soát nhiều hơn tùy chỉnh.

Các vấn đề liên quan