2016-09-30 2 views
0

Akka로 시스템을 만들기 시작합니다. 이 시스템은 제품의 종속성을 해결해야합니다. 종속성은 두 가지 소스에서 계산됩니다.Akka, 주어진 요청에 대한 응답을 종합하십시오.

class Deps extends Actor { 
    def receive = { 
    case Resolve(p) => 
    context.actorOf(System1.props) ! Resolve(p) 
    context.actorOf(System2.props) ! Resolve(p) 
    } 
} 

그러나 자체 응답을 위해 두 응답을 합산해야합니다. Akka의 경험이 없으면 두 가지 해결책을 생각하고 있습니다.

1 /를 Deps 배우 아이에서 Response을가 나타난다 Map[(Product, Sender), Set[Response]]

때마다 유지, 그것은 세트에 대한 응답을 추가하고이 개 응답이 경우 생성하고 응답을 보낼 수 있습니다.

2 /는 Deps 배우 하나 ActorProduct

당 생성 (또는 인 아역 작성) 생성자 파라미터로서 Product로 초기화한다. 그것은 두 개의 var Option[Response]을 유지하고 Response을 수신 할 때마다 응답을 생성하고 보낼 수 있는지 확인합니다.

나는 이것이 최선의 방법이라고 생각하지만 응답을 위해 var발신자에 대해 하나씩 유지해야하므로 최선의 방법이라고 확신하지 못합니다.

3/사용 ask

모든이 문서에 설명되어 있습니다.

4/사용 변경 가능한 "결과"내 실제 코드가 이미 모든 소스의 결과에서 갱신되는 Report

으로 말한다. 하지만 스프레이와 같은 패턴을 사용할 수 있습니다. 보고서를 메시지의 일부로 모든 배우에게 전달할 수 있습니다. 즉, 즉시이를 업데이트하여 내가 실제로 "발사하고 잊을 수"있습니다.

액터로부터 보낸 사람에게 회신하기 전에 여러 응답을 대기 및 집계하는 일반적인 방법은 무엇입니까?

답변

0

할 수 있습니다 내가 최고의 대한-이해와 이해 생각 FutureflatMap 기능을 사용하여 "집계 복수 응답"

val fut1 : Future[Response] = 
    (context.actorOf(System1.props) ? Resolve(p)).mapTo[Response] 

val fut2 : Future[Response] = 
    (context.actorOf(System2.props) ? Resolve(p)).mapTo[Response] 

val comboFut : Future[(Response, Response)] = 
    for { 
    resp1 <- fut1 
    resp2 <- fut2 
    } yield (resp1, resp2) 

이 미래가 다음 pipe pattern과 함께 사용할 수 있습니다

import akka.pattern.pipe 

comboFut pipeTo sender 
+0

감사합니다. 하지만 여기서 "ask"패턴을 사용하고 있습니다. 그 동안 "말하기"가 선호되는 것처럼 보입니다. –

+0

tell은 성능상의 이유로 선호되지만 액터 내의 논리는 훨씬 더 복잡해집니다. 묻기를 사용하여 이해를 사용하여 응답을 집계 할 수 있습니다. 다중 수신 호출 사이에서 상태를 유지해야한다는 것을 알려줍니다. –

관련 문제