0

我在弄清楚如何使用分销商正确执行以下操作时遇到了一些麻烦:

  1. 创建一个发送命令的服务(分发器),这些命令分布在工作人员之间。如果我使用 IWantToRunAtStartup 实现启动 Distributor,我可以实现这种行为。见下文。
  2. 创建一个处理这些命令的服务(worker)。然后,我将启动 X 个实例来扩展该工作人员。
  3. 到目前为止,这一切都在同一台机器上。

NSB 中包含的示例有点难以理解,或者可能只是我个人 :)。

例如,我有一个分销商和一个工人:

经销商:

class MessageCreator: IWantToRunAtStartup
{
    public IBus Bus { get; set; }

    public void Run()
    {
        Thread.Sleep(5000); //Allow workers to checkin
        for (int i = 0; i < 1000; i++ )
        {
            Bus.Send(new DoWorkForCustomerCommand { CustomerID = i });
        }

    }

    public void Stop() { }
}

...

public class EndpointConfig : IConfigureThisEndpoint, AsA_Server
{
    public void Init()
    {
        Configure.Instance.RunDistributor();
    }
}

应用程序配置

<configSections>
    <section name="Logging" type="NServiceBus.Config.Logging, NServiceBus.Core" />
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" /> 
    <section name="MessageForwardingInCaseOfFaultConfig" type="NServiceBus.Config.MessageForwardingInCaseOfFaultConfig, NServiceBus.Core" />
</configSections>

<MessageForwardingInCaseOfFaultConfig ErrorQueue="error"/>
<Logging Threshold="INFO" />
<UnicastBusConfig>
    <MessageEndpointMappings>
      <add Messages="Messages" Endpoint="Worker" />
    </MessageEndpointMappings>
 </UnicastBusConfig>

工人:

public class MessageHandler: IHandleMessages<DoWorkForCustomerCommand >
{
    public void Handle(DoWorkForCustomerCommand message)
    {
        Console.WriteLine("Handled customer with Id: " + message.CustomerID );
    }
}

...

public class EndpointConfig : IConfigureThisEndpoint, AsA_Publisher
{
    public void Init()
    {
        Configure.Instance.EnlistWithDistributor();
        // For some reason this: Configure.Instance.RunDistributor(); achieves the same thing.
    }
}

应用程序配置

<configSections>
    <section name="MessageForwardingInCaseOfFaultConfig" type="NServiceBus.Config.MessageForwardingInCaseOfFaultConfig, NServiceBus.Core" />
</configSections>
<MessageForwardingInCaseOfFaultConfig ErrorQueue="error" />

这适用于我的机器,并且可以很好地分配给我开始的任何数量的工人,但我没有错过什么吗,ScaleOut 示例似乎更复杂?

为什么我可以将工人作为分销商开始,然后看到工人表现得好像是工人,而实际上是作为分销商开始的?

如果我只是在工作程序 app.config 中添加队列名称/端点,这不会跨机器工作吗?

4

1 回答 1

1

默认情况下,如果你 RunDistributor(),那么 NSB 将在同一个进程中运行一个带有 Worker 节点的 Distributor。这就是为什么尽管有 RunDistributor() 配置,您仍会看到 Worker。要禁用此功能,请改用 RunDistributorWithNoWorkerOnItsEndpoint()。通过更改配置,所有这些都将在机器上运行。

我可能会建议改用 Profiles,因为这会稍微简化配置。您可以使用 NServiceBus.Distributor 和 NServicerBus.Worker 配置文件。如果您没有正确配置,配置文件将为您提供更多诊断信息。希望这可以帮助。

于 2013-03-04T14:36:24.620 回答