Workflow 带分配器的NServiceBus管道

Workflow 带分配器的NServiceBus管道,workflow,scalability,nservicebus,pipeline,nservicebus-distributor,Workflow,Scalability,Nservicebus,Pipeline,Nservicebus Distributor,我正在使用NServiceBus构建一个处理管道,但为了使流程中的每一步都具有可伸缩性,我在配置分发服务器方面遇到了问题。以下是一些信息: 管道将有一个主进程,对一个工作项说“OK,开始时间”,然后启动一个流程图之类的进程 流程图中的每个步骤在计算上可能都很昂贵,因此我希望能够扩展每个步骤。这告诉我,每一步都需要一个分配器 我希望以后能够将其他活动与事件挂钩。这说明我需要在完成时发布()消息,而不是发送()消息 进程可能需要根据条件进行分支。这告诉我,一个进程必须能够发布多种类型的消息 进程可

我正在使用NServiceBus构建一个处理管道,但为了使流程中的每一步都具有可伸缩性,我在配置分发服务器方面遇到了问题。以下是一些信息:

  • 管道将有一个主进程,对一个工作项说“OK,开始时间”,然后启动一个流程图之类的进程
  • 流程图中的每个步骤在计算上可能都很昂贵,因此我希望能够扩展每个步骤。这告诉我,每一步都需要一个分配器
  • 我希望以后能够将其他活动与事件挂钩。这说明我需要在完成时发布()消息,而不是发送()消息
  • 进程可能需要根据条件进行分支。这告诉我,一个进程必须能够发布多种类型的消息
  • 进程可能需要连接分叉。我想我应该用传说来做这个
希望这些假设是好的,否则我的麻烦比我想象的要多

为了简单起见,让我们忘记分叉或加入,考虑一个简单的流水线,步骤A后面跟着步骤B,然后用步骤C结束。每个步骤都有它自己的分配器,并且可以有许多节点处理消息。

  • NodeA工作程序包含一个IHandleMessages处理器,并发布EventA
  • NodeB工作节点包含一个IHandleMessages处理器,并发布事件B
  • NodeC工作者包含一个IHandleMessages处理器,然后管道就完成了
以下是配置文件的相关部分,其中#表示工作进程的数量(即有输入队列NodeA.1和NodeA.2):

NodeA:
基站:
诺代克:
以下是分销商配置的相关部分:

Distributor A:
<add key="DataInputQueue" value="NodeA.Distrib.Data"/>
<add key="ControlInputQueue" value="NodeA.Distrib.Control"/>
<add key="StorageQueue" value="NodeA.Distrib.Storage"/>

Distributor B:
<add key="DataInputQueue" value="NodeB.Distrib.Data"/>
<add key="ControlInputQueue" value="NodeB.Distrib.Control"/>
<add key="StorageQueue" value="NodeB.Distrib.Storage"/>

Distributor C:
<add key="DataInputQueue" value="NodeC.Distrib.Data"/>
<add key="ControlInputQueue" value="NodeC.Distrib.Control"/>
<add key="StorageQueue" value="NodeC.Distrib.Storage"/>
分销商A:
分销商B:
分销商C:

我使用每个节点的2个实例进行测试,问题似乎出现在节点B的中间。基本上有2个可能发生的事情:

  • 节点B的两个实例都报告它正在订阅EventA,还报告NodeC.Distrib。Data@MYCOMPUTER正在订阅节点B发布的EventB。在这种情况下,一切都很好
  • 节点B的两个实例都报告它正在订阅EventA,然而,一位工作人员说NodeC.Distrib。Data@MYCOMPUTER正在订阅两次,而另一名员工没有提及。
  • 在第二种情况下,似乎仅由分发服务器路由订阅消息的方式控制,如果“overacheer”节点处理事件,则一切正常。如果“后进生”处理EventA,则EventB的发布没有订户,工作流将终止

    所以,我的问题是:

  • 这种设置可能吗
  • 配置是否正确?除了简单的一级发布服务器/2个工作服务器设置之外,很难找到任何分销商配置的示例
  • 让一个中央代理进程执行所有非计算密集型的交通警察操作,并且仅在任务长期运行且必须负载平衡时向分发服务器后面的进程发送消息,这样做更有意义吗?
    • 然后负载平衡节点可以简单地回复到中央代理,这似乎更容易
    • 另一方面,这似乎与NServiceBus的优势所在的权力下放不一致
    • 如果这是答案,并且长时间运行的进程的done事件是一个应答,那么如何保持发布,从而在发布的事件上实现以后的可扩展性

    您的问题是节点之间看不到其他订阅服务器列表。出现此问题的原因是,您在默认NServiceBus概要文件(lite)下尝试生产场景(扩展),它不支持扩展,但使单机开发非常高效

    要解决此问题,请使用本页所述的生产配置文件运行NServiceBus主机:

    这将使不同的节点共享相同的订阅者列表


    除此之外,您的配置是正确的。

    感谢您在这里和NServiceBus组中回答我的问题-我本想将您的答案迁移到这里,但您抢先回答了我!
    Distributor A:
    <add key="DataInputQueue" value="NodeA.Distrib.Data"/>
    <add key="ControlInputQueue" value="NodeA.Distrib.Control"/>
    <add key="StorageQueue" value="NodeA.Distrib.Storage"/>
    
    Distributor B:
    <add key="DataInputQueue" value="NodeB.Distrib.Data"/>
    <add key="ControlInputQueue" value="NodeB.Distrib.Control"/>
    <add key="StorageQueue" value="NodeB.Distrib.Storage"/>
    
    Distributor C:
    <add key="DataInputQueue" value="NodeC.Distrib.Data"/>
    <add key="ControlInputQueue" value="NodeC.Distrib.Control"/>
    <add key="StorageQueue" value="NodeC.Distrib.Storage"/>