Workflow 带分配器的NServiceBus管道
我正在使用NServiceBus构建一个处理管道,但为了使流程中的每一步都具有可伸缩性,我在配置分发服务器方面遇到了问题。以下是一些信息:Workflow 带分配器的NServiceBus管道,workflow,scalability,nservicebus,pipeline,nservicebus-distributor,Workflow,Scalability,Nservicebus,Pipeline,Nservicebus Distributor,我正在使用NServiceBus构建一个处理管道,但为了使流程中的每一步都具有可伸缩性,我在配置分发服务器方面遇到了问题。以下是一些信息: 管道将有一个主进程,对一个工作项说“OK,开始时间”,然后启动一个流程图之类的进程 流程图中的每个步骤在计算上可能都很昂贵,因此我希望能够扩展每个步骤。这告诉我,每一步都需要一个分配器 我希望以后能够将其他活动与事件挂钩。这说明我需要在完成时发布()消息,而不是发送()消息 进程可能需要根据条件进行分支。这告诉我,一个进程必须能够发布多种类型的消息 进程可
- 管道将有一个主进程,对一个工作项说“OK,开始时间”,然后启动一个流程图之类的进程
- 流程图中的每个步骤在计算上可能都很昂贵,因此我希望能够扩展每个步骤。这告诉我,每一步都需要一个分配器
- 我希望以后能够将其他活动与事件挂钩。这说明我需要在完成时发布()消息,而不是发送()消息
- 进程可能需要根据条件进行分支。这告诉我,一个进程必须能够发布多种类型的消息
- 进程可能需要连接分叉。我想我应该用传说来做这个
为了简单起见,让我们忘记分叉或加入,考虑一个简单的流水线,步骤A后面跟着步骤B,然后用步骤C结束。每个步骤都有它自己的分配器,并且可以有许多节点处理消息。
- NodeA工作程序包含一个IHandleMessages处理器,并发布EventA
- NodeB工作节点包含一个IHandleMessages处理器,并发布事件B
- NodeC工作者包含一个IHandleMessages处理器,然后管道就完成了
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个可能发生的事情:
- 然后负载平衡节点可以简单地回复到中央代理,这似乎更容易
- 另一方面,这似乎与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"/>