【问题标题】:Azure Service Bus integration with SignalRAzure 服务总线与 SignalR 的集成
【发布时间】:2016-12-10 19:13:32
【问题描述】:

此问题与 SignalR 和 Azure 服务总线的 Scaleout 无关。我想在我的 SignalR Web 套接字应用程序中构建一个服务总线侦听器(例如 OnMessage),然后将消息相应地分发给连接的用户。消息将从各种单独运行的服务发布到集中式服务总线,连接到 Web 套接字服务器的 UI/浏览器应该接收这些消息。

选项 1:我可以将异步任务添加到集线器方法中,以订阅服务总线并按连接的用户进行过滤。这样做的问题是它使用线程池中的一个额外线程,并且将为用户启动的 每个 套接字连接执行此操作。我们的应用可以为每个打开的标签轻松启动 5-10 个或更多套接字。

选项 2:我可以将单个任务添加到 SignalR Startup.Configuration 方法,然后接收所有消息并将它们分发给适当的连接用户。我在这里遇到的问题是我无权访问用于发送到浏览器的 Clients 对象。

我觉得 SignalR 和 Service Bus 是一个很好的互补,可以实现近乎实时的通信,但我几乎找不到实现这样的场景。我觉得这应该是一个足够普遍的场景。也许我遗漏了一些明显的设计模式,它们会是更好的解决方案。

【问题讨论】:

    标签: c# websocket signalr azureservicebus


    【解决方案1】:

    我能够弄清楚这一点。在 SignalR Startup.Configuration 方法中,我添加了一个启动侦听器的方法,并在该方法中调用了 GlobalHost.ConnectionManager.GetHubContext。目前这不会发送给个人用户,但我会添加某种连接管理器来处理它。

    public void startServiceBusListener()
    {
    
        // setup subcsription
        var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
        if (!namespaceManager.SubscriptionExists("myTopic", Environment.MachineName))
            namespaceManager.CreateSubscription("myTopic", Environment.MachineName);
    
        SubscriptionClient busClient = SubscriptionClient.CreateFromConnectionString(connectionString, "myTopic", Environment.MachineName);
    
        // Configure the callback options.
        OnMessageOptions options = new OnMessageOptions();
        options.AutoComplete = false;
        options.AutoRenewTimeout = TimeSpan.FromMinutes(1);
    
        receiveTask = Task.Run(() =>
        {
            // handle new messages
            busClient.OnMessage((message) =>
            {
                try
                {
                    Notification note = message.GetBody<Notification>();
                    string notification = JsonConvert.SerializeObject(note);
                    GlobalHost.ConnectionManager.GetHubContext<DispatchHub>().Clients.All.notify(notification);
                    // Remove message from subscription.
                    message.Complete();
                }
                catch (Exception)
                {
                    // Indicates a problem, unlock message in subscription.
                    message.Abandon();
                }
            }, options);
        }, cts.Token);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-01-13
      • 1970-01-01
      • 2017-10-07
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      相关资源
      最近更新 更多