首页 文章

Azure Service Bus与SignalR的集成

提问于
浏览
1

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

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

Option 2 :我可以向SignalR Startup.Configuration方法添加一个任务,然后接收所有消息并将它们分发给正确的连接用户 . 问题我可以访问用于发送到浏览器的Clients对象 .

我觉得SignalR和Service Bus是一个很好的补充,可以实现近乎实时的通信,但我发现很少实现这样的场景 . 我觉得这应该是一个很常见的场景 . 也许我错过了一些明显的设计模式,这将是一个更好的解决方案 .

1 回答

  • 0

    我能够弄清楚这一点 . 在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);
    }
    

相关问题