Я разрабатываю приложение, которое имеет различные типы уведомлений. Примеры уведомлений:Масштабируемый SignalR + Azure - где поставить SignalR, и должен ли я использовать Azure Queues?
- Сообщение Создано
- Листинг Опубликовано
- Листинг Утверждена
Я хотел бы, чтобы связать все это до SignalR так, что любые подключенные клиенты получают обновления в реальном масштабе время.
Что касается архитектуры - прямо сейчас приложение полностью находится в рамках единого решения, размещенного на веб-сайте Azure. Триггеры для каждого из этих типов уведомлений живут в этом приложении.
Когда срабатывает триггер, я хотел бы сказать signalR: «Эй, отправьте это сообщение следующим клиентам» вместе со списком userIds. Я предполагаю, что можно идентифицировать подключенные клиенты на основе userId ... и я предполагаю, что процесс send message to clients
должен выполняться вне веб-приложения, чтобы не замедлять приложение MVC или не потерять данные в сломанный асинхронный вызов. Первый вопрос - Правильность этих допущений?
Предполагая, что это означает, что мне нужно что-то вроде выделенной роли веб-/ работника для отправки сообщений клиентам. Я мог передавать сообщения из моего веб-приложения непосредственно в этот процесс, но что произойдет, если процесс исчезнет? Проблемы с отказоустойчивостью заставили меня поверить, что надлежащий способ передачи сообщений будет через какую-то очередь. Второй вопрос - - это действительный ход мыслей?
Предполагая, что это так, это означает, что я могу либо использовать хороший Ол»базы данных Azure SQL в качестве очереди, но мне кажется, что есть некоторые специализированные (и, возможно, дешевле) услуги для обработки очередей сообщений, например, следующим образом:
http://www.windowsazure.com/en-us/develop/net/how-to-guides/queue-service/
Третий вопрос: Если это будет использоваться в качестве механизма массового обслуживания для signalR? Я заинтересован в использовании Redis для кеширования в будущем ... был бы Redis лучше или хуже, чем обслуживание очереди?
Заключительный вопрос:
Я попытался проиллюстрировать предложенную мою архитектуру здесь:
Что я больше всего неясными здесь, как приложение MVC будет знать, когда очереди, или как процессы SignalR будут знать, когда нужно транслировать. Должно ли приложение MVC стоять в очереди, не заботясь о подключенных клиентах? Кажется, это приводит к большому количеству потраченного впустую места в очереди и впустую циклов в рабочих ролях, поскольку очень маленький процент клиентов будет когда-либо подключен.
Единственный другой подход, который я могу представить, - это каким-то образом показать видимость приложения MVC в процессах SignalR, чтобы увидеть, подключен ли клиент ... и если они есть, то Enqueue. Это делает меня неудобным, потому что это означает, что я должен ударить эту красную строку на диаграмме для каждого триггера, который попадает, что, даже если сделано async, заставляет меня беспокоиться о производительности и надежности.
Какова рекомендуемая архитектура для масштабируемого, эффективного трансляции сообщений SignalR? Производительность является главным приоритетом, а за ней следуют затраты.
Бонус вопрос:
- Что делать, если некоторые сообщения имеют более высокий приоритет, чем другие? Должны ли использоваться две очереди, одна из которых всегда проверяется перед другой?
Просто мысль/вопрос. Поскольку SignalR должен иметь возможность говорить с клиентами, может ли это быть сделано из роли рабочего, у которой нет IIS/любой идеи «кто» у клиентов? Кроме того, прочитали ли вы учебные программы signalR/Azure по масштабированию/производительности? http://www.asp.net/signalr/overview/signalr-20/performance-and-scaling/scaleout-with-windows-azure-service-bus – Tommy
Просто прочитав между строками, ваши предположения верны, и вы даже можете ваш концентратор в отдельной веб-ферме. Прочитайте ссылку, которую @Tommy опубликовал в приведенном выше комментарии, в котором рассказывается о том, как webfarm можно использовать для масштабирования и имеет более глубокие учебные пособия. –