Nservicebus 我的目的不是为了生产?

Nservicebus 我的目的不是为了生产?,nservicebus,Nservicebus,NServiceBus(4.7.5)的新成员,刚刚实现了一个NSB host.exe托管服务(实现iwanttorunshenbusstartsandstops),该服务检测数据库表的更改,并通过发布事件通知订阅web应用程序,例如“CustomerDatawasUpdateEvent”。在将来,我们将通过MessageHandler接收命令来执行实际的更新,但目前这个发布服务只是轮询数据库等 不过,在接近生产时,我注意到David Boike在其最新版本的“Learning NServiceB

NServiceBus(4.7.5)的新成员,刚刚实现了一个NSB host.exe托管服务(实现iwanttorunshenbusstartsandstops),该服务检测数据库表的更改,并通过发布事件通知订阅web应用程序,例如“CustomerDatawasUpdateEvent”。在将来,我们将通过MessageHandler接收命令来执行实际的更新,但目前这个发布服务只是轮询数据库等

不过,在接近生产时,我注意到David Boike在其最新版本的“Learning NServiceBus”中指出,类实现了 Iwanttorunshenbusstartsandstops实际上主要用于开发,很少用于生产。我在Start方法中设置了数据库更改检测,它工作得很好,有人知道为什么不鼓励这样做吗

以下是实际书中的评论:

实际报价为:

…在生产系统中广泛使用

不寻常与沮丧不是一回事

也就是说,我认为作者在这里的意图是强调这样一个事实:在页面的后面,他们断言这不是一个进行大量编码的好地方,因为未经处理的异常可能会导致整个过程失败

作者实际上还提到了一个可能的用例,用于在处理程序中加载资源以进行工作


好吧,也许只是我们现在的情况有点不寻常

同意-您的方法没有根本错误。我最近做了与您相同的事情,连接SqlDependency以侦听数据库事件,然后作为结果发布消息。在这些场景中,除了使用iwanttorp,您几乎没有其他方法可以做


此外,David自己也经常拖网搜索nservicebus标签,也许他会提供比我更明确的答案。

我会复制我在


我在这里直接引用自己的话:

iwanttorunshenbusstartsandstops的实现是创建快速接口的好地方,以便在调试期间通过允许您基于控制台输入发送消息来测试消息。除此之外,在生产系统中广泛使用它们并不常见。一个可能的生产用例是在启动时提供端点所需的资源,然后在端点停止时将其拆除

我想如果我能再强调一点,那就是“广泛使用”。我并不是说在生产代码中不会/不可能有IwanttorunshenbusStartsAndStops,或者说避免它们是最佳实践。我想说的是,有一大堆可能是一种代码气味

在书中的这一段上面,我警告说我要开始使用iwanttorunshenbus,并停止使用任何环境事务或try/catch。这才是关键。如果您最终在IwanttorunhenbusStartsAndStops中抛出异常,您可能会遇到大问题。如果使用.NET计时器之类的东西,然后抛出异常,则可能会使进程崩溃

让我告诉你我是如何在我的第一个N服务总线系统中搞砸的。该系统(据我所知,至今仍在使用)负责将3000多个RSS提要(可能比现在多得多)接收到CMS中。因此,处理每个提要,将其分解为项目,调整图像大小,为移动设备编码附加的视频。。。所有这些事情都是在NServiceBus消息处理程序中处理的,它被扩展到多个服务器,这真是太棒了

问题在于调度程序。我在Iwanttorunshenbusstartsandstops中实现了这一点(事实上,当时Iwanttorunatstartsandstops是Iwanttorunatstartsandstops),它很快就变成了一团混乱。我将整个表的提要信息保存在内存中,以便计算何时触发下一个ProcessFeed命令。我使用的是.NET定时器类和IIRC,我最终不得不使用ManualResetEvent之类的线程原语来协调活动。由于我使用的是.NET计时器,如果调度程序引发异常,则该端点将失败并必须重新启动。有很多奇怪的边缘案例,它总是一个虫子的泥潭。另外,这现在是一个单一的“commander应用程序”,因此虽然提要/项目处理器可以扩展,但调度程序不能

随着我对NServiceBus的经验越来越丰富,我意识到每个提要都应该是一个传奇,从FeedCreated事件开始,通过PauseProcessing和ResumeProcessing命令进行控制,使用超时来控制下一个处理时间,最后(可能)通过FeedRemoved事件结束。这将更加简单,所有内容都将在事务控制的消息处理程序中执行


那次经历让我对Iwanttorunshenbusstartsandstops有点不信任/怀疑。不是说这不好,只是需要注意。永远要准备好,如果你想做的事情不能以另一种方式更好地完成。

好吧,也许只是我们所拥有的场景有点不寻常。通常情况下,数据库插入(这更像是一个批处理案例,而不是被某些业务相关事件等更改的实体)将通过NSB托管服务中运行的命令处理程序进行,在这种情况下,iwanttorunhenbusstartsandstops.Start方法当然只会执行初始化,而实际工作(更新数据库和发布事件)将在处理程序中完成。+1.我确实认为您的用例是不常见的--我猜您是通过调度程序作为控制台应用程序运行的?如果是这样,我认为与作为Windows服务运行相比,这本身是相当不常见的。他在该链接段落中的最后一句话准确地描述了我在生产中使用iwanttorunhenbusstartsandstops的目的:提供n一个资源或启动一个后台进程