Несколько концентраторов в SignalR (Design)
Используя SignalR, мне интересно, как лучше всего настроить мои концентраторы в следующем сценарии: Скажем, у меня есть приложение для веб-казино (просто для удовольствия), и у него есть три игры: покер, блэкджек и слоты. Покер и блэкджек - это мультиплеер, поэтому у них есть функция чата, а в слотах нет. Хорошо, чтобы поддержать это, я думал о настройке своих концентраторов следующим образом.
BaseHub (обрабатывает соединения, общие для Покера, Блэкджека и Слотов)
PokerHub: BaseHub (Играет в покерную игру)
BlackjackHub: BaseHub (играет в блэкджек)
SlotsHub: BaseHub (Играет в игровые автоматы)
ChatHub (обрабатывает функции чата)
Я думал, что страница Poker этого веб-приложения подключится к PokerHub, а также страница ChatHub и Blackjack сделает что-то подобное. Страница слотов, очевидно, будет подключаться только к SlotsHub.
Теперь вещи, о которых я не уверен, являются: если страницы Poker/Blackjack будут подключаться как к PokerHub/BlackjackHub, так и к ChatHub или есть какой-то способ, я могу подключить их только к PokerHub/BlackjackHub и делегировать функции чата в центр чата? В этом случае я мог бы создать как интерфейс IHasChat или что-то в этом роде. В любом случае, если ChatHub также расширяет BaseHub? В настоящее время BaseHub только реализует IConnected, IDisconnect, а также обрабатывает основные функции группы (JoinGroup, LeaveGroup). Кроме того, должен ли BaseHub быть общим экземпляром (singleton)?
Наконец, если вы думаете, что я просто ошибаюсь, сообщите мне. Это мой первый проект SignalR, и я знаю, что я не эксперт в этом. Кроме того, я знаю, что здесь есть несколько вопросов. Если вы можете ответить на все или все из них, в любом случае я действительно ценю это.
Спасибо,
Том
Ответы
Ответ 1
У вас может быть столько хабов, сколько вам нужно, поскольку есть только одно соединение с сервером SignalR. Концентраторы являются реализацией RPC, и все они имеют одинаковое соединение.
Страница Wiki на концентраторах для js-клиента показывает такое соединение:
$.connection.hub.start()
Где hub - пространство имен внутри js-клиента.
Ответ 2
Это уже давно, поэтому вам может не понадобиться ответ, но... здесь ничего не происходит.
Я новичок в SignalR, поэтому я немного не уверен, как ваш дизайн повлияет на его производительность. Если это не проблема, я могу рассмотреть объектную модель следующим образом:
abstract BaseHub : Hub;
abstract MultiplayerHub : BaseHub; // (Handles chat and other MP necessities)
BlackJackHub : MultiplayerHub;
PokerHub : MultiplayerHub;
SlotsHub : BaseHub;
Я не могу думать о каких-либо причинах, по которым этот дизайн может вызвать какие-либо проблемы с SignalR, но опять же, у меня нет большого опыта для продолжения.
Ответ 3
Практически никогда не требуется наличие нескольких серверов-концентраторов на сервере. Это похоже на несколько интернет-соединений. Один для серфинга игр, другой для социальных сетей и третий для чего-то другого.
Создайте один класс концентратора на стороне сервера.
Что вам нужно сделать, так это разные клиенты, использующие JS.
Например, на моем сайте у меня было две вещи. Онлайн-чат и автономные уведомления. Для chat.aspx у меня была переменная, называемая "чат", действующей как хаб. Для всех других страниц у меня была переменная с именем NotificationHub.
Вы можете сделать что-то вроде ниже
var pocker = $.connection.hub;
var blackJack = $.connection.hub;
var other = $.connection.hub;
Таким образом вызовите соответствующие методы
Также, если вы хотите определить, кто вызвал ваш метод сервера, вы можете прикрепить параметр строки запроса.
pocker.connection.qs = "type=pocker";