3

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

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

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

有什么建议么?

4

1 回答 1

1

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

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

于 2009-09-28T03:08:25.157 回答