NServiceBus设计思想

NServiceBus设计思想,nservicebus,Nservicebus,任何具有NServiceBus经验的开发人员/架构师能否在以下方面提供指导和帮助 我们需要在外部托管的应用程序和内部ERP(是的,不止一个)之间创建一个健壮的接口 当第三方应用程序中发生某些活动时,他们将向我们发送消息。i、 e.调用web服务,在消息中传递各种信息字段等。我们无法控制,也无法更改此第三方应用程序 我的职责是创建这个web服务,并将消息处理到每个ERP中。第三方决定web服务的外观,但不是它负责什么。我们必须承认,如果他们得到了“成功”的回复,那么我们在这一点上已经为这一信息承担

任何具有NServiceBus经验的开发人员/架构师能否在以下方面提供指导和帮助

我们需要在外部托管的应用程序和内部ERP(是的,不止一个)之间创建一个健壮的接口

当第三方应用程序中发生某些活动时,他们将向我们发送消息。i、 e.调用web服务,在消息中传递各种信息字段等。我们无法控制,也无法更改此第三方应用程序

我的职责是创建这个web服务,并将消息处理到每个ERP中。第三方决定web服务的外观,但不是它负责什么。我们必须承认,如果他们得到了“成功”的回复,那么我们在这一点上已经为这一信息承担了责任!i、 e.我们需要确保尽可能完美地避免数据丢失

这就是我对使用NServiceBus感兴趣的地方。首先使用它来存储/接受消息。在这一点上,我迷路了,我不知道应该发生什么,也就是说,接下来是什么设计。是否有另一台机器(进程)订阅并获取消息以将其处理到ERP中,如果是,因为每个ERP集成逻辑不同,我是否为每个ERP创建订阅者?然而,一封邮件可能有两个目标ERP,因此最好发送邮件而不订阅

显然,在整个设计中,我需要一些业务规则来帮助确定目标ERP,然后是确定每个ERP中实际发生的事情的业务规则。因此,我也有一个关于BRE的问题,但这可以等待,虽然仍然可能是一个驱动程序的消息要做什么

因此:

第三方>web服务呼叫>存储消息(&return success)>确定目标ERP>将每个ERP处理为ERP>标记消息完成

如果线路出现任何故障,请确保信息不会丢失。p、 由于整个机器可能会死亡,MSMQ如何防止损失?这只是磁盘弹性等吗


非常感谢您阅读了更多的书籍,并获得了更多的建议。

这听起来是一个完美的NServiceBus应用程序

您的web服务应该只解析来自第三方的请求并将其转换为NServiceBus消息,它应该
Bus.Send()
。在消息到达总线上之前,您不会使用200状态代码进行响应,此时,您要对此负责,而NServiceBus内置的错误/重试和错误队列功能将成为您最好的朋友

此消息应该由另一个端点接收,但它需要能够解释重复的消息或使用幂等性,这样重复就不会成为问题。如果第三方点击了您的web服务,并且消息成功地放置在总线上,但是由于某些错误,他们无法接收200响应代码,您将从他们那里获得重复的消息

此时,接收MessageFromWebServiceCommand消息的端点可以
Bus.Publish()
包含命令数据的SomeBusinessEventHappendEvent

对于每个ERP,创建一个订阅SomeBusinessEventHappenedEvent的附加端点,并使用您的业务逻辑来决定对该ERP执行哪些操作。在某些情况下,“某物”可能是“无”。这里也要记住幂等性,因为如果消息失败,它将重试

由于NServiceBus和MSMQ对此类问题具有天生的弹性,您担心的所有其他事情(防止消息丢失,如果机器死机会发生什么情况)都将得到解决

下面是一篇博文,包括一个示例项目,展示了如何通过web服务接收来自外部合作伙伴的消息,并使用NServiceBus进行处理,以及直接指向GitHub上示例项目的链接:


对于这种集成,我建议使用saga,而不是Bus.Publish。这个故事还可以处理幂等性问题(通过给它一个足够长的超时时间)。@David-同一条消息会被所有ERP处理,还是会被复制?i、 e.如何在此基础上进行错误处理。作为一组ERP或每个ERP。不管怎样,主要信息会发生什么变化?很抱歉这些新手的问题。@Udi-你能把这个传奇与大卫的回应进行比较吗?在所描述的场景中它是如何工作的@任何人-nservicebus是如何获得许可的?每台服务器使用一条消息?如果是这样的话,对我们来说可能太贵了。当消息发布时,每个订阅者都有自己的消息副本。每个订阅服务器都有自己的错误处理。因此,如果您有3个订阅者和2个处理消息失败的订阅者,那么每个失败的端点的错误队列中都会有2条消息,第三个端点的任务也会成功。在sagas上,它有点像处理消息之间的内存,数据存储在saga状态。当第一条消息出现时,它将开始一段传奇故事,并向超时管理器请求一个超时,比如说5分钟。如果出现另一条消息(由于重复消息问题),传奇故事会说“啊,我知道我已经知道了。让我们再等一会儿。”或者“哦,我看到消息中的数据发生了变化,让我们记下来。”(续)