Signalr 信号机保证交货

Signalr 信号机保证交货,signalr,Signalr,我正在为一个中等负载的web应用程序评估Signal 我们预计约500毫秒/秒,这对信号机来说应该不是问题 然而,我们担心这个解决方案的可靠性。我们的环境有一个有问题的网络,客户机丢失网络连接达30秒的情况并不罕见。是否有任何机制可以确保一旦客户端重新连接,它将获得在脱机时间发送的所有消息 谢谢 处理这个问题的一个相当简单的方法是为每条消息分配一个ID,该ID随着每条消息的增加而增加。客户机需要跟踪他收到的最新消息,重新连接后只需将该消息ID发送到服务器;然后服务器需要将所有丢失的消息发送到客户

我正在为一个中等负载的web应用程序评估Signal

我们预计约500毫秒/秒,这对信号机来说应该不是问题

然而,我们担心这个解决方案的可靠性。我们的环境有一个有问题的网络,客户机丢失网络连接达30秒的情况并不罕见。是否有任何机制可以确保一旦客户端重新连接,它将获得在脱机时间发送的所有消息


谢谢

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

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

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

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


至于无状态是Signal的一个目标:我无法对此发表评论,除了观察到我无法想象任何合理复杂的真实世界应用程序不需要某种类型的支持数据存储,无论它是在Signal上还是在其他框架(WCF、XSockets等)上没什么区别。

当然,你可以使用某种查询框架,但要用最少的努力实现这一点,你可以这样做

服务器端: 客户端:

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

编辑:哦。。。要测试这一点,请使用两个浏览器,例如chrome和safari,然后断开一个浏览器的连接。。。从另一方发送一些消息,然后重新连接以查看消息的显示。您必须在localhost上使用两种不同的浏览器,因为xsockets将为每个浏览器提供唯一的存储id

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

问候
Uffe

如果您希望100%保证交付,SignalR不是您解决方案的理想人选。你需要一个强大的排队系统,你应该考虑RabByMQ()。您可以在队列中为每个客户端排队消息,即使客户端无法从中提取消息。+1 EkoostikMartin。如果你在寻找可靠的消息,你需要在使用信号器的基础上再加一层。我完全同意上面的评论。作为一种解决方法,您可以将消息保存在数据库中,当您意识到客户端接收消息时,可以将它们标记为已接收。否则,当客户端重新连接时,将推送所有未接收的消息。如何使用SignalR实现这一点?而且,这将迫使我在服务器上有一个状态,它将错过一个信号器目标,成为一个无状态的fw。@ml123您最终使用信号器了吗?工作正常吗?Tks@Pascal-我在当前项目中没有使用SignalR,但我确实广泛使用了它一两年,并发现它很好地满足了我的需求。当时我唯一的抱怨是,我不喜欢它一直使用
动态
对象,我认为这对于一个基于C#的项目来说是非常奇怪的。当然,这不是我设计它的方式。@KenSmith Tks对于反馈,我不知道如何在连续消息传递上实现这种方法。消息传递过程中,客户端同时调用
updateMe
,在这种情况下,可能会有重复的消息到达。