SignalR: Зачем выбирать Hub vs. Persistent Connection?

Недавно я искал и читал в SignalR, и, хотя я вижу много объяснений того, какая разница между концентраторами и постоянными соединениями, мне не удалось завести голову на следующий уровень, который почему я должен выбрать один подход над другим?

Ответ 1

Из того, что я вижу в разделе Connection and Hubs, кажется, что Hubs предоставляют систему тем, накладывающую более строгие постоянные соединения на нижнем уровне.

Из вышеизложенного комментария ниже:

Частично правильно. Вы можете получать темы и группы в постоянных соединениях. Большая разница заключается в отправке сообщений разных типов. Например, у вас есть разные виды сообщений, и вы хотите отправлять разные виды полезных нагрузок. При постоянных соединениях вы должны вставлять тип сообщения в полезную нагрузку (см. Образец Raw), но концентраторы дают вам возможность делать RPC по соединению (позволяет вызывать методы на клиенте с сервера и с сервера на клиент), Еще одна важная вещь - привязка модели. Концентраторы позволяют передавать строго типизированные параметры методам.

В примере, используемом в документации, используется метафора чата, где пользователи могут присоединиться к определенной комнате, а затем получать сообщения от других пользователей в одной комнате. В более общем плане ваш код подписывается на тему, а затем получает только сообщения, опубликованные в этой теме. С постоянными соединениями вы получите все сообщения.

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

Ответ 2

Основное отличие состоит в том, что вы не можете делать 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. Одна из причин, по которой я знаю, - это отправить Preserialized JSON через PersistentConnection, которую вы не можете использовать с помощью концентраторов. В определенных ситуациях это может быть важным преимуществом производительности.

Кроме того, см. эту цитату из документация:

Выбор модели связи

Большинство приложений должны использовать API концентраторов. API Connections мог бы можно использовать в следующих случаях:

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

  • Разработчик предпочитает работать с моделью обмена сообщениями и диспетчеризации а не удаленной модели вызова.

  • Существующее приложение, использующее модель обмена сообщениями, переносится на использование SignalR.

В зависимости от структуры сообщений вы также можете получить небольшие преимущества от использования PersistentConnection.

Вы можете взглянуть на образцы SignalR, а именно здесь.

Ответ 3

Существует два способа использования SignalR: вы можете получить доступ к нему на низком уровне, переопределив его класс PersistentConnection, который дает вам большой контроль над ним; или вы можете позволить SignalR выполнить весь тяжелый подъем для вас, используя концентраторы высокого уровня.

Ответ 4

Persistent Connection - это API более низкого уровня, вы можете выполнять действия в более определенное время, когда соединение открыто или закрыто, в большинстве приложений концентратор является лучшим выбором

Ответ 5

При сравнении этих двух факторов следует учитывать три основных момента:

  • Формат сообщения
  • Модель связи
  • Настройка SignalR

С помощью хабов форматирование сообщений в основном обрабатывается от вас, но с постоянными соединениями сообщение является необработанным и его токенизируют и анализируют взад и вперед. Если размер сообщения важен, то также обратите внимание, что полезная нагрузка постоянного соединения намного меньше, чем у концентратора.

Когда речь заходит о модели связи, постоянные соединения в основном имеют функцию отправки и приема сообщений, а хабы - удаленная процедура вызова с уникальным функция за каждое требование.

Когда дело доходит до настройки, поскольку постоянные соединения более низкого уровня, они могут дать вам больше контроля над настройкой.