NServiceBus消息类型和思维过程

NServiceBus消息类型和思维过程,nservicebus,Nservicebus,在我们的场景中,我考虑使用pub-sub技术。但是我不知道哪一个是更好的选择 一,######## 我们的一个web服务将在外部调用ExternalPersonCreatedMessage时发布一条消息,说明发生了什么事情 此消息将包含一个字段,该字段表示要处理消息的目的地(允许多个目的地) 各种订户将订阅。这些订阅者将通过检查destination字段来过滤消息,查看是否需要执行任何操作 二,######## 我们的web服务将解析传入呼叫,并根据字段中提供的目的地发布特定类型的消息。i、 e

在我们的场景中,我考虑使用pub-sub技术。但是我不知道哪一个是更好的选择

一,########

我们的一个web服务将在外部调用ExternalPersonCreatedMessage时发布一条消息,说明发生了什么事情

此消息将包含一个字段,该字段表示要处理消息的目的地(允许多个目的地)

各种订户将订阅。这些订阅者将通过检查destination字段来过滤消息,查看是否需要执行任何操作

二,########

我们的web服务将解析传入呼叫,并根据字段中提供的目的地发布特定类型的消息。i、 e.将创建许多Destination[n]PersonCreatedMessage消息

订阅者将只订阅他们关心的特定消息。i、 e.不必过滤任何消息

问题

以上哪项是更好的选择?为什么?我如何阻止自己发出请求消息。从我所阅读/看到的内容来看,我应该尝试以PersonCreated、PersonDeleted的方式来构建此结构,即在请求某事发生的形式中,例如CreatePerson或DeletePerson,发生了某事,而不是


我的想法正确吗?我一直在寻找关于如何组织信息的指导,确保我没有走错方向,但没有找到关于做什么和不做什么的指导。有人能帮助和指导吗?我想试着从下面的例子中得到正确答案:)

NServiceBus处理pub sub的方式更像是您的选项二

  • 发布服务器服务具有输入队列和订阅存储
  • 订户服务有一个输入队列
  • 订阅服务器在启动时将向发布服务器的输入队列发送订阅消息
  • 订阅消息包含订阅方感兴趣的消息类型和订阅方队列地址
  • 发布者在订阅存储中记录订阅
  • 发布者收到一条消息
  • 发布者根据订阅列表评估消息类型
  • 对于找到的每个匹配项,发布者将消息发送到队列地址
    在我看来,你应该停止考虑目的地。消息就是消息。它们不应该包含任何固有的目的地信息。订阅机制定义解决方案的寻址/路由要求

    根据参考文章中的集成场景,我认为您可能需要一个传奇来完成接受消息->操作消息->发送确认的工作流。如果确认在操作后立即发送,您可以使用NSBs消息处理程序管道功能,该功能允许您按指定顺序链接处理程序,例如

    First<FilterHandler>.Then<DoWorkHandler>().AndThen<SendConfirmationHandler>();
    
    首先。然后()然后();
    
    在内容过滤方面,尽管会产生一些传输开销,但您可以这样做,这意味着队列将不得不接受消息,并且进程将始终在每条消息上调用第一个处理程序(您可以在任何时候短路上述管道)。在这种情况下,您真正需要的可能是一个分发服务器/工作服务器设置,其中所有工作服务器都是相同的,您可以处理一些负载


    如果您确实有具有完全不同逻辑的不同端点,那么我将让发布者进程(仅接受和发布消息)将入站消息转换为订阅者可能感兴趣的其他内容。如果您发现一个给定的已发布消息只有一个订阅者,那么您根本不需要发布,只需将Bus.Send()发送到正确的端点。

    您能详细介绍一下业务规则吗?在这种情况下,您可能不需要发布。根据我的经验,内容过滤不是一个好办法。我觉得我好像在兜圈子,但这有助于解释商业场景。作者非常友好(并且非常感谢)帮助我逐步掌握NServiceBus。这个问题和上面博客上的评论混杂在一起,我仍然需要快速回答。我不知道这些问题是否以任何方式表明NServiceBus是错误的工具。非常感谢您的帮助。您可以使用PServiceBus(PServiceBus.codeplex.com),它允许您发布通知,并让订阅者使用过滤器进行订阅,指定他们只希望在消息包含特定字段(如destination)时接收消息。过滤将在ESB服务器级别而不是订阅者级别进行,因此订阅者不需要检查消息是否符合他们的标准。使用这种方法可以省去你发布两条不同消息的麻烦,或者更多。谢谢你的回答。同时也感谢您对内部工作进行更详细的解释。在我看来,我必须想到例子2中所解释的目的地。在示例2中,由于使用了pub/sub,所以我没有考虑终点的目的地,但是发布特定终点所需的特定类型的消息就足够了解目的地了。这是令人沮丧的,因为我想确保按照预期的方式使用NServiceBus。引发Destination1Message或Destination2Message类型的消息似乎是错误的。[续]在我看来,示例1是更通用的示例,因为路由/消息不知道目的地。订阅服务器中的处理根据消息的内容做或不做任何事情。我仍在寻找发布/订阅和消息类型的生产示例。我似乎不得不发布面向请求而不是面向“发生了什么事”的消息:'(感谢Adam。工作流(事务周期)是接受1消息