SignalR.Redis如何在引擎盖下工作?

时间:2012-10-24 17:32:36

标签: redis signalr

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

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

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

1 个答案:

答案 0 :(得分:48)

没有没有白皮书,它就像200行代码,所以没有那么多可以吞下去。

在SignalR中,每条消息都通过称为消息总线的消息。当您想要跨节点(或进程或应用程序域)进行扩展时,此总线的实现需要能够与应用程序的每个实例进行通信。为此,您可以使用RedisMessageBus。 Redis具有pub sub机制以及它存储键值对的能力,我们只将前者用于SignalR。

OffTopic:这非常重要! SignalR不是可靠的消息传递,它是一种连接抽象。我们可以缓冲消息以进行长时间保护,但是你不能*依赖于永远存在的消息。如果您有重要信息需要保留,请坚持下去。

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

横向扩展设计的一个重要部分是游标。游标表示特定客户端在无限消息流中的位置。当客户端在断开连接后重新连接或者在获得消息后返回longpolling连接时,它会要求总线从一些游标值开始获取所有内容。游标由消息总线实现定义,我们在最新的源代码中对此进行了规范化(在编写时尚未发布,但我不会在此处详述)。当前redis实现中的光标只是一个递增的数字,没有太复杂。

希望能够了解它的工作原理。