客户端短时间掉线,部分消息丢失,如何处理客户端view与signal r的同步?

How to handle client view synchronization with signal r when a client gets offline for a short period of time and some messages are lost?

我在我的网络中使用 SignalR api 为我的客户端应用程序(移动和网络)提供实时功能。一切正常,但有些事情让我有点担心:

当后端发生不同的事情时,客户端会得到更新。例如,当其中一个客户端对 SignalR 通知的资源执行 CRUD 操作时。但是,当客户端发生某些事情时会发生什么,比方说移动应用程序,并且设备数据连接断开了?

可能发生另一个客户端对资源执行了任何操作,并且当 SignalR 广播消息时它没有到达该客户端。因此,该客户端将具有旧视图状态。

正如我所读到的,似乎没有办法知道是否所有客户端都已发送和接收消息。那么,除了检查网络状态并在发生这种情况时完全重新加载资源列表之外,还有什么方法可以确保消息同步已在所有客户端上正确完成?

正如您所建议的,ASP NET Core SignalR 将管理消息缓冲的责任放在应用程序上(如果需要的话)。

如果最终一致的视图是一个问题(例如,因为操作顺序很重要)并且完全重新加载被证明是一项昂贵的操作,您可以管理一些持久的消息事件队列,直到它发生这样做是有意义的(直到最好重新加载)并从消息总线和事件源中获取一个页面,以 "dumb broker/smart consumer" 风格的方法在客户端承担责任。

这与您的情况不完全匹配,但值得称赞的是,这里有一个经过深思熟虑的处理排队 SignalR 事件的示例:您必须调整一些并给出排队事件的数字顺序。

初始状态加载和任何后续事件都可以附加一个聚合版本;在客户端从 SignalR 接收到事件的任何时候,它都可以将其当前已知状态与接收到的状态进行比较,并确定它是否错过了事件,无论是断开连接还是在初始获取后启动的集线器连接延迟;如果客户端的版本已过期并且在队列的深度之内,您可以向服务器发出请求以将事件重播到该连接以使客户端恢复同步。

阅读即时一致性与最终一致性的一些资料可能有助于制定计划。希望这对您有所帮助!