【问题标题】:NServiceBus doesn't start picking up messages until an endpoint is "touched"NServiceBus 在端点被“触摸”之前不会开始接收消息
【发布时间】:2016-11-21 18:52:59
【问题描述】:

所以当我在本地运行我的两个服务时,我可以点击服务 A,它会向服务 B 发送一个命令,该命令会接收并处理它。很直接。但是,当我将这些发布到我的 Web 服务器并向服务 A 发送请求时,该请求将其发送到服务 B(我可以在服务 B 的队列中看到该消息),但它不会被拾取和处理。我在服务 B 上创建了一个端点,它只返回一个 OK 响应——如果我调用这个端点,有效地“接触”服务,一切都会启动,并且从那一刻开始处理消息。

我认为这可能与后期编译有关,所以我将发布更改为发布时预编译,但我得到了相同的结果。

有没有办法让服务一发布就开始处理?另外值得注意的是,这两个服务都是 WebAPI 2

【问题讨论】:

  • 您将端点托管在网站/webapi 中是否有原因?您可以将它们作为 Windows 服务或类似的东西运行吗?
  • 简单,我想。该服务有许多处理程序,但它也有一个 web api。我不想推出两个完成同一件事的应用程序。

标签: asp.net .net asp.net-web-api asp.net-web-api2 nservicebus


【解决方案1】:

另一种选择(可能更“标准”)是将“处理程序”移动到 Windows 服务而不是 Web 应用程序中。

对于此 Windows 服务,您可以利用 NServiceBus 主机,它将标准类库转换为您的 Windows 服务。他们在这里有大量关于此的文档:https://docs.particular.net/nservicebus/hosting/nservicebus-host/?version=Host_6

我认为这更稳定,因为您可以将发送命令的处理(Web 应用程序/WebApi)和处理命令/发布事件(NSB 主机)分开。主机可以位于 Web 服务器本身上,也可以将它们放在不同的服务器上。

我们的默认架构是让单独的服务器运行我们的 NSB 主机,因为您以不同方式扩展 Web 应用程序和 NSB 主机。如果您在 Web 服务器上运行 NSB 主机,您可能会遇到 Web 应用程序获得过多流量并降低 NSB 主机处理能力的问题。您始终可以从使用 1 台服务器开始,监控服务器,然后随着流量的增加移动设备。

【讨论】:

  • 所以我也经常看到这是一种更常见的方法(甚至在 Particular 的网站上也提到过),但我觉得我们需要一个 web api 来处理需要的操作同步并在 iis 中同时拥有 web api 和 windows 服务似乎是错误的。想法?
  • "together" 就像是两个应用程序代表相同的有界上下文
  • 我想另一种选择是向 Windows 服务添加一个 http 侦听器,这是我们的一些遗留项目所做的。我不确定我对此感到肮脏是否有道理:/
  • 一开始我也有同样的感受,因为我担心两种不同的解决方案会访问相同的数据并且需要对这两种解决方案进行更新,这可能会导致问题。为了解决这个问题,我将把两个项目放在一个解决方案中。 1 个项目是 WebApi(或 Web 应用程序),另一个项目是 NSB 主机。然后,您可以为共享依赖项添加一个额外的库,并将所有内容保存在 1 个解决方案中。然后,您可以连接一个构建模板并将它们都部署在解决方案的 1 个构建上。
【解决方案2】:

不确定这是否是做事的“正确方式”,但我最终所做的是将每个站点设置为始终运行并自动初始化。

  • 应用程序池设置为“始终运行”
  • 网站设置preload enabled = true
  • Web.config 具有用于应用程序初始化的 webServer 条目doAppInitAfterRestart="true"
  • Web 角色添加到服务器“应用程序初始化”

设置好这些东西后,部署过程基本上就是发布站点和 iisreset。如果有更好的选择,我还在寻找:)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多