2015-10-22 7 views
1

Мы используем SignalR в крупномасштабном веб-приложении. Мы развернули несколько веб-серверов, обрабатывающих соединения signalR. У нас есть встроенная объединительная плата Redis, у меня есть следующий вопрос: SignalR делает три вызова на сервер: 1) ведет переговоры, 2) подключается и 3) запускается. Если у нас есть веб-ферма за балансировщиком нагрузки, и эти три вызова заканчиваются на трех разных серверах, будет ли состояние соединений повреждено на всех трех серверах? Что произойдет в этом сценарии? Я не говорю о доставке сообщений.Управление подключением SignalR в веб-ферме

Более конкретно:

  1. Будет ли второй веб-сервер будет в состоянии понять ConnectionID производимого вести переговоры вызова?

  2. Что происходит, когда физическое соединение (websockets) установлено на другом сервере, а затем стартовый вызов переходит на другой сервер ?

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

Вопрос, который я уже прошел, чтобы получить ответ: SignalR connection affinity in web-farm scenario

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

+0

Эй guruprasath, просто интересно, если вы когда-либо получили ответ на этот вопрос? В настоящее время у нас есть ферма, которая обслуживает приложение, и мы используем объединительную панель Redis, размещенную в Azure. В моем случае на балансировщике нагрузки нет липких сеансов, и я вижу таймауты и разъединения с веб-окнами, которые, я считаю, это то, чего вы боялись. Смущающая часть для меня основана на том, что я читал в документации, транспортное соединение напрямую связано с объединительной платой, что означает, что балансировка нагрузки не имеет никакого значения ... но мы не видим проблем в среде с одним узлом. – ammills01

+0

@ ammills01, я не получил ответа. Я пробовал размещать в другом канале, но не повезло. Основываясь на том, что вы описали, я предполагаю, что ваша проблема не связана с липкостью. Мы используем собственный кластер Redis с пользовательской реализацией объединительной платы. Поэтому я не могу говорить об устойчивости объединительной платы Redis, предоставленной ими. Я понимаю, что транспортное соединение не связано с объединительной платой (что будет проблемой безопасности). Транспортное соединение осуществляется с помощью интерфейсных веб-серверов, поддерживающих веб-порты. Таким образом, липкость балансировки нагрузки может иметь большое значение. – guruprasath

+0

Спасибо за ответ. После немного большего количества копаний я пришел к тому же выводу, который вы упомянули здесь, транспорт с сервером SignalR, поэтому без липких сеансов на запросы всплывали и не выполнялись. Когда это произойдет, вы получите тайм-ауты, и если вы настроили longPolling или другие транспортные технологии, когда вы установили соединение SignalR, он перейдет к одному из них. Для нас это поражает longPolling, и приложение, похоже, отлично работает оттуда, просто берет больше ресурсов на серверах. – ammills01

ответ

0

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

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

Технология стека ниже:

Клиент: AngularJS App

CDN: обслуживание статических ресурсов (HTML, CSS, изображения)

балансировки нагрузки: установка в лазури

Несколько WebApps: работает ASP.NET ядро ​​

Multiple SQL Server базы данных: зеркальное отображение

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

  • Пользователи аутентифицируются с использованием маркерного механизма (OAuth в нашем случае). Вся информация пользователя (идентификатор пользователя и т. Д.) Зашифровывается в его токен.

  • Соединение установлено и направлено на любое из запущенных веб-приложений.

  • Webapp сохраняет информацию о подключении в таблице базы данных.

  • Webapp извлекает всех «друзей» пользователей, у которых есть соединение в базе данных.

  • Webapp отправляет список обратно клиенту.

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

  • Компания Whevenver повторно подключается, webapp добавляет соединение обратно и отправляет пользователю текущий список подключений/клиентов в Интернете.

Клиент должен поддерживать, в каком состоянии он находится, и как реагировать на обновления в списках клиентов.

Этот подход аналогичен описанному в ответе, который вы опубликовали в своем вопросе.

Я считаю, что принципиальная концепция здесь - объединительная плата. Он сохраняет состояние, а не просто передает его вокруг серверов.

Связанное сообщение в блоге здесь может помочь: https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/mapping-users-to-connections

(Взгляните на сценариях «Более один сервера»)

+0

Читая немного больше на ответ на объединительную плату, я считаю, что концепция такая же. Я дал план моего подхода. Есть оптимизация, которую мы сделали, очевидно, например, как список списка вновь подключенных клиентов после каждого запроса, а не весь список (курсор, упомянутый в вашем сообщении). – l3utterfly