我正在处理从现场设备接收消息的情况。这些消息上印有序列号,我需要按原始顺序处理这些消息。很少有消息会丢失,但并非不可能,因此我需要一种机制来处理它。
我的实现是基于NServiceBus构建的,我正在利用“HandleCurrentMessageLater”功能将消息弹出到队列的后面,以防邮件被无序接收。
如果我最终收到序列中的下一条消息,那么这很有效,所以我可以处理积压。
在这种情况下,我有哪些选项来处理丢失的消息?我的第一个反应是实现某种老化算法,这会在一系列失败的尝试或类似事件之后增加序列号,但是必须这样做的复杂性有点过分。
有没有人遇到过类似的问题并且愿意分享他们如何解决它?
由于
答案 0 :(得分:2)
在我看来,这是您需要从业务中输入的内容。是否有时间限制,之后可以假定该消息不可挽回地丢失?如果是这样,在这种情况下应采取的商业行动是什么?如果最终收到该消息但超时后会发生什么?
你可以用Saga实现的那种案例。如果消息到达并且不按顺序,那么您仍然会调用HandleCurrentMessageLater,但是您也会请求超时,以便在业务批准的超时后这些条件仍然为真,那么补偿操作可以运行,其余的可以处理备份的消息。
或者,替代解决方案也许是可能的。您说您需要按原始顺序处理邮件。您不会详细了解这对现实生活的影响,但这听起来像是一个高级别的业务要求,而不是技术要求。换句话说,这就是企业想要看到它的方式,但它不一定是它真正发生的方式。也许您可以正常处理有序消息,并增加一个值,指示收集的数据有效的序列号。如果消息无序到达,它们仍然可以进行软处理,但序列号不会增加。
所以基本上你收到消息1-5并正常处理它们。然后你收到7-10(已被跳过6)然后你处理它们,但ValidSequenceNumber仍然是5.然后当#6到达时,你处理它,采取任何补偿动作来赶上,而ValidSequenceNumber现在是10. Saga也是实现这种逻辑的好人选。
答案 1 :(得分:1)
Send
的{{1}}或Publish
重载即可获取多个消息参数。这些批次保证按顺序处理。
答案 2 :(得分:0)
如果您确实需要所有可靠传递的消息并且您的传输通道不可靠,那么您需要一个确认和重传机制。这可能如下所示。
正常流程:
失信息:
这显然需要双向通信,从服务器到客户端的传输通道。
这个问题已经深入地解决了TCP协议,它保证了顺序传输。您可能想看一下TCP重传内部。