我正在评估SignalR用于中等负载的Web应用程序。
我们期待~500 msgs / sec,这对SignalR来说应该不是问题。
然而,我们担心这个解决方案的可靠性。我们的环境存在问题网络,客户端丢失网络连接约30秒并不罕见。是否有任何机制可以确保一旦客户端重新连接,它将获取在其脱机时间内发送的所有消息?
谢谢!
答案 0 :(得分:14)
处理此问题的一种相当简单的方法是为每条消息分配一个随每条消息递增的ID。客户端需要跟踪他收到的最新消息,重新连接后只需将该消息ID发送给服务器;然后服务器需要将所有丢失的消息发送到客户端。实施起来应该相当简单。
编辑: 我认为您不必在服务器上维护任何真实的状态 - 我认为几乎所有状态都可以推送到您的数据存储区或您的客户端。客户端将发送它收到的最后一条消息的ID或时间戳:
$.connection.myHub.server.updateMe(lastMessageId);
您需要某种支持数据存储 - 因此当服务器收到updateMe()
消息时,它会对数据库进行查询并提取ID大于刚收到的ID的所有行。它会将它们作为其UpdateMe()
方法的返回值的一部分返回给客户端。然后它会尝试通过调用客户端上的方法来传递任何与通常相同的新消息。
至于无状态是SignalR的目标:我无法评论这一点,除了观察我无法想象任何合理复杂的现实世界的应用程序,不需要做某种支持数据存储,无论是它在SignalR或其他一些框架(WCF,XSockets等)上几乎没有什么区别。
答案 1 :(得分:3)
你当然可以使用某种排队框架,但只需付出最少的努力即可实现这一目标......
Serverside:http://pastebin.com/tuicQYGq 客户:http://pastebin.com/a8EbusuG
我使用的是实时通信平台XSockets.NET(自2009年起),XSockets.NET中的控制器具有状态,因此很容易做到。
编辑:哦......测试这个使用两个浏览器,例如chrome和safari,然后断开一个浏览器...从另一个浏览器发送一些消息然后重新连接以查看消息出现。您必须在localhost上使用两个不同的浏览器,因为xsockets将为每个浏览器提供唯一的存储ID。编辑:将Func添加到队列中,以便即使特定客户端处于脱机状态也可以将其作为目标。现在,只有符合条件的客户才会收到消息。
此致 Uffe