Недавно я искал и читал в SignalR, и, хотя я вижу много объяснений того, какая разница между концентраторами и постоянными соединениями, мне не удалось завести голову на следующий уровень, который почему я должен выбрать один подход над другим?
SignalR: Зачем выбирать Hub vs. Persistent Connection?
Ответ 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
С помощью хабов форматирование сообщений в основном обрабатывается от вас, но с постоянными соединениями сообщение является необработанным и его токенизируют и анализируют взад и вперед. Если размер сообщения важен, то также обратите внимание, что полезная нагрузка постоянного соединения намного меньше, чем у концентратора.
Когда речь заходит о модели связи, постоянные соединения в основном имеют функцию отправки и приема сообщений, а хабы - удаленная процедура вызова с уникальным функция за каждое требование.
Когда дело доходит до настройки, поскольку постоянные соединения более низкого уровня, они могут дать вам больше контроля над настройкой.