.net - 使用 MSMQ 的多播时如何检测不可恢复的数据丢失?

标签 .net msmq multicast

使用 MSMQ 多播时,如果(启用多播的)队列接收到一些消息,然后机器遇到暂时的网络连接丢失,则在重新建立连接时它将再次开始接收消息。如果网络中断的持续时间很短,那么队列将接收所有消息(即使是在接收机器断开连接时发送的消息)。但是,如果持续时间足够长(几分钟),那么一些消息将会丢失......接收到的消息会有间隙。

这是预期的行为,因为 MSMQ 多播提供可靠(但不保证交付)。我的问题是 MSMQ 是否在数据丢失时公开信息。如果我理解正确,PGM已经能够检测到“不可恢复的数据丢失”,但是 MSMQ 是否会公开此信息?

一种想法是在每次发送时递增的每条消息中包含一个整数。这将允许接收者检测消息中的间隙(来自单个发送者)。但是,我相信 PGM 已经做到了这一点。如果 PGM/MSMQ 已经可以检测到这一点,我不想在应用程序级别添加它。

有什么建议么?

最佳答案

我从来没有使用过 MSMQ,所以我不确定是否有办法通知底层 PGM 套接字的不可恢复丢失。但是,在原始 PGM 套接字上,如果无法恢复丢失的数据包(例如,发送方的重发缓存中不再有数据),套接字将断开连接。在这种情况下,该套接字的 Receive 方法将返回 WSAECONNRESET。
MSMQ 中是否有连接/断开连接事件可能会提醒您底层套接字连接重置?

就个人而言,我总是在我的消息中包含某种应用程序级别的标题,例如对于您的情况,一个源(如果接收者从多个发送者接收数据,您需要这个)和一个序列号属性,然后检查间隙,与一些带外快照服务配对,允许您通过可靠的协议(protocol)请求丢失的数据像 TCP。

关于.net - 使用 MSMQ 的多播时如何检测不可恢复的数据丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1397518/

相关文章:

c# - 数据访问层(DAL)中的LINQ查询方法

.net - WPF 应用程序中的 WCF 命名管道

architecture - 发布/订阅消息中的本地队列与远程队列

sockets - Windows-Linux-Mac上的UDP套接字网络断开连接行为

java - Java 中的多播不起作用

c# - 如何删除名称中的特殊字符,如 Frédéric?

.net - c++ fatal error c1083项目以前很好,现在怎么办?

c# - MSMQ 绑定(bind)不匹配

dns - 无法使用 2 个 DNS 名称发送到 MSMQ

Java - 仅在本地主机上工作的 UDP 多播