0

ディストリビューターで次のことを正しく行う方法を理解するのに少し苦労しています。

  1. ワーカー間で分散されるコマンドを送信するサービス (ディストリビューター) を作成します。IWantToRunAtStartup 実装でディストリビューターを開始すると、この動作を実現できます。下記参照。
  2. これらのコマンドを処理するサービス (ワーカー) を作成します。このワーカーは、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();
    }
}

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 にキュー名/エンドポイントを追加しただけでは、これは複数のマシンで機能しませんか?

4

1 に答える 1

1

デフォルトでは、RunDistributor()を実行すると、NSBは同じプロセスでワーカーノードを使用してディストリビューターを実行します。これが、RunDistributor()構成にもかかわらずワーカーが表示される理由です。これを無効にするには、代わりにRunDistributorWithNoWorkerOnItsEndpoint()を使用してください。これらはすべて、構成を変更することでマシン間で機能します。

代わりにプロファイルを使用することをお勧めします。これにより、構成が少し簡素化されます。NServiceBus.DistributorプロファイルとNServicerBus.Workerプロファイルを使用できます。正しく構成されていない場合、プロファイルはより多くの診断情報を提供します。お役に立てれば。

于 2013-03-04T14:36:24.620 に答える