【问题标题】:Host a service with 2 endpoints in the same or separate processes?在相同或不同的进程中托管具有 2 个端点的服务?
【发布时间】:2017-07-26 08:50:28
【问题描述】:

我正在构建一个具有同步 REST 端点(使用 WebAPI)和异步发布/订阅端点(使用 MSMQ 之上的 NServiceBus)的微服务,它将处理存储在由这些端点共享的数据库中的数据。

我正在尝试决定是否应该在同一个进程中托管两个端点,或者我是否应该将它们简单地托管在不同的进程中并让它们使用数据库作为共同点在这些进程之间传递数据。我的直觉表明,同样的过程会“更好”,尽管它也会更复杂:

  1. 在单独的进程中托管端点很简单:在 IIS 中托管 WebAPI 端点并将 NServiceBus 端点作为 Windows 服务托管。

  2. 在同一进程中托管它们时,可以在 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


【解决方案1】:

在同一进程中托管它们时,可以在 WebAPI 代码中自托管 NServiceBus 端点,但不建议这样做,因为 IIS 会在一段时间不活动后关闭工作进程

如果将 idletimeout 设置为零,IIS 将不会关闭进程 在应用程序池设置中。

一般不建议在 IIS 进程中运行任何后台任务(在这种情况下是),因为有应用程序域回收,应用程序池回收设置所有这些都会出现。所以在我看来,使用 Windows 服务(SelfHosted OWIN)是正确的方法

我在 NServiceBus 上工作不多,所以无法评论问题部分。但是看过 NService Bus documentation,我可以看到它是他们推荐的。

【讨论】:

    【解决方案2】:

    缺少的一点是如何将 WebAPI 连接到 NServiceBus 端点?归根结底,您的 WebAPI 是您的应用程序接口,需要进行通信并将工作发送到后端服务以处理请求。如果您还打算通过消息传递来执行此操作,您可以执行以下操作:

    • 单独托管 WebAPI,您可以使用 IIS 或 OWIN。在您的 WebAPI 中,您可以创建和配置一个“SendOnly”端点,它将向 Windows 服务发送消息。

    • 使用 NServiceBus 作为 Windows 服务托管后端服务。这将接收并处理来自 WebAPI 的消息。

    正如您所说,这很简单,并且可以将 WebAPI 和后端分离。至于 IIS 进程/应用程序池被回收,因为“SendOnly”端点并没有真正做任何后台工作,所以应用程序池/IIS 进程回收并不是什么大问题,因为无论如何您都是在 AppStart 上启动端点。如果端点已关闭,则当请求进入时,将创建一个新实例作为传入请求的一部分。

    在我们的文档网站上有一个sample,向您展示了如何执行此操作。

    【讨论】:

    • 感谢您的回复,我对“IIS中托管的仅发送端点”设置很熟悉(实际上,相关问题stackoverflow.com/q/20743817/843345也是我提出的),但我不是为 NServiceBus 端点寻找 WebAPI 外观 - 我会澄清我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    相关资源
    最近更新 更多