ask
과 tell
의 기본 차이점을 이미 알고 있지만 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
은 요청을 처리하기 위해 다른 액터로 전송할 수 있음을 의미합니다.
Tomcat도 요청을 비동기 적으로 처리하고 모든 최신 웹 서버는 요청을 비동기 적으로 처리합니다. 이해하지 못합니다. 큐에 대기중인 요청이 매우 간단하고 서버 응답 시간이 느려 집니까? –
"서로 비동기 적으로"요청을 처리 할 수 있다는 것을 의미한다면 많은 것을해야합니다. 여기서 내가 말하는 것은 HTTP 서버가 응답으로 결과를 반환하는 데 필요한 메서드로 처리기를 호출하는지 여부입니다. 이 경우 별도의 액터가 응답을 처리 할 수 없습니다. 처리기는 ask를 사용하여 액터를 호출해야하며 결과에 대해 Future를 가져야합니다. 결과가 도착하면 원래 핸들러가 다시 실행되어 응답을 처리합니다. – AmigoNico
나는이 대답을 명확하게하려고 노력했다. – AmigoNico