在SignalR保证交货(Guaranteed delivery in SignalR)

2019-08-04 18:17发布

我评价一个SignalR的中等负荷的Web应用程序。

我们期待〜500封邮件/秒,这不应该是与SignalR一个问题。

但是,我们担心这个解决方案的可靠性。 我们的环境有问题的网络,这不是罕见的客户端失去〜30秒的网络连接。 是否有任何机制来确保一旦客户端重新连接,它得到所有在其下线时间被发送的消息?

谢谢!

Answer 1:

一个相当简单的方法来处理这将是分配给每个消息,每个消息递增的ID。 客户将需要跟踪的是他收到的最新消息,并在重新连接时将只发送消息ID给服务器; 和服务器,然后将需要发送的所有错过的消息到客户端。 要实现相当简单。

编辑:我不认为你必须保持适当的服务器上任何真正的状态 - 我想几乎所有的可能被推出来你的数据存储或到客户端。 该客户端将发送了ID或者说,它已收到的最后一条消息的时间戳记:

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

你想要某种形式的支持数据存储的-因此,当服务器收到updateMe()消息,它会做对数据库的查询,并用一个ID比它刚刚收到一个更大的拔出所有行。 它将返回那些给客户端作为其返回值的一部分UpdateMe()方法。 然后它会尝试提供沿着它通常会以同样的方式来任何新信息,通过调用客户端的方法。

至于无国籍是SignalR的目标:我不能对此发表意见,超出观察,我无法想象,就不需要做有某种后盾数据存储的任何合理复杂的现实世界中的应用,无论是在SignalR或者一些其他的框架(WCF,XSockets等)差别不大。



Answer 2:

你可以ofcourse使用某种queing框架,但你可以做这样的最小的努力来实现这一目标?

Serverside集团: http://pastebin.com/tuicQYGq客户方: http://pastebin.com/a8EbusuG

我使用XSockets.NET这是一个实时通信平台(自2009年)和XSockets.NET控制器有状态,这是很容易做到。

编辑:喔......对此进行测试使用两个浏览器如Chrome和Safari,然后断开一个浏览器...从另一个发送一些信息,然后重新看到消息出现。 你必须使用本地主机上的两个不同的浏览器,因为xsockets会给每个浏览器的唯一存储的ID。

编辑:添加Func键队列,这样就可以针对特定的客户,即使他们处于离线状态。 现在只有客户匹配条件将得到的消息,如果你想。

问候Uffe



文章来源: Guaranteed delivery in SignalR
标签: signalr