【问题标题】:NServiceBus design ideasNServiceBus 设计理念
【发布时间】:2011-10-14 13:38:21
【问题描述】:

任何具有 NServiceBus 经验的开发人员/架构师都可以提供以下方面的指导和帮助吗?

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

当第三方应用程序中发生某些活动时,它们会向我们发送消息。即调用 Web 服务,传递消息中的各种信息字段等。我们无法控制也无法更改此第三方应用程序。

我的职责是创建此 Web 服务并将消息处理到每个 ERP 中。第三方决定了 Web 服务的外观,但不决定它负责什么。我们必须接受,如果他们得到“成功”的回复,那么我们此时已对该消息负责!即,我们需要确保尽可能接近完美,不会发生数据丢失。

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

显然,在整个设计中,我需要一些有助于确定目标 ERP 的业务规则,然后是确定每个 ERP 中实际发生什么的业务规则。所以我也有一个关于 BRE 的问题,但这可以等待,尽管仍然可能是消息必须执行的驱动程序。

所以:

第三方>网络服务调用>存储消息(&返回成功)>确定哪个ERP是目标>处理每个到ERP>标记消息完成

如果出现任何故障,请确保消息不会丢失。 p.s.整机可能死机,MSMQ如何防止丢失?这只是磁盘弹性等吗?

非常感谢您阅读并提供更多建议。

【问题讨论】:

    标签: nservicebus


    【解决方案1】:

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

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

    此消息应该由另一个端点接收,但它需要能够考虑重复消息或使用幂等性,以免重复出现问题。如果第三方访问了您的 Web 服务,并且消息已成功放置在总线上,但随后某些错误阻止他们接收 200 响应代码,您将从他们那里得到重复。

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

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

    由于 NServiceBus 和 MSMQ 天生能够应对此类问题,您担心的所有其他事情(防止消息丢失、机器死机时会发生什么)都将得到解决。

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

    【讨论】:

    • 我建议使用 saga 进行这种集成,而不是 Bus.Publish。然后,saga 还可以处理幂等性问题(通过给它足够长的超时时间)。
    • @David - 所有 ERP 会处理同一条消息还是重复消息?即如何对此进行错误处理。作为一组 ERP 或每个 ERP。无论哪种方式,主要信息会发生什么?对不起,新手问题。
    • @Udi - 与 Davids 的回应相比,您能否扩展传奇故事?它在描述的场景中如何工作? @anyone - nservicebus 如何获得许可?每个服务器使用消息?如果是这样,对我们来说可能太贵了。
    • 消息发布后,每个订阅者都会获得自己的消息副本。每个订阅者都有自己的错误处理。因此,如果您有 3 个订阅者和 2 个未能处理消息,则每个失败的端点都会在错误队列中收到 2 个消息,而第三个端点将成功完成其任务。
    • 在 sagas 上,它有点像处理消息之间的内存,数据以 saga 状态存储。当第一条消息进来时,它将开始一个 saga 并从超时管理器请求超时 - 比如说 5 分钟。如果有另一条消息进来(因为重复消息的问题),传奇会说“啊,我知道我已经知道了。让我们再等一会儿。”或者“哦,我看到消息中的数据发生了变化,让我们记下这一点。” (续...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多