NServiceBus Дистрибьютор всего за 2 шага?

У меня возникли проблемы с выяснением того, как правильно сделать следующее с дистрибьютором:

  1. Создать сервис (распространитель), который отправляет команды, которые распределяются среди работников. Если я запускаю Distributor с реализацией IWantToRunAtStartup, я могу добиться такого поведения. Увидеть ниже.
  2. Создайте сервис (рабочий), который обрабатывает эти команды. Этот рабочий я бы затем начал Х количество экземпляров для масштабирования.
  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();
    }
}

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 кажется более сложным?

И почему я могу начать работника в качестве дистрибьютора, а затем увидеть, как работник действует так, как если бы он был рабочим, когда фактически был запущен в качестве дистрибьютора?

Разве это не будет работать на разных машинах, если я просто добавлю имя / конечную точку очереди в рабочий app.config?

1 ответ

По умолчанию, если вы запускаете RunDistributor(), тогда NSB будет запускать Distributor с узлом Worker в том же процессе. Вот почему вы видите Worker, несмотря на конфигурацию RunDistributor (). Чтобы отключить это, используйте RunDistributorWithNoWorkerOnItsEndpoint(). Все это будет работать на разных машинах путем изменения конфигурации.

Я мог бы предложить использовать профили вместо этого, так как это немного упрощает настройку. Вы можете использовать профили NServiceBus.Distributor и NServicerBus.Worker. Профили предоставят вам больше диагностической информации, если вы не настроили все правильно. Надеюсь это поможет.

Другие вопросы по тегам