【发布时间】:2017-07-26 08:50:28
【问题描述】:
我正在构建一个具有同步 REST 端点(使用 WebAPI)和异步发布/订阅端点(使用 MSMQ 之上的 NServiceBus)的微服务,它将处理存储在由这些端点共享的数据库中的数据。
我正在尝试决定是否应该在同一个进程中托管两个端点,或者我是否应该将它们简单地托管在不同的进程中并让它们使用数据库作为共同点在这些进程之间传递数据。我的直觉表明,同样的过程会“更好”,尽管它也会更复杂:
在单独的进程中托管端点很简单:在 IIS 中托管 WebAPI 端点并将 NServiceBus 端点作为 Windows 服务托管。
在同一进程中托管它们时,可以在 WebAPI 代码中自托管 NServiceBus 端点,但不建议这样做,因为 IIS 会在一段时间不活动后关闭工作进程, 从而也杀死了服务的 NServiceBus 部分,使其无法处理传入的消息。
所以我想我必须在 Windows 服务中同时托管 NServiceBus 和 WebAPI 端点,这在using OWIN to self-host the WebAPI endpoint 时似乎是可能的。
有没有人有在相同或不同进程中托管具有 2 个端点的服务的经验,并且可以告诉我与此选择相关的问题/好处?
(This question 似乎也问了同样的问题,但始终没有得到满意的答案)
编辑 作为对@HadiEskandari 的回应,我不是在为 NServiceBus 端点寻找 WebAPI 外观。我计划让 WebAPI 端点处理简单的信息查询,这些信息存储在这些端点之间共享的数据库中。 这些 REST 调用将从 Web 应用程序调用 AJAX 样式,因此我需要它快速执行 - 通过 MSMQ 队列转发每个 REST 调用 到 NServiceBus 端点并等待响应在这种情况下似乎很慢而且很浪费。
相反,我正在寻找一种方法来保持数据访问代码和业务逻辑不仅在同一个程序集中,而且在同一个 AppDomain 中,以便两个端点可以共享相同的配置或缓存数据。
【问题讨论】:
-
如果您的其余部分有自己的数据存储并且完全独立,为什么不将其分开呢?我了解您希望在一个应用程序域中托管两个 NSB 进程,但没有看到这样做的好处?这仍然是 NSB v5+ 中受支持的方案,但即使可以,也不意味着您应该这样做。
-
澄清一下:只有一个数据库同时被 WebAPI 和 NServiceBus 端点使用:NServiceBus 端点监听业务事件并相应地更新数据,而 WebAPI 端点为此提供了简单的 CRUD 功能数据,以便可以从 Web 应用程序中使用。
-
> “NServiceBus 端点监听业务事件并相应地更新数据,而 WebAPI 端点为这些数据提供了简单的 CRUD 功能,以便可以从 Web 应用程序中使用”这听起来像是一种设计味道对我来说,你为什么要介绍所有这些耦合,然后向其中添加消息传递?
标签: web-services iis asp.net-web-api nservicebus microservices