2016-12-15 7 views
2

jsonファイルを処理するためにakka.netでPOCを実行しています。私はバッチプロセスJArrayへの最適なアプローチに苦労しています。私の実装アッカ・コーディネーターの俳優ではメッセージ次受信:単一で完全なJArray処理することができますakka.net actor parallel execution

//coordinator actor receive 
public class ValidatedInput 
{ 
public JArray Data { get; set; } 
} 

マイコーディネーターの俳優は、以下のように行くが、私は、並列役者の数を開始するために苦労していますし、それぞれがJArrayから50件のレコードを処理します。

//coordinator actor receives messages and calls transform actor to process 
public void Receiving() 
{ 
Receive<ValidatedInput>(x => 
{ 
TransformerRouter.Tell(x); 
}); 
} 

//transform actor receives message and process, sample code 
Receive<ValidatedInput>(x => 
{ 
PipeToSupport.PipeTo<TransformResult>(MapDataAsync(x).ContinueWith(data => 
{ 
return new TransformResult();}), Self); 
}); 

私は結果を各アクターが処理する50件のJArrayレコードを渡すと、収集できると以下のようなどのような方法がありますが、何かのように:

Receive<ValidatedInputDataResult>(
{ 
TransformerRouter.Tell(x.Data.Take(50); 
}); 

答えて

3

でAkka.NETを使用していません私が行ったときしばらくは、私は常に2つの主な理由のために、可能なコレクションを中心に渡し回避:あなたが俳優に送信できるメッセージのサイズに制限があり

  • 、この制限があってもよいです増加したthis isn't recommended

  • アクターに送信されるすべてのメッセージはシリアル化されてからReceive<> 'になるとデシリアライズされます。つまり、メッセージ内に配列やその他のオブジェクトのコレクションを送信すると、毎回ラージオブジェクトヒープに割り当てられる危険がありますTellメソッドを使用します。これは、ホットコードパスの場合はできるだけ避けるべきです。

私は一度にこの種の問題に取り組んだ方法がされた:

  • は、労働者の俳優であるかを後ろにルータが含まれています

    • は「トップレベル」のコーディネーターの俳優を持っています。たとえば、ルータをdistribute messages in a round-robin fashionに設定することができます。
    • は、新しいメッセージがReceive 'になるたびに「アグリゲータ」アクタを生成し、ワーカーアクタはその結果を送信します。 Tellメソッドを使用して、アグリゲータのアクタ参照を渡すことができます。これにより、アクティタコンテキストでアグリゲータがSenderと表示されます。 「トップレベル」の俳優のルータがautomatically spawn more actors when needed
    • に構成された
  • ワーカーの俳優は、その文脈でSenderReceive以外の何物でも、単一のメッセージ、それを処理し、その後Tellそれをやっていません。

私は一度俳優・システムを使用して、非常に「流暢」はなかった、と私は積極的に約6ヶ月間Akka.NETを使用していないと可能性があるので、このアドバイスが不完全な場合がありますのでご注意くださいあなたが必要とするものを達成するためのより良い方法になります。

私は、「アクターシステムパターン」と「スカラアクターパターン」を検索し、オープンソースのScalaプロジェクトソースコードを読んで、いくつかの洞察を得ることをお勧めします。

最後に、将来の頭痛を避けるためのヒント:メッセージタイプは、常にでなければなりません。だからあなたのValidatedInputはこのような何かに見えるはずです。

public class ValidatedInput 
{ 
    public readonly JArray Data { get; } 

    public ValidatedInput(JArray data) 
    { 
     Data = data; 
    } 
} 

またはそれ以上はまだありません:

public class ValidatedInput 
{ 
    public readonly IReadOnlyList<JToken> Data { get; } 

    public ValidatedInput(IReadOnlyList<JToken> data) 
    { 
     Data = data; 
    } 
} 

は、このことができます、そして最高の幸運を願って!