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

标签 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的定义

A web application is an application that is accessed by users over a network such as the Internet or an intranet.



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

编辑:

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

最佳答案

正如您链接到的 SO 问题的答案中所述,发布事件更多地与实际处理发生的位置有关。顺便说一句:这不是 Send 的问题而不是 Publish因为这意味着两者可以互换,而它们的意图却截然不同。当你想出版时,你想出版。

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

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

关于nservicebus - 使用服务总线从由 Web 应用程序组成的服务层发布事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14990182/

相关文章:

vb.net - 从另一个项目引用 NServiceBus 程序集时出现 "Reference required"错误

c# - NServiceBus - 类型未在序列化程序中注册 - 修复?

nservicebus - 并发对于传奇有什么值(value)?

azure - Windows Azure 服务总线主题 计费

ssh - 代理/ServiceBus/反向SSH

c# - Microsoft azure 服务总线 api - 如何在订阅描述上添加 AutoDeleteOnIdle

nservicebus - CQRS 项目是否需要像 NServiceBus 这样的消息传递框架?

Azure 服务总线等效项?

node.js - 用于从 Node 连接到本地服务总线的连接字符串

c# - 由 Bus.Publish() 或订阅引起的 StackOverflowException?