使用不带Sagas的NServiceBus发布/订阅时延迟消息处理
我在发布/订阅应用程序中使用NServiceBus在web应用程序上进行事件通知。现在,当某些事情发生时(如创建了便笺),会创建一条消息并在总线上发送,订阅者会接收该消息并确定谁需要获得该事件的电子邮件或SMS通知 我想做的是对一些事件的处理流进行延迟。此延迟的目的类似于直播电视上旧的7秒延迟——它让触发事件的用户有时间撤销他们所做的事情 考虑一下我们的使用不带Sagas的NServiceBus发布/订阅时延迟消息处理,nservicebus,publish-subscribe,Nservicebus,Publish Subscribe,我在发布/订阅应用程序中使用NServiceBus在web应用程序上进行事件通知。现在,当某些事情发生时(如创建了便笺),会创建一条消息并在总线上发送,订阅者会接收该消息并确定谁需要获得该事件的电子邮件或SMS通知 我想做的是对一些事件的处理流进行延迟。此延迟的目的类似于直播电视上旧的7秒延迟——它让触发事件的用户有时间撤销他们所做的事情 考虑一下我们的CommentCreated事件。当我的服务层保留新注释时,将发送此事件。此评论可以标记为私有或内部,用户创建评论并意识到应该将其标记为私有并不
CommentCreated
事件。当我的服务层保留新注释时,将发送此事件。此评论可以标记为私有或内部,用户创建评论并意识到应该将其标记为私有并不罕见
我希望在没有传奇故事的情况下完成这个延迟,因为,首先,我对它们不太了解,其次,对于这个简单的需求来说,它们似乎有点过火,而对于第三个,我不希望必须处理另一个数据库服务器来持久化它们的数据。犹太人区的选择是在我的订阅者的处理程序中设置一个计时器,并在处理之前等待几分钟,但这感觉不对
在NServiceBus中可以做到这一点吗?我知道有些人会说创建一个轮询服务,但这有点违背了服务总线的目的……除了sagas之外,我所知道的没有什么好办法——或者使用NServiceBus自己的
Saga
,,或者通过自己有效地实现saga——并使用某种超时机制,例如NServiceBus的超时服务
我同意你的观点,满足这一要求可能很简单——因为所需的基础设施已经到位!然而,如果你坚持用犹太人区的方式来建造,我认为满足这个要求并不简单
也就是说,当您为NServiceBus设置了一个适当的超时服务和一种持久化sagas的方法时,实现这一点将非常简单
但是用计时器之类的东西来破解这个问题只会带来各种各样的麻烦,比如IIS回收你的web应用时计时器不会启动等等。你有什么理由不能让用户看到UI上的注释,并且在以后再把它们推回后端吗?好吧,既然我已经有了NSB发布/订阅,我想在那里处理。持久化notes会增加复杂性,但会延迟事件触发,因为该应用程序是一个web应用程序(MVC,所以没有状态)。我所说的只是一个短暂的延迟——不超过5分钟。我想您应该在DOM(jQuery或其他)中保存注释,而不是将Bus.Send()保存到服务器,直到它们执行某些操作(按钮,离开页面)。在他们真正想要保存之前,这将是一个沙箱。此外,根据您发布的方式,您可能需要查看以下内容:是的,我已经在使用Bus.Send(),并且事件通过服务层进行。像这样坚持DOM是行不通的,因为我希望即使在他们离开页面后也能停止活动。你在犹太人区路线问题上说得对。计时器方法的最大问题是NSB处理事件,然后计时器触发。如果在事件到达和延迟计时器触发之间的时间段内订户服务器出现故障,则事件将丢失。看起来我将不得不使用sagas和timeout…但是NSB附带的timeout管理器在生产环境中不起作用,因为它是如何工作的。