NServiceBus经销商只需两步?

时间:2013-03-03 16:11:03

标签: c# nservicebus nservicebus-distributor

我在找出如何正确使用分销商进行以下操作时遇到了一些麻烦:

  1. 创建一个发送命令的服务(分发服务器),这些命令在工作程序之间分配。如果我使用IWantToRunAtStartup实现启动分发服务器,我可以实现此行为。见下文。
  2. 创建一个处理这些命令的服务(worker)。这个工作者然后我将启动X个实例来扩展。
  3. 到目前为止,这一切都在同一台机器上。
  4. 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();
        }
    }
    

    的app.config

    <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.
        }
    }
    

    的app.config

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

    这可以在我的机器上运行并且很好地分配给我开始的任何数量的工作者,但是我不会错过任何东西,ScaleOut示例似乎更复杂?

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

    如果我只是在worker app.config中添加队列名称/端点,那么这不会在机器上运行吗?

1 个答案:

答案 0 :(得分:1)

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

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