在 IIS(包括 Azure Web 角色)下托管 NServiceBus 订阅者(message/event 处理程序)是否安全

Is it safe to host NServiceBus subscribers (message/event handlers) under IIS (including Azure Web Roles)

我们正在设计一个基于 Web 但也使用 NServiceBus 和 Azure 服务总线进行通信的系统。我们有一个用于应用程序的本地服务器 运行 IIS,还有几个云服务 运行 用于与外部各方通信的网络角色(这些方调用云中的 RESTful 接口和消息放在公共汽车上,反之亦然)。

云解决方案和本地服务器都需要订阅和发布消息。发布似乎不是问题,但如果 IIS 关闭进程,这些订阅会发生什么情况,它们会在消息到达时再次被唤醒,还是服务总线真的基于拉式订阅,因此需要一个活跃的监听器。

我在这里看到了有关托管发布商的问题,但没有看到有关订阅者安全的问题。

额外信息: 我们很偶然地注意到,有时在我们的开发环境中,应用程序需要在消息开始到达之前启动几次。但是我想到,如果应用程序启动时队列中实际上已经有消息,那么它们将被处理,否则不会。所以重启只是意味着它看到旧消息并处理它们然后一旦 运行 它就可以正常工作了。然而,另一位同事指出,nsb 相关的启动日志文件仅在他首次访问同一 Web 应用程序中托管的网站后才会生成。我刚刚遇到了类似的问题,消息在队列中,但未命中处理程序上的断点。当我在同一个 iis 应用程序实例上点击 webapi 方法时,消息突然被处理了。所以我由此得出的结论是,不,在 iis 下或在这种情况下甚至是 web 角色下托管订阅者都是不安全的。

我根据我的经验回答我自己的问题,而不是对 NServiceBus 或 Azure 服务总线的任何深入了解。

似乎依赖服务总线侦听器在 IIS 或 Web 角色下处于活动状态并不安全。两者都可以关闭进程,并且由于总线侦听器依赖于轮询服务而不是从服务推送到侦听器的消息,因此在进程再次启动之前不会收到更多消息。

好消息是,当关联的网站或网络服务被点击时,该进程将重新启动。因此,如果您绝对知道您将在网站上收到比总线上更多的流量,那么您可能会冒总线侦听器将保持活跃的风险。然而,对于我们的项目,我们正在将侦听器拆分为单独的 windows 服务。