2016-08-11 5 views
0

Я пытаюсь отправить уведомления конкретным клиентам с сервера об изменениях транзакций. Я до сих пор хорошо себя чувствую в локальной среде и среде разработки, но в 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(...) 
+0

это может помочь http://www.asp.net/signalr/overview/performance/scaleout-in-signalr – Jag

+0

@JAG ..., спасибо - решил использовать его с помощью объединительной платы SQL-Server – RUKAclMortality

+0

@RUKAclMortality Просто FYI, Корпорация Майкрософт рекомендует использовать Redis в качестве объединительной платы (очевидно, для них также используются объединительные платы SQL Server и Service Bus) –

ответ

Смежные вопросы