Ядро SignalR: нужно ли сходство ARR, когда включены веб-сокеты и служба приложений Azure масштабируется до нескольких экземпляров? - PullRequest
0 голосов
/ 27 июня 2019

Я работаю над asp.net core 2.2 веб-приложением MVC. Мы используем signal r core version 1.1.0 (добавлено через пакет nuget Microsoft.AspNetCore.SignalR). Клиентское приложение - это приложение angularjs, ссылающееся на версию 1.1.4 библиотеки javascript aspnet-signalr.

Наше приложение развернуто в Azure, а служба приложений хостинга масштабируется по горизонтали: в настоящее время two instances нашего веб-приложения запущено и работает. Я тестирую поведение моего приложения, используя Google chrome version 75.0.3770.100 на компьютере с Windows 10.

Служба приложения настроена таким образом, что веб-сокеты включены и сходство ARR отключено . Я испытываю странное поведение, в основном, если я тестирую свое приложение и выполняю несколько аппаратных обновлений браузера (ctrl + F5), случается случайным образом, что клиентское приложение не может подключиться к концентратору уведомлений. В консоли Google Chrome сообщается о следующих ошибках:

WebSocket connection to 'wss://myapp.azurewebsites.net/notificationsHub?id=3Fmlw2yC5qm3vi0qny50Qg' failed: Error during WebSocket handshake: Unexpected response code: 404

Error: Failed to start the transport 'WebSockets': null

GET https://myapp.azurewebsites.net/notificationsHub?id=nEYPEDw5f0AkLz5otCAOyA 404

Error: Failed to start the transport 'ServerSentEvents': Error: Error occurred

GET https://myapp.azurewebsites.net/notificationsHub?id=2G9VVr5mcx7QT2wbSfwDLA&_=1561652513485 404

Error: Failed to start the transport 'LongPolling': Error

Error: Failed to start the connection: Error: Unable to initialize any of the available transports.

Если я изменю конфигурацию службы приложения так, чтобы включались и веб-сокеты, и сходство ARR , все работало как чудо. Я подозреваю, что , когда служба приложения масштабируется по горизонтали, тогда сродство ARR требуется независимо от транспортного протокола (в моем случае, и приложение на стороне сервера, и браузер клиента могут поддерживать протокол веб-сокета) .

Насколько я понимаю, в официальной документации Microsoft указано, что при использовании веб-сокетов в качестве протокола связи привязка ARR клиента не требуется, даже если служба приложения хостинга горизонтально масштабируется до нескольких экземпляров . На данный момент я не уверен в своем понимании документации ядра сигнализатора.

Я что-то упустил? Я неправильно понял официальную документацию?

РЕДАКТИРОВАТЬ 3 ИЮЛЯ 2019

Для тех, кто интересуется этой темой (масштабирование веб-приложения с использованием ядра signal-r), вы можете обратиться к этому выпуску github для всех деталей.

Короткий ответ - это то, что новое ядро ​​signal-r фактически сохраняет состояние и требует липких сеансов, когда приложение масштабируется до нескольких серверов.

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

Если вы не хотите использовать эту службу Azure, единственная опция, позволяющая избежать зависания сеансов, - это настройка ядра r таким образом, чтобы избежать согласования протокола клиент-сервер и обмен данными осуществляется только с помощью веб-сокетов (подробности см. В связанном выпуске github). Обратите внимание, что при этом вы потеряете возможность перехода на другие протоколы, когда веб-сокеты не поддерживаются, что является одной из основных функций ядра signal-r.

1 Ответ

1 голос
/ 28 июня 2019

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

...