akka가 메시지 전달을 보장하지 않는 이유와 방법에 대한 몇 가지 게시물을 읽었습니다. documentation,이 discussion 및 그룹에 대한 다른 토론에서는 잘 설명합니다.오른쪽 디자인 in akka. - 메시지 전달
나는 akka에 아주 익숙하며 케이스에 적합한 디자인을 알고 싶습니다. 예를 들어 서로 다른 기계에 3 명의 다른 배우가 있다고 가정 해 보겠습니다. 하나는 요리 책을, 다른 하나는 역사를, 다른 하나는 기술 도서를 담당합니다.
다른 컴퓨터에 주인공이 있습니다. 우리가 사용할 수있는 책이 있는지 검색하기 위해 주 배우에게 질의가 있다고 가정합니다. 메인 액터는 3 명의 원격 액터에게 요청을 보내고 그 결과를 기대합니다. 그래서 나는 이렇게한다 :
val scatter = system.actorOf(
Props[SearchActor].withRouter(ScatterGatherFirstCompletedRouter(
routees=someRoutees, within = 10 seconds)), "router")
implicit val timeout = Timeout(10 seconds)
val futureResult = scatter ? Text("Concurrency in Practice")
// What should I do here?.
//val result = Await.result(futureResult, timeout.duration) line(a)
요컨대, 나는 3 명의 모든 원격 액터에게 요청을 보내고 10 초 내에 결과를 기대한다.
조치는 어떻게해야합니까?
- 10 초 후에 결과를 얻지 못한다고 말하면 모두에게 다시 요청해야합니까?
- 위의 경우
within
시간이시기 상조입니다. 그러나 나는 얼마나 많은 시간이 걸릴지에 관해 미리 알지 못한다. within
시간이 충분하지만 메시지가 삭제 된 경우 어떻게됩니까?
within
시간 내에 응답을받지 못하면 요청을 다시 다시 보내십시오. 이런 식으로 뭔가, 그것은 비동기 유지 :
futureResult onComplete{
case Success(i) => println("Result "+i)
case Failure(e) => //send again
}
그러나 너무 많은 쿼리 아래 못해 통화와 부피가 너무 많은 스레드 수
?line(a)
의 주석 처리를 제거하면 동기식으로되어로드 부족으로 인해 성능이 크게 저하 될 수 있습니다.
10 초 후에 응답을받지 못한다고합니다. within
시간이시기 상조라면 무거운 쓸모없는 계산이 다시 발생합니다. 메시지가 끊어지면 10
초의 귀중한 시간이 낭비됩니다. 메시지가 배달되었다는 것을 알았다면 회의 시간이 이 아니고 오랜 기간 동안 기다릴 것입니다.
사람들은 어떻게 이러한 문제를 해결합니까? ACK
? 그런 다음 모든 쿼리의 액터에 상태를 저장해야합니다. 그것은 공통점이 있어야하며 올바른 디자인을 찾고 있습니다.
자세한 답변을 보내 주셔서 감사합니다. 이것은 내 옆에서 약간의 현상금을받을 자격이있다 :). 또한 3 가지 질문 후에 언급 한 다른 질문에 대답 해 주실 수 있습니까? 일부 메시지 드롭 다운이있을 수 있다는 사실을 고려하여 문제를 해결하려고합니다. – Jatin
조금 더 자세한 정보를 추가했지만 여전히 확실하지 않습니다. 귀하의 질문에 100 % 답변했습니다. 그것이 비록 도움이 되길 바래. – cmbaxter
확인. 요약하기 위해 메시지 드롭 다운을 고려하지 말고 '시간 내에'집중해야합니다. 'within'시간보다 오래 걸리는 경우 메시지가 삭제 된 것으로 간주되어 (대부분의 경우) 후속 조치가 취해질 수 있습니다. 유일한 문제는 'within'시간이 큰 경우 (이미지 처리 작업 말하기), 다른 대안을 사용할 수 있거나 'ack'이라고 말할 수있는 경우 일 수 있습니다. 연습에서의 일반적인 질문 : 적절하게 연결되어있는 곳에서 얼마나 자주 메시지가 삭제됩니까? – Jatin