SignalR отстает при развертывании в облаке? | . Net Core - PullRequest
1 голос
/ 02 апреля 2020

Контекст: Я разрабатываю систему, аналогичную Uber, в частности, сервер обеспечивает передачу данных между двумя типами пользователей (драйвером и клиентом, например), через свои приложения посредством подключение к концентратору SignalR на сервере. Отслеживание их состояния соединения с сервером является обязательным, и процесс должен быть как можно более быстрым.

Их состояние соединения управляется через HashList<>() для каждого типа пользователя (2 списка). Запись добавляется в список всякий раз, когда пользователь подключен (вызывается OnConnected()), и эта запись удаляется из списка всякий раз, когда пользователь отключается (вызывается OnDisconnected()).

Эти HashLists являются переменными * stati c, в соответствии с лигой этого ответа StackOverflow .

При локальной отладке на моей машине HashLists изменяются мгновенно, но при публикации в облачной службе (в в моем случае: Azure), списки занимают время (около 10 ~ 15 секунд), пока они не будут обновлены. Однако установление действующего соединения с сервером занимает всего около 5 секунд.

Теперь я знаю, что подключение к серверу не может быть мгновенным, и это зависит от нескольких факторов, большинство из которых вне моей досягаемости, но обнаружение разъединения мгновенно (или как можно быстрее) решит мою проблему, что мне делать? Есть ли другой подход, который я должен использовать?

PS: Обнаружение разъединения может быть сделано мгновенно на стороне клиента, но в моем случае это не поможет, потому что мне нужны подключенные пользовательские данные на сервере.

1 Ответ

3 голосов
/ 02 апреля 2020

Я полагаю, что вы развертываете свой собственный сервис SignalR. Недостаточно только хранить содержимое в переменных stati c, поскольку нет гарантии, что ваши запросы будут перенаправлены на тот же сервер. Чтобы решить эту проблему, вам нужно реализовать собственный шаблон объединительной платы и сохранить состояние в другом месте (например, Azure Redis Cache)

Дополнительная информация:

https://docs.microsoft.com/en-us/aspnet/signalr/overview/performance/scaleout-in-signalr

https://docs.microsoft.com/en-us/aspnet/core/signalr/redis-backplane?view=aspnetcore-3.1

PS: Я настоятельно рекомендую вам использовать Azure Службу SignalR, а не размещать свою собственную.

...