【问题标题】:Raise an event or send a command?引发事件或发送命令?
【发布时间】:2012-04-30 15:22:06
【问题描述】:

我们创建了一个作为电子书阅读器的 Web 应用程序。所以要记住的一件事是,该领域并不完全是阅读实体书的领域。我们现在正试图通过存储用户访问的电子书页面的信息来收集用户的阅读行为。由于此信息进入数据仓库,我们认为从 bookcontroller 引发事件是正确的方法。

bus.Publish()

但我们不确定它应该是发布还是发送,因为此事件实际上只有一个消费者,那就是我们的商业智能团队。我们还了解到,不建议从 Web 应用程序发布 (http://www.make-awesome.com/2010/10/why-not-publish-nservicebus-messages-from-a-web-application /)。所以现在的替代方法是使用 bus.Send(RecordPageAccessedCommand)

但是上面的命令无论如何都不会改变我们的应用程序状态。那么它真的是一个命令吗?我有一种感觉,我们正在犯的错误是使用 NServiebus 的功能(发布、发送)并试图将其等同于命令或事件。

请告诉我解决方案是什么。

【问题讨论】:

  • 是否可以在访问书籍时增加一个计数器?然后,DW 可以稍后仅 ETL 计数。您的应用可能会对这些数据感兴趣,以识别热门书籍或提出建议。
  • @AdamFyles 是的,这是可能的。这就是我们目前所做的。其中有几个事件,出于性能目的,我们希望迁移到基于事件的非阻塞模型。

标签: nservicebus


【解决方案1】:

根据您提供的信息,我建议“发送”到您的端点。

发送命令意味着处理消息的端点应该做一些事情。在您的情况下,记录页面被访问是端点应该做的事情。

发布事件意味着您正在通知 0..n 个订阅者发生了某事。如果系统中的其他服务对访问页面这一事实感兴趣,则可以从命令处理程序发布事件。这里的关键是,在你记录下来之前它不是“事实”。

我发现,一旦数据可用,消费者往往会增长。能够从您的命令处理程序发布事件将使通知新消费者变得微不足道,而无需更改/冒着现有代码库的风险。

【讨论】:

    【解决方案2】:

    RecordPageAccessedCommand 是一个命令,因为它命令系统做某事,在这种情况下,记录页面已被访问。

    如果我正确理解了您的情况。应该从您的控制器向“商业智能团队服务”发送一条消息,告诉系统记录页面已被访问。该服务将存储此信息,并将成为此信息的所有者/技术权威。

    任何其他服务都不应该以纯粹的形式存储或要求此信息,但是它们可以订阅来自此服务的事件,例如,在高度人为的场景中,当用户阅读 1000 页时,“商业智能团队服务”可以发布一个已读取 1000 页的事件,即 Bus.Publish(),这可能由计费服务处理,该服务为用户下次购买提供折扣。

    数据仓库可以访问存储在“商业智能团队服务”中的这些信息,因为它属于 IT/OPS。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 2015-11-27
      • 2020-12-29
      • 2011-10-19
      相关资源
      最近更新 更多