为SignalR实现背板和消息总线

时间:2014-03-12 17:16:28

标签: .net mongodb signalr signalr-backplane

我的团队正在运行具有负载均衡的IIS Web服务器和MongoDB的环境。我们希望使用SignalR将通知推送给我们的用户(将来可能会更多)。我正在尝试实现一个新的SignalR ScaleoutMessageBus,以便我们可以使用现有的MongoDB作为SignalR的背板。我在GitHub上发现了一个看起来像是我想要的东西的实现。不幸的是,它是针对SignalR 0.5.3实现的,与SignalR 2.0.2非常不兼容。

我尝试更新它以使其正常工作并使以下部分正常工作:

  • 依赖注入正确加载新消息总线
  • 正确连接到数据库并跟踪尾随光标以获取新消息(而非SignalR相关)
  • 主题和订阅似乎使用现有功能

我无法理解ScaleOutMessageBus的某些部分是如何工作的,特别是消息流的功能以及它们与整体功能的关系。看看SQL背板,看起来我想通过读写数据库来替换读写流和从流中读取数据?这是对的吗?

这是我的发送实现(似乎有效)

protected override Task Send(IList<Message> messages)
{
    MongoMessageWrapper mw = new MongoMessageWrapper(messages);

    if (ConnectionReady)
    {
        return Task.Factory.StartNew(() => _mongoCollection.Insert(mw)).Catch();
    }
    return OpenConnection().Then(() => Task.Factory.StartNew(() => _mongoCollection.Insert(mw)));
}

我的MongoMessageWrapperClass扩展了ScaleoutMessage,但广告了尾随光标引用的_id属性。

这似乎正确地将消息写入数据库。我认为我的下一步是创建一个新的OnReceived,当我的尾随光标找到一条新消息并从Mongo中取出数据以获取原始消息并将它们传递给现有的ScaleoutMessageBus基类时调用。

如果我这样做,我应该传递什么作为OnReceived的streamIndex和id值?我在Send函数中收到的消息也是Message而不是ScaleoutMessage,而OnReceived则将其作为参数。我应该只将IList转换为ScaleoutMessage吗?

我无法找到有关构建自定义横向扩展解决方案和背板的任何文档。有没有可用的(除了浏览源代码以解决它?

1 个答案:

答案 0 :(得分:3)

我遇到了article如何为NServiceBus实现ScaleoutMessageBus。关于如何处理Message vs ScaleoutMessage的一个问题,您似乎可以通过将ScaleoutMessage传递给构造函数来构建Message。我知道这不是一个完整的答案,但也许它可以帮助下一个在SO上找到这个问题的人。