NServiceBus集群工作者/分发者使用

sac*_*cha 2 nservicebus

当前设置

当前设置

我们有一个UI(超过1个UI,但这不相关),我们有2个负载均衡的应用服务器.这样的UI将与别名对话,后面是2个负载均衡器应用服务器.应用服务器也是自托管NServiceBus端点.处理当前请求的应用服务器(可能是App Server 1或App Server 2)能够使用自托管的NServiceBus执行以下操作:

  • 在本地发送消息(这是一个可以随时运行的计算,无论谁触发它,它只是一个触发器来进行计算)
  • 在辅助服务盒上向发布者发送命令(发布者将新事件推送到工作者1和工作者2)
  • 直接在辅助服务框上向Worker 1发送命令
  • 直接在辅助服务框上向Worker 2发送命令

"App Server(s)"当前的App.Config

因此,每个应用服务器的App.Config都有这样的东西

  <UnicastBusConfig ForwardReceivedMessagesTo="audit">
    <MessageEndpointMappings>
      
      <add Assembly="Messages" Type="PublisherCommand" Endpoint="Publisher" />
      <add Assembly="Messages" Type=" Worker1Command" Endpoint="Worker1" />
      <add Assembly="Messages" Type=" Worker2Command" Endpoint="Worker2" />
      <!-- This one is sent locally only -->
      <add Assembly=" Messages" Type="RunCalculationCommand" Endpoint="Dealing" />
    </MessageEndpointMappings>
  </UnicastBusConfig>
Run Code Online (Sandbox Code Playgroud)

"发布者"当前的App.Config

目前是"发布者"App.Config

<UnicastBusConfig ForwardReceivedMessagesTo="audit">
  <MessageEndpointMappings>
  </MessageEndpointMappings>
</UnicastBusConfig>
Run Code Online (Sandbox Code Playgroud)

"工人"当前的App.Config

目前工作者App.Configs目前只需要订阅另一个端点"Publisher",他们的配置文件如下所示:

<UnicastBusConfig ForwardReceivedMessagesTo="audit">
  <MessageEndpointMappings>
    <add Assembly="Messages" Type="SomeEvent" Endpoint="Publisher" />
  </MessageEndpointMappings>
</UnicastBusConfig>
Run Code Online (Sandbox Code Playgroud)

现在,所有其他发送给工作人员的消息都直接来自其中一个应用服务器,如上面App.Config中针对应用服务器所示.

这一切都正常.

事情是我们有一个单点的失败,如果"辅助服务盒"死了,我们就塞满了.

所以我们想知道我们是否可以使用多个"辅助服务盒(每个都有一个Publishers/Worker1/Worker2)".理想情况下,它们将完全按照上述方式工作,如上图所示.如果"辅助服务箱1"可用,则使用,否则我们使用"辅助服务箱2"

我已经阅读了有关分销商(但没有使用它),如果我说的正确,我们可以在AppServer本身使用,我们将每个AppServer视为分销商和工人(对于案例)在哪里我们需要执行SendLocal命令(RunCalculationCommand)我们需要运行).

如果"辅助服务箱"必须为每个包含的端点使用分销商:

所以我们最终会得到这样的结论:

我们可能想做什么

有人可以帮助我知道我是否正在考虑这种方式,或者我是否离开了.

基本上我想知道的是:

  • 经销商是否使用正确的方法?
  • 工人/出版商配置会是什么样子,他们必须以某种方式改变指向经销商否?正如我现在所说,应用服务器直接向工作人员发送消息,应用服务器配置具有工作人员端点地址,工作人员只设置为指向发布者
  • 应用服务器配置会是什么样的?这会停止直接发送给发布者/工作人员吗?
  • 发布商配置会是什么样的?这应该指向经销商吗?

jan*_*esk 5

分销商在这里是一个很好的方法,但它的代价是增加了基础设施的复杂性.为了避免引入另一个单点故障,分发服务器及其队列必须在Windows故障转移Cluser上运行.这意味着必须将MSMQ和DTC配置为群集服务.这可以是非常有趣的..:D

我已将您称为"worker"的内容重命名为端点,从Worker1到Endpoint1,将Worker2重命名为Endpoint2.这是因为当您介绍经销商时,"工人"被非常明确地定义为特定的东西.正在从分发者接收消息的机器上的实际物理端点是工作者.因此,Endpoint1 @ ServicesMachine01,Endpoint2 @ ServicesMachine02等都是工作人员.工人从经销商处获得工作.

场景01

仅命令方案

在第一个场景中,您会看到应用服务器从负载均衡器获取请求,并将其发送到分发服务器上的Endpoint1 @ Cluster01或Endpoint2 @ Cluster01队列,具体取决于命令.然后,分发器在该队列中找到准备好的消息,并将命令发送给它.因此,对于WorkerCommand1 EITHER Endpoint1 @ ServicesBox01或Endpoint1 @ ServicesBox02最终从分发服务器获取命令并正常处理它.

情景02

命令和事件场景

在场景二中,它几乎是一样的.PublishCommand被发送到Endpoint3 @ C​​luster01.它选择一个就绪的Endpoint3,在本例中为Endpoint3 @ ServicesBox02,并为其提供命令.ServiceBox02处理消息并将SomeEvent发布到Endpoint01 @ Cluster01和Endpoint02 @ Cluster01.这些由分销商选取,在这种情况下发送到Endpoint1 @ ServiceBox01和Endpoint2 @ServiceBoxN.

注意消息总是通过分发器和Cluster01上的队列流动.这是MSMQ的实际负载平衡.

配置应用服务器更改以确保命令通过群集.

<UnicastBusConfig ForwardReceivedMessagesTo="audit">
    <MessageEndpointMappings>

      <add Assembly="Messages" Type="PublisherCommand" Endpoint="Endpoint3@Cluster01" />
      <add Assembly="Messages" Type="Worker1Command" Endpoint="Endpoint1@Cluster01" />
      <add Assembly="Messages" Type="Worker2Command" Endpoint="Endpoint2@Cluster01" />
      <!-- This one is sent locally only -->
      <add Assembly=" Messages" Type="RunCalculationCommand" Endpoint="Dealing" />
    </MessageEndpointMappings>
  </UnicastBusConfig>
Run Code Online (Sandbox Code Playgroud)

ServicesBox配置略有变化,以确保订阅也通过分发服务器.

<UnicastBusConfig ForwardReceivedMessagesTo="audit">
  <MessageEndpointMappings>
    <add Assembly="Messages" Type="SomeEvent" Endpoint="Endpoint3@Cluster01" />
  </MessageEndpointMappings>
</UnicastBusConfig>
Run Code Online (Sandbox Code Playgroud)

发布者配置没有变化.它不需要指向任何东西.订阅者将告诉它在哪里发布.