ディストリビューターで次のことを正しく行う方法を理解するのに少し苦労しています。
- ワーカー間で分散されるコマンドを送信するサービス (ディストリビューター) を作成します。IWantToRunAtStartup 実装でディストリビューターを開始すると、この動作を実現できます。下記参照。
- これらのコマンドを処理するサービス (ワーカー) を作成します。このワーカーは、X 個のインスタンスを開始してスケールアウトします。
- これまでのところ、これはすべて同じマシン上にあります。
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 にキュー名/エンドポイントを追加しただけでは、これは複数のマシンで機能しませんか?