2017-12-19 1 views
1

최근에 나는 수업에서 배우를 래핑하여 자신이 ActorRef을 처리 할 때 잃어버린 typesafety 중 일부를 되 찾을 수 있다고 생각했습니다. 결국 문제는 특정 메시지를 보낼 필요가있을뿐 아니라 예상 결과에 응답해야한다는 것입니다. 그래서 나는 결국 결과를보고 할 수 있도록 Promise을 포함하는 액터에게 메시지를 보낼 수 있다고 생각했습니다.Akka 배우 : ask 패턴 대 Promise

그게 나쁜 생각입니까? 그것은 나에게 꽤 깔끔하게 보인다. 형식이 좋고 잘 작동한다. 왜 아이디어를 가진 사람이 없습니까? 내가 눈치 채지 못한 문제가 있습니까?

는 아무 문제가 패턴 기반의 솔루션

case class GetUser(id:Long) 

(actorRef ! GetUser(1l)).mapTo[User] 

class UserRepoActor extends Actor{ 
    def receive={ 
    case GetUser(id)=> 
    sender() ! getUser(id) 
    } 

    ... 
} 

약속 기반 솔루션

case class GetUser(id: Long, resp: Promise[User]) 

val req = GetUser(1l,Promise()) 
actorRef ! req 
req.resp.future // No casting!! 

class UserRepoActor extends Actor{ 
    def receive={ 
    case GetUser(id,resp)=> 
    response.success(getUser(id)) 
    } 

    ... 
} 
+0

약속이 포함 된 Actor에게 메시지를 보내면 무엇을 의미합니까? 어쨌든 들어오는 메시지에 일치 패턴을 지정해야합니다. 몇 가지 코드 샘플을 게시 할 수 있습니까? – sparkr

답변

0

없습니다 부탁드립니다. 아주 가까이 접근 방법 유일한 차이 akka typed에 사용되는 : 단일 사용 ActorRef[T]은 분산 배우 시스템에서 작동하지 않습니다 Promise[T]

1

Promise의 대신에 전송되고있다.

최소한 추가 노력없이.

0

패턴을 묻는 것이 좋습니다.

1) 액터는 상태를 공유하지 않으며 메시지를 통해 외부 세계와 상호 작용해야합니다. 약속을 이행하는 것은 그래서 약속 기반의 접근 방식은 간단한 경우에 작동 실제로 다시 시작

의 경우 배우의 창조자 (예를 들어, 약속) 휴식 배우의 라이프 사이클에 상태 오브젝트를 통과하는 돌연변이 공유 변수

2

)입니다. 그러나 당신이 그것을 아마 사용한다면 아마도 당신은 akka와 같은 복잡한 것들을 필요로하지 않을 것입니다.

+0

사실 전적으로 사실입니다. 솔루션이 복잡할수록 유형 안전성을 더 많이 활용할 수 있습니다. 결국 약속 기반 솔루션은 유형 보호를 추가하기위한 것입니다. 분산 시스템을 사용하기를 원한다면 약속 기반 솔루션은 실패 할 것이고 Akka는 실제로 유사한 방식으로 어떤 유형 안전 장치를 추가하기 위해 노력하고 있다는 것을 다른 두 제안 된 솔루션에 의해 알게됩니다. – caeus

+0

상태 저장 객체를 액터에 전달하면 akka API의 불편 함이 있지만 akka 이데올로기를 위반하게됩니다. 내 관점에서 보면 그것은 더 큰 악입니다. 내가 지적한대로 분산 시스템의 경우뿐만 아니라. – simpadjo

관련 문제