14

我正在为中等负载的 Web 应用程序评估 SignalR。

我们预计约 500 条消息/秒,这对 SignalR 来说应该不是问题。

但是,我们担心此解决方案的可靠性。我们的环境有一个有问题的网络,客户端失去其网络连接约 30 秒的情况并不少见。是否有任何机制可以确保一旦客户端重新连接,它会获取在其离线期间发送的所有消息?

谢谢!

4

2 回答 2

15

处理此问题的一种相当简单的方法是为每条消息分配一个随每条消息递增的 ID。客户端需要跟踪他收到的最新消息,并且在重新连接时只需将该消息 ID 发送到服务器;然后服务器需要将所有丢失的消息发送到客户端。实施起来应该相当简单。

编辑:我认为您不必在服务器上适当地维护任何真实状态-我认为几乎所有这些状态都可以推送到您的数据存储区或您的客户端。客户端将发送它收到的最后一条消息的 ID 或时间戳:

$.connection.myHub.server.updateMe(lastMessageId);

您需要某种支持数据存储 - 因此,当服务器接收到updateMe()消息时,它将对数据库进行查询并提取所有 ID 大于它刚刚收到的行的行。它将这些作为其UpdateMe()方法返回值的一部分返回给客户端。然后它会尝试通过调用客户端上的方法来传递与通常相同的任何新消息。

至于无状态是 SignalR 的目标:我无法对此发表评论,除了观察到我无法想象任何相当复杂的现实世界应用程序不需要有某种支持数据存储,无论它是否在 SignalR或其他一些框架(WCF、XSockets 等)几乎没有什么区别。

于 2012-12-28T07:01:36.660 回答
3

您当然可以使用某种排队框架,但要以最小的努力实现这一点,您可以这样做......

服务器端:http : //pastebin.com/tuicQYGq 客户端:http : //pastebin.com/a8EbusuG

我正在使用 XSockets.NET,它是一个实时通信平台(自 2009 年以来),并且 XSockets.NET 中的控制器具有状态,因此这很容易做到。

编辑:哦...要对此进行测试,请使用两个浏览器,例如 chrome 和 safari,然后断开一个浏览器...从另一个浏览器发送一些消息,然后重新连接以查看消息出现。你必须在 localhost 上使用两个不同的浏览器,因为 xsockets 会给每个浏览器一个唯一的 storage-id。

编辑:将 Func 添加到队列中,以便您可以针对特定客户端,即使它们处于脱机状态。现在,如果您愿意,只有符合条件的客户端才会收到消息。

问候乌夫

于 2013-01-04T10:41:27.987 回答