2012-10-24 34 views
20

除了阅读github中的代码之外,有没有关于SignalR.Redis包如何工作的白皮书类型的文档?具体而言,我想知道它为Redis添加了哪些密钥,更新/删除策略等。在Redis内部查看时,我所看到的只是以下调用中指定的一个密钥(即“SignalR.Redis.Sample”):SignalR.Redis如何在引擎盖下工作?

GlobalHost.DependencyResolver.UseRedis(server, Int32.Parse(port), password, "SignalR.Redis.Sample"); 

这个关键似乎只是Redis中的一个计数器。我会假设其他密钥正在创建并被快速删除,以方便连接到Redis的每个应用服务器之间的消息。

回答

48

不,没有白皮书,它就像200行代码,所以没有太多的吞下。

在SignalR中,每条消息都经过一条称为消息总线的东西。当你想跨节点(或进程或应用程序域)扩展时,该总线的实现需要能够与应用程序的每个实例进行通信。要做到这一点,你可以使用RedisMessageBus。 Redis有一个pub sub机制以及存储关键值对的功能,我们只使用前者用于SignalR。

OffTopic:这非常重要! SignalR不是可靠的消息传递,它是一种连接抽象。我们可能为长时间缓冲消息,但是你不能*依赖那里的消息。如果你有重要的信息需要坚持,那就坚持下去。

每个Web服务器连接到一个(或更多在新实现中)redis事件以在它们之间发送消息。当一个或多个客户端收到一条消息时,它会发送到背板(redis),并到达所有Web服务器。每个网络服务器从redis获取消息并将其存储在本地缓存中。这个本地缓存是服务于SignalR客户端(浏览器等)的地方。

横向扩展设计的一个重要部分是游标。游标表示特定客户端在无限消息流中的位置。当客户端在断开连接后重新连接,或者在收到消息后返回长连接连接时,它会要求总线给我一切,因为有一些游标值。游标由消息总线实现来定义,我们已经在最新的源代码中对其进行了规范化(在撰写本文时尚未发布,但我不会在此处详述)。当前redis实现中的游标只是一个增加的数字,没什么太复杂的。

希望这可以让你知道它是如何工作的。

+2

非常感谢。很好的解释。 – user1574808

+1

感谢您的好解释。请考虑以下情况: 我有一个**负载平衡的**网络农场,其中每个服务器托管一个集线器。假设所有的客户都回退到长期投票。 _Client X_通过负载均衡器连接,他的请求被发送到_server 1_。 但是,在下一次轮询时,负载均衡器会将其请求指向_server 2_。 我的问题是,底板是否确保所有集线器都知道所有连接的客户端,而不管它们最初连接到哪个集线器? – demius

+1

背板知道所有的服务器,所以一切都会正常工作。它不需要知道它最初连接的是什么服务器。 – davidfowl

相关问题