在相同或不同的流程中托管具有2个端点的服务?

时间:2017-07-26 08:50:29

标签: web-services iis asp.net-web-api nservicebus microservices

我正在使用同步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时使用。

  3. 是否有人在相同或不同流程中托管具有2个端点的服务的经验,并且可以告诉我与此选择相关的问题/好处?

    This question似乎问同样的问题,但它从来没有得到满意的答案)

    编辑为了回应@HadiEskandari,我不是在寻找NServiceBus端点的WebAPI外观。我打算让WebAPI端点处理对它存储在这些端点之间共享的数据库中的信息的简单查询。 这些REST调用将从Web应用程序调用AJAX风格,因此我需要快速执行 - 通过MSMQ队列转发每个REST调用 在这种情况下,到NServiceBus端点并等待响应似乎缓慢且浪费。

    相反,我正在寻找一种方法来保持数据访问代码和业务逻辑不仅在同一个程序集中,而且在同一个AppDomain中,以便两个端点可以共享说,相同的配置或缓存数据。 / p>

2 个答案:

答案 0 :(得分:1)

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

  

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

通常不建议在IIS进程中运行任何后台任务(在本例中是这样),因为有Application Domain回收,Application Pool recyle设置所有这些东西都会出现。所以在我看来,Windows服务(SelfHosted OWIN)是正确的方法

我没有在NServiceBus上工作太多,所以不能对问题部分发表评论。但是看过NService Bus documentation后,我发现它是由他们推荐的。

答案 1 :(得分:1)

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

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

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

这就像你说的那样简单,并且会解耦WebAPI和后端。至于IIS流程/应用程序池被回收,因为' SendOnly'端点并没有真正做任何后台工作,自从你在AppStart上启动端点以来,应用程序池/ IIS进程回收并不是什么大不了的事。当请求进入时,如果端点已关闭,则会创建一个新实例作为传入请求的一部分。

我们的文档网站上有一个sample,告诉您如何执行此操作。