Я пытаюсь отправить уведомления конкретным клиентам с сервера об изменениях транзакций. Я до сих пор хорошо себя чувствую в локальной среде и среде разработки, но в LIVE у нас есть 3 пула приложений (3 физических сервера) с loadbalancer (все три имеют одинаковый машинный ключ).SignalR в нескольких пулах приложений
Похоже, что когда уведомление инициируется на стороне сервера в одном пуле, клиент подключен - он работает, но не работает, если пулы разные.
Может кто-нибудь предложить, как с этим справиться - или, может быть, проблема связана с неправильным кодом (некорректная обработка контекстного узла или что-то еще). Я новичок в SignalR - так используются примеры для трансляции сообщений из документации SignalR.
Вот му хаб:
public class ExampleClassHub : Hub
{
private readonly ExampleClass _ExampleClassInstance;
public ExampleClassHub() : this(ExampleClass.Instance) { }
public ExampleClassHub(ExampleClass ExampleClassInstance)
{
_ExampleClassInstance = ExampleClassInstance;
}
}
Вот класс, который служит статический экземпляр:
public class ExampleClass
{
private readonly static Lazy<ExampleClass> _instance = new Lazy<ExampleClass>(() =>
new ExampleClass(GlobalHost.ConnectionManager.GetHubContext<ExampleClassHub>().Clients));
private IHubConnectionContext<dynamic> Clients { get; set; }
private ExampleClass(IHubConnectionContext<dynamic> clients)
{
Clients = clients;
}
public static ExampleClass Instance
{
get
{
return _instance.Value;
}
}
public void NotifyTransactionChange(int userId, string tid, bool isTransactionSuccessfull)
{
string json = JsonConvert.SerializeObject(new Notification { UserId = userId, Tid = tid, IsTransactionSuccessful = isTransactionSuccessfull });
Clients.User(userId.ToString()).notifyTransactionStateChange(json);
}
class Notification
{
public int UserId { get; set; }
public string Tid { get; set; }
public bool IsTransactionSuccessful { get; set; }
}
}
Таким образом, с уведомлением на стороне сервера запускается следующим образом:
ExampleClass.Instance.NotifyTransactionChange(...)
это может помочь http://www.asp.net/signalr/overview/performance/scaleout-in-signalr – Jag
@JAG ..., спасибо - решил использовать его с помощью объединительной платы SQL-Server – RUKAclMortality
@RUKAclMortality Просто FYI, Корпорация Майкрософт рекомендует использовать Redis в качестве объединительной платы (очевидно, для них также используются объединительные платы SQL Server и Service Bus) –