【问题标题】:Delay message processing when using NServiceBus pub/sub without Sagas在没有 Sagas 的情况下使用 NServiceBus 发布/订阅时延迟消息处理
【发布时间】:2011-11-22 14:49:53
【问题描述】:

我在 pub/sub 应用程序中使用 NServiceBus 来获取 Web 应用程序上的事件通知。现在,当发生某些事情(例如创建便笺)时,会创建一条消息并在总线上发送,然后订阅者将其接收并确定谁需要收到事件的电子邮件或 SMS 通知。

我想做的是在某些事件的处理流中延迟。此延迟的目的类似于直播电视上的旧 7 秒延迟 - 它为触发事件的用户提供了撤消他们所做操作的时间。

考虑我们的CommentCreated 事件。当我的服务层保留新评论时发送此事件。此评论可以标记为私有或内部,用户创建评论然后意识到他们应该将其标记为私有的情况并不少见。

我想在没有 Sagas 的情况下完成这个延迟 因为,一方面,我不了解它们,另一方面,对于这种简单的要求,对于三个我不想处理另一个数据库服务器来保存他们的数据。 ghetto 选项是在我的订阅者的处理程序中设置一个计时器,并在处理前等待几分钟,但这感觉不对。

是否可以在 NServiceBus 中做到这一点?我知道有些人会说创建一个轮询服务,但这有点违背了服务总线的目的......

【问题讨论】:

  • 您是否有任何理由不能让用户看到 UI 上的注释,然后再将它们推回后端?
  • 好吧,既然我已经有了 NSB pub/sub,我想在那里处理它。这会增加持久化笔记的复杂性,但会延迟事件触发,因为该应用程序是一个 Web 应用程序(MVC,因此没有状态)。我只是说短暂的延迟——不超过 5 分钟。
  • 我在想你会将笔记保存在 DOM(jQuery 或其他)中,而不是 Bus.Send() 到服务器,直到他们采取一些行动(按钮,离开页面)。在他们真正想要保存之前,这将是一个沙盒。
  • 另外,根据您的发布方式,您可能需要查看以下内容:make-awesome.com/2010/10/…
  • 是的,我已经在使用 Bus.Send(),而且事件还是通过服务层来的。像这样坚持在 DOM 中是行不通的,因为我希望即使在他们离开页面后也能够停止事件。

标签: nservicebus publish-subscribe


【解决方案1】:

我知道除了 sagas 之外没有什么漂亮的方法——要么使用 NServiceBus 自己的Saga<...>,要么自己有效地实现 saga——并使用某种超时机制,例如NServiceBus 的超时服务。

我同意您的看法,只要所需的基础设施到位,就可以很简单地满足此要求!但是,如果您坚持以 ghetto 方式构建它,我认为满足要求很简单。

即当您为 NServiceBus 设置了适当的超时服务和持久化 saga 的方法时,实现这一点将很简单。

但是用计时器和诸如此类的东西来破解它只会招致各种各样的麻烦,例如当 IIS 回收您的 Web 应用等时计时器不会触发。

【讨论】:

  • 你在贫民窟路线的问题上是对的。计时器方法的最大问题是 NSB 处理事件然后计时器触发。如果在事件到达和延迟计时器触发之间的时间段内订阅服务器发生故障,则事件丢失。看起来我将不得不在超时时使用 sagas...但是 NSB 附带的超时管理器由于其工作原理而无法用于生产环境。
猜你喜欢
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
相关资源
最近更新 更多