2012-04-30 72 views
5

我们创建了一个电子书阅读器的Web应用程序。所以有一点要记住的是,这个领域并不完全是阅读一本实体书。我们现在试图通过存储用户访问的电子书页面的信息来收集用户的阅读行为。由于这些信息发送到数据仓库,我们认为从书籍控制器发起事件是正确的方式。引发事件或发送命令?

bus.Publish()

但我们不知道它应该是一个发布或发送因为有真的只有一个消费者对这个事件,这是我们的商业智能团队。我们还读到,从Web应用程序发布是不可取的(http://www.make-awesome.com/2010/10/why-not-publish-nservicebus-messages-from-a-web-application /)。因此,现在替代方案是使用总线。发送(RecordPageAccessedCommand)

但是,上述命令不会改变我们的应用程序状态。那它真的是一个命令吗?我有一种感觉,我们犯的错误是使用NServiebus的功能(发布,发送),并试图将其与命令或事件等同起来。

请让我知道这是什么解决方案。

+0

访问时是否可以增加书上的计数器?然后DW可以稍后ETL计数。您的应用可能对这些数据感兴趣,以识别热门书籍或提出建议。 –

+0

@AdamFyles是的,这是可能的。这就是我们目前所做的。有几个这样的事件,我们希望转移到一个基于事件的非阻塞模型用于性能目的。 – darthjit

回答

10

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

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

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

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

1

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

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

没有其他服务应该以纯粹的形式存储或需要这些信息,但是他们可以订阅来自此服务的事件,例如,当用户阅读1000页“Business Intelligence Team Service”可以发布时一个1000页已被读取的事件,即Bus.Publish(),这可以由计费服务处理,该计费服务在下次购买时给予用户折扣。

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