2016-12-15 2 views
2

json 파일을 처리하기 위해 akka.net에서 POC를 수행하고 있습니다. 나는 일괄 처리 JArray에 대한 최적의 접근 방법으로 고심하고있다. 내 구현 akka 코디네이터 배우에서 다음과 같은 메시지 수신 : 하나의 완전한는 jarray 처리 할 수 ​​akka.net 배우 병렬 실행

//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를 사용하지 않은 내가 한 때 잠시,하지만 난 항상 두 가지 이유를 들어, 가능한 컬렉션을 주위에 전달 피할 : 당신이 배우에게 보낼 수있는 메시지의 크기에 제한이

  • ,이 제한 될 수 있지만, 증가한 this isn't recommended.

  • Receive<> 'd 일 때 액터에게 보내는 모든 메시지가 직렬화 된 다음 deserialize됩니다. 즉, 메시지에 배열이나 다른 객체 모음을 보내는 경우 대형 객체 힙에 매번 할당 될 위험이 있습니다 Tell 메서드를 사용합니다.이 코드는 핫 코드 경로 인 경우 가능한 한 많이 피해야합니다.

내가 시간에 이러한 유형의 문제를 달려 드는 방법이었다 :

  • 는 작업자 배우가 된 뒤에 라우터를 포함
    • 은 "최상위 수준"코디네이터 배우 되세요 . 예를 들어 라우터를 distribute messages in a round-robin fashion으로 구성 할 수 있습니다.
    • 은 새 메시지가 Receive '일 때마다 "애그리 게이터"액터를 생성합니다. 작업자 액터는 결과를 보냅니다. Tell 메서드를 사용하고 수집기의 액터 참조를 전달하여 작업자가 액터 컨텍스트에서 집계자를 Sender으로 볼 수 있습니다.
  • 은 "최상위 수준"배우의 라우터 automatically spawn more actors when needed
  • 배우 Receive에 불과 하나의 메시지 처리를하지 않았다 노동자와 그 맥락에서 Sender에 다음 Tell를로 구성되었습니다.

나는 시간에 배우 시스템을 사용하여 매우 '유창'하지 않았다으로이 충고가 불완전 할 수 있음을 명심하고, 나는 적극적으로 약 6 개월 동안 Akka.NET을 사용하지 않은 거기 가능성 드리겠습니다 당신이 필요로하는 것을 성취 할 수있는 더 좋은 방법이 될 것입니다.

Google에서 "액터 시스템 패턴"및 "스칼라 액터 패턴"을 검색하고 오픈 소스 스칼라 프로젝트 소스 코드를 통해 읽는 것이 좋습니다. 그러면 어떤 통찰력도 얻을 수 있습니다.

마지막으로 향후 두통을 피하기위한 팁 : 메시지 유형은 이어야하며 항상이어야합니다.더 나은 아직

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

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

또는를 : 그래서 ValidatedInput은해야 다음과 같은 형태

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

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

희망이 도움이, 그리고 행운을 빕니다!