Несколько концентраторов в 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";