22

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

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

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

4

1 回答 1

51

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

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

题外话:这很重要!SignalR 不是可靠的消息传递,它是一种连接抽象。我们可能会缓冲消息以进行长轮询,但您**不能*永远依赖这些消息。如果您有需要保留的重要消息,请保留它们。

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

横向扩展设计的一个重要部分是光标。游标表示特定客户端在无限消息流中的位置。当客户端在断开连接后重新连接或长轮询连接在收到消息后返回时,它会要求总线从某个光标值开始获取所有内容。游标是由消息总线实现定义的,我们已经在最新的源代码中对其进行了规范化(在撰写本文时尚未发布,但我不会在这里详细介绍)。当前 redis 实现中的 cursor 只是一个递增的数字,没什么复杂的。

希望这能让您了解它是如何工作的。

于 2012-10-25T07:14:29.977 回答