SignalR: Чому слід вибирати концентратор та стійке з'єднання?


150

Я нещодавно шукав і читав SignalR, і, хоча бачу багато пояснень, у чому різниця між концентраторами та стійкими з'єднаннями, я не зміг обернутися головою на наступному рівні, саме тому я б вибрати один підхід над іншим?

Відповіді:


92

З того, що я бачу в розділі « Підключення та концентратори» схоже, що концентратори надають тематичну систему, що перекриває стійкі з'єднання нижнього рівня.

Із коментаря, який внизу був високо оцінений:

Частково правильно. Ви також можете отримати теми або групи в постійних зв’язках. Велика різниця полягає в розсилці різних типів повідомлень. Наприклад, у вас є різні типи повідомлень і ви хочете надсилати різні види корисних навантажень. При стійких з'єднаннях вам потрібно вбудовувати тип повідомлення у корисну навантаження (див. Зразок Raw), але концентратори надають можливість робити RPC через з'єднання (дозволяє викликати методи на клієнті з сервера та з сервера на клієнта) . Ще одна велика річ - прив’язка моделі. Хаби дозволяють передавати сильно набрані параметри методам.

У прикладі, який використовується в документації, використовується метафора чату, де користувачі можуть приєднатися до певної кімнати і потім отримувати повідомлення лише від інших користувачів у тій же кімнаті. Більш загально, ваш код підписується на тему, а потім отримує лише повідомлення, опубліковані на цю тему. Завдяки стійким з'єднанням ви отримаєте всі повідомлення.

Ви можете легко створити власну тематичну систему на основі стійких зв’язків, але в цьому випадку команда SignalR зробила роботу вже для вас.


180
Частково правильно. Ви також можете отримати теми або групи в постійних зв’язках. Велика різниця полягає в розсилці різних типів повідомлень. Наприклад, у вас є різні типи повідомлень і ви хочете надсилати різні види корисних навантажень. При стійких з'єднаннях вам потрібно вбудовувати тип повідомлення у корисну навантаження (див. Зразок Raw), але концентратори надають можливість робити RPC через з'єднання (дозволяє викликати методи на клієнті з сервера та з сервера на клієнта) . Ще одна велика річ - прив’язка моделі. Хаби дозволяють передавати сильно набрані параметри методам.
davidfowl

1
Хороший момент @davidfowl - Я скопіював ваш коментар у відповідь, так як я думаю, що він повинен бути більш помітним.
ColinE

63

Основна відмінність полягає в тому, що ви не можете робити RPC за допомогою PersistentConnection, ви можете надсилати лише необроблені дані. Тож замість того, щоб надсилати повідомлення з цього сервера

Clients.All.addNewMessageToPage(name, message);

вам доведеться надіслати об’єкт за допомогою Connection.Broadcast()або, Connection.Send()і тоді клієнт повинен буде вирішити, що з цим робити. Ви можете, наприклад, надіслати такий предмет:

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

І про клієнта, а не просто визначати

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

вам доведеться додати зворотній дзвінок, щоб обробляти всі вхідні повідомлення:

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

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

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

Вам доведеться виконати такий самий вид диспетчеризації на стороні сервера в OnReceived методі. Також вам доведеться десаріалізувати рядок даних замість отримання сильно набраних об'єктів, як це робиться з методами концентратора.

Існує не так багато причин для вибору PersistentConnection over Hubs. Мені відома одна з причин - це те, що можна надіслати попередньо підключений JSON за допомогою PersistentConnection, що не можна зробити за допомогою концентраторів. У певних ситуаціях це може бути релевантною перевагою від ефективності.

Крім цього, дивіться цю цитату з документації :

Вибір моделі комунікації

Більшість програм повинні використовувати API Hubs. API Connections може використовуватися в таких випадках:

  • Необхідно вказати формат фактичного надісланого повідомлення.

  • Розробник вважає за краще працювати з моделлю обміну повідомленнями та відправленнями, а не з моделлю віддаленого виклику.

  • Існуюча програма, яка використовує модель обміну повідомленнями, переноситься для використання SignalR.

Залежно від вашої структури повідомлень, ви також можете отримати невеликі переваги від використання PersistentConnection.

Ви можете поглянути на зразки SignalR, зокрема це тут.


Один із моїх колег сказав мені, що він обирає систему PersistentConnection over Hubs - це причина безпеки, чи є якісь проблеми із безпекою у Hubs чи щось таке?
Мехді Дехгані

24

Існує два способи використання SignalR: ви можете отримати доступ до нього на низькому рівні, змінивши його PersistentConnectionклас, що дає вам великий контроль над ним; або ви можете дозволити SignalR зробити весь важкий підйом за вас, використовуючи високі рівні "Хаби".


5

Постійне підключення - API нижчого рівня, ви можете виконувати дії в більш конкретний час, коли з'єднання відкривається чи закривається, у більшості програм Hub - найкращий вибір


4

Є три основні моменти, які слід враховувати при порівнянні цих двох:

  • Формат повідомлення
  • Модель спілкування
  • Налаштування сигналуR

За допомогою форматування повідомлень на концентраторах в основному ви керуєтесь вами, але при стійких з'єднаннях повідомлення є неочищеним і має бути токенізовано та проаналізовано назад та назад. Якщо розмір повідомлення важливий, також врахуйте, що корисна навантаження постійного з'єднання набагато менша, ніж у концентратора.

Що стосується моделі комунікації, стійкі з'єднання в основному мають функцію надсилання та прийому повідомлень, тоді як концентратори приймають віддалений виклик процедури модель з унікальною функцією за потребою.

Що стосується налаштування, оскільки стійкі з'єднання є нижчим рівнем, вони можуть дати вам більше контролю над налаштуваннями.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.