在重新连接时检测丢失的消息/对消息的丢失操作

Posted

技术标签:

【中文标题】在重新连接时检测丢失的消息/对消息的丢失操作【英文标题】:Detect missed messages/missed actions on messages on reconnect 【发布时间】:2016-09-15 02:55:17 【问题描述】:

我在我的应用程序中使用 SignalR 向组中的不同用户发送消息。

我们可以添加/编辑或删除消息,并通过 SignalR 集线器向该组中的所有用户发送相同的操作。

一切正常。

问题是在他的连接丢失/互联网断开或他的笔记本电脑/机器关闭期间发生的其他人操作(消息添加/编辑/删除)可能会丢失。

在恢复连接或再次打开笔记本电脑后,用户必须收到所有错过的消息,以及在他离线期间发生的错过的操作。

我们将所有用户的所有客户端(客户端 ID)存储在数据库中。

谁能指点一下怎么做?

一种解决方案可以是轮询最后一条消息 ID(已到达 ui)以检查是否存在任何新消息,但这无法达到目的,因为消息可能已在服务器上被其他用户编辑/删除。

我已经浏览了以下链接

Can SignalR handle missed messages?

Can a SignalR message loss be detected server side?

How to do guaranteed message delivery with SignalR?

Signalr client to retrieve missed messages on reconnect

https://github.com/JabbR/JabbR/issues/699

但它们都没有涵盖用户离线期间发生的整个历史的方面。

例如,如果您在 Skype 中断开连接并在几小时后返回说,它会提取在此期间发生的所有操作(添加/编辑/删除消息)的所有历史记录并将其更新给最终用户

【问题讨论】:

【参考方案1】:

由于 SignalR 不提供任何消息传递保证 - 应该自己解决这个问题。

有几种方法:

首先是使用消息队列(例如:RabbitMQ)。 这是保证消息传递给客户端的最有效方式。 但是在您的情况下,您需要将消息队列与 pub/sub 通信方式结合起来。这可能很棘手。

第二种方式在您引用的 SO 帖子之一的答案中进行了描述:Can SignalR handle missed messages?。 不要通过信号器发送数据,只发送通知;然后从服务器获取数据更新。 这是我最喜欢的客户端-服务器通知/更新方案的方式。我会在你的情况下选择它。

一种解决方案可以是轮询最后一条消息 ID(已到达 ui)以检查是否存在任何新消息,但这无法达到目的,因为消息可能已在服务器上被其他用户编辑/删除。

要克服这个问题,您可以轮询不是最后一条消息,而是轮询自上次更新以来在对话中所做的操作历史记录(添加/更新/删除消息操作)并将其应用到客户端。

【讨论】:

以上是关于在重新连接时检测丢失的消息/对消息的丢失操作的主要内容,如果未能解决你的问题,请参考以下文章

检测来自客户端的SignalR中丢失的连接

当我重新启动我的 kafka 代理时,为啥或如何丢失一些消息?

RabbitMQ消息应答重新入队

Smack 4.1 重新连接问题

收件人在 Ejabberd 中突然断开连接时消息丢失

需要大消息的 HornetQ 配置帮助