2014-04-03 2 views
8

Scala doc 읽기 Ask와 Tell의 차이를 이해하는 데 어려움이 있습니다.Akka에서 묻고 말하기의 차이점은 무엇입니까?

http://doc.akka.io/docs/akka/snapshot/scala/actors.html 상태 :

! 예를 들어, "화재와 잊기"를 의미합니다. 비동기 적으로 메시지를 보내고 즉시 반환하십시오. 일컬어 말하십시오.

? 메시지를 비동기 적으로 보내고 회신을 나타내는 Future를 반환합니다. 일컬어 묻는다.

사용중인 액터에서 웹 요청을 생성 한 경우 묻고 말한 것의 차이점은 무엇입니까? 두 경우 모두 요청은 비동기 적으로 생성되고 응답을 기다려야합니다. 즉, 액터가 웹 서비스를 호출하고 응답을 기다리는 경우 즉시 "알릴"수있는 방법은 무엇입니까?

답변

10

asktell의 기본 차이점을 이미 알고 있지만 tell을 사용하여 HTTP 요청 처리에 다른 액터가 참여하는 방법을 이해하지 못한 것 같습니다.

HTTP 요청 처리기에서 tell을 사용하는 것이 합당한 경우 해당 요청 처리기가 필요하지 않은 HTTP 서버를 사용해야합니다. 응답. Spray은 그런 HTTP 서버입니다.

스프레이에서 요청 처리기는 응답을 반환하지 않습니다. RequestContext 객체가 주어지며 요청에 응답하면 거기에 어떤 메소드가 호출된다. 당신은 단순히 다음 요청에 응답 할 수있는 또 다른 배우, 해당 RequestContext를 보낼 수 있습니다

path("foo") { 
    rc => rc complete "foo" // respond here 
} ~ 
path("bar") { 
    rc => barActor ! DoBar(rc) // send it to bar; NO RESPONSE HERE 
} 

그런 barActor에 의해 언급 된 배우

case DoBar(rc) => 
    rc complete "bar" // respond here, in another actor 

을 말할 수있는 사실을 그 스프레이 패키지 최대 요청 컨텍스트 주위로 지나가고 어떤 배우에게서 완성 될 수있는 대상으로의 전환은 배우 모델에 아주 적합합니다. 반면에 웹 프레임 워크에서 호출 된 핸들러가 응답을 반환하도록 요구하는 경우 다른 액터를 포함 시키려면 ask을 사용해야합니다.

Typesafe가 곧 Play에 스프레이를 사용한다고 발표했습니다. Play은 요청을 처리하기 위해 다른 액터로 전송할 수 있음을 의미합니다.

+0

Tomcat도 요청을 비동기 적으로 처리하고 모든 최신 웹 서버는 요청을 비동기 적으로 처리합니다. 이해하지 못합니다. 큐에 대기중인 요청이 매우 간단하고 서버 응답 시간이 느려 집니까? –

+0

"서로 비동기 적으로"요청을 처리 할 수 ​​있다는 것을 의미한다면 많은 것을해야합니다. 여기서 내가 말하는 것은 HTTP 서버가 응답으로 결과를 반환하는 데 필요한 메서드로 처리기를 호출하는지 여부입니다. 이 경우 별도의 액터가 응답을 처리 할 수 ​​없습니다. 처리기는 ask를 사용하여 액터를 호출해야하며 결과에 대해 Future를 가져야합니다. 결과가 도착하면 원래 핸들러가 다시 실행되어 응답을 처리합니다. – AmigoNico

+0

나는이 대답을 명확하게하려고 노력했다. – AmigoNico

12

asktell의 차이점은 메시지 발신자 (반드시 액터 일 필요는 없음)의 관점입니다. ask은 메시지를 보내고 미래를 반환합니다.이 메시지는 시간 초과 또는 응답이 수신 될 때까지 기다릴 수 있습니다. tell은 메시지를 보내고 즉시 반환합니다.

ask의 경우 메시지를받는 액터는 작업이 완료되면 발신자에게 회신해야합니다.

+0

tell이 예를 들어 30 초 동안 리턴 한 프로세스에서 즉시 리턴되면 리턴하는 것은 무엇입니까? 또는 차이점은 반환 값을 기대하지 않는 곳에서 사용됩니다. wheras ask는 특정 시점에 반환 값이 필요할 때 사용됩니다. –

+1

네, 그렇습니다.둘 다 즉시 반환됩니다. tell은 'Unit'즉 아무 것도 반환하지 않으므로 반환 값이 필요하지 않습니다. 'ask'는 '기다려야한다'거나 다른 배우에게 파이프 될'Future [Any]'를 반환하거나 실행을 위해 콜백에'map'ped를 반환합니다. 'ask '는 훨씬 더 복잡하며'akka.pattern.AskableActorRef' 암시 적 변환을 통해 구현됩니다. –

관련 문제