使用服务总线从Web应用程序组成的服务层发布事件

时间:2013-02-20 21:23:11

标签: nservicebus servicebus

我已阅读Why not publish NServiceBus messages from a web applicationanother similar question,但我不清楚这是否也适用于服务层。例如,如果服务层由使用WCF或Web API或任何其他方式构建的Web服务或REST服务组成,那些服务是应该发布事件还是发送命令?如果这些服务托管在负载平衡的Web服务器中,则文章中列出的问题也适用于此层。建议如何改变或不改变?

如果我从Event vs Command的定义看,我所说的消息是事件,例如“创建了一个用户”,因此应该发布一个事件。事实上,创建用户的服务甚至不知道还能做什么,即可能是另一个应用程序应该为它创建一个自定义门户,而另一个应用程序应该向用户发送一个欢迎套件。这将是一个事件,而不是一个命令。当应用程序服务本身由一个或多个Web应用程序组成时,我想我对Web应用程序和应用程序服务的定义感到困惑。

Web Application

的定义
  

Web应用程序是用户通过a访问的应用程序   网络,如互联网或内联网。

但是,对我来说,用户可以是计算机,因此Web服务是Web应用程序,这就是这个问题的原因。

编辑:

让我们考虑一个具体的例子。 ASP.NET网站(MVC或Web表单 - 无关紧要)将表单显示给操作员,获取包含用户创建数据(名称,用户名,密码)的帖子,并调用WCF服务来创建用户。在网站和WCF服务之间,我们可以使用ServiceBus和send命令来创建用户(请求/响应),以便我们获得第一篇文章中描述的所有好处。 WCF服务是实际的业务处理层,即它将创建用户。这就是我有问题的地方。在创建用户之后,它应宣布已创建用户并且其他系统可以对其做出反应并执行他们应该做的任何事情。因此它完全符合发布消息的模式。但是,WCF服务本身就是一个Web应用程序,因此具有Web应用程序的大部分特性,因此存在混淆。

2 个答案:

答案 0 :(得分:2)

正如您所链接的SO问题的答案中所述,发布事件更多地与实际处理发生的位置有关。正如旁注:这不是Send 而是Publish的问题,因为这意味着两者是可以互换的,而他们的意图却截然不同。如果要发布,则希望发布。

如果您发现自己从网络公开的集成层发布,那么应该出现同样的问题:您是否应该在 代码中执行业务处理,或者将其发送到另一个端点进行处理?通常,您应该将其发送到另一个端点。如果有人想要调用它,您甚至可以考虑如何执行相关操作。例如,如果要发布UserCreatedEvent消息,则表示您创建了一个用户。如何创建用户?我是否会被迫使用WCF / Web-Api层,还是可以在某个应用程序端点处理的总线上发送CreateUserCommand消息?如果是前者,那么您可能需要重新考虑您的设计。但是,如果是后者,您应该从WCF / Web-Api发送命令,并且处理端点将执行Publish位:)

<强>更新 我的看法是它更多地关注凝聚力/关注点。您通常会与您的域,业务内部,命令和事件的服务总线以及读取的简单查询层进行交互。如果您需要向第三方公开任何内容(或者只是通过Web),那么您可以使用WCF / WS / Web-APi。关键是你应该尽量避免在集成端点(或像网站这样的前端)中进行业务处理。业务处理更适合应用程序服务器。规则有通常例外,但如果您能够影响结构,那么您处于更好的空间。

答案 1 :(得分:1)

事实上,无论代码真正负责执行操作,都应该与发布事件相同。如果您有一个MVC应用程序并且在控制器本身中您正在使用Entity Framework来插入用户记录,那么就在SaveChanges调用之后,这正是Publish应该是的位置。但是,如果控制器调用引用的二进制文件或服务来执行“添加用户”调用中涉及的操作,则发布应该在那里。我的想法是,事件应该与执行您尝试发布的事件的代码一起正确。