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