У меня есть настройка веб-приложения ASP.NET Core с SignalR, уменьшенным с помощью Redis.Использование встроенных групп прекрасно работает:
Clients.Group("Group_Name");
и выдерживает несколько балансировщиков нагрузки.Я предполагаю, что SignalR автоматически сохраняет эти группы в Redis, чтобы все серверы знали, какие у нас есть группы и кто на них подписан.
Однако в моей ситуации я не могу просто полагаться на группы (или пользователей).), так как нет способа сопоставить connectionId (скажем, при перегрузке OnDisconnectedAsync и известен только идентификатор соединения) обратно в его группу, и вам всегда нужно Group_Name для идентификации группы.Мне нужно это, чтобы определить, какая часть группы находится в сети, поэтому, когда вызывается OnDisconnectedAsync
, я знаю, к какой группе принадлежит этот парень, и на какой стороне разговора он находится.
Я сделалнекоторые исследования, и все они предложили (включая Microsoft Docs) использовать что-то вроде:
static readonly ConcurrentDictionary<string, ConversationInformation> connectionMaps;
в самом хабе.
Теперь это отличное решение (и поточно-ориентированное), за исключением того, что он существует только в одной из памяти сервера балансировки нагрузки, а другие серверы имеют другой экземпляр этого словаря.
Вопрос в том, нужно ли сохранять connectionMaps
вручную?Например, используя Redis?
Что-то вроде:
public class ChatHub : Hub
{
static readonly ConcurrentDictionary<string, ConversationInformation> connectionMaps;
ChatHub(IDistributedCache distributedCache)
{
connectionMaps = distributedCache.Get("ConnectionMaps");
/// I think connectionMaps should not be static any more.
}
}
и, если да, это потокобезопасно?Если нет, можете ли вы предложить лучшее решение, которое работает с балансировкой нагрузки?