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

时间:2009-09-09 04:26:23

标签: .net msmq multicast

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

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

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

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

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

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