2012-05-02 4 views
3

장기간의 계산을 (단일 컴퓨터에서) 동시에 실행하려면 Akka 액터가 도움을 줄 수 있습니다.Akka : 액터 생성 및 사서함 채우기

한 가지 방법은 각 작업마다 새 액터를 스폰하는 것입니다. 예를 들어

while(true) { 
    val actor = system.actorOf(Props[ProcessingActor]) 
    (actor ? msg).map { 
     ... 
     system.stop(actor) 
    } 
} 

두 번째 아이디어는 라우터 뒤에 설정된 액터 수를 구성하는 것입니다. 그런 다음 모든 메시지를 라우터로 보내십시오.

val router = system.actorOf(Props[ProcessingActor].withRouter(RoundRobinRouter(nrOfInstances = 5))) 
while(true) { 
    (router ? msg).map { ... } 
} 

I 시스템이 과부하되면 더 인 원더 (수신 메시지의 속도는 속도 처리보다 높은)?

어느 것이 오래 걸립니까? 그리고 결국 둘 다 OOMError로 시스템을 날려 버릴 것입니까?

답변

4

각 작업마다 새로운 Actor을 만들기 전에 Future을 사용할 수도 있습니다. 그것은 정말로 당신이 달성하기를 원하는 것에 달려 있습니다. 메모리 사용량을 최소화하면서 많은 작업을 수행하려면 액터/라우터 접근 방식을 사용해야합니다. 선물은 더 비쌉니다. 각 작업마다 FuturePromise의 새 인스턴스가 만들어지기 때문입니다. 그러나 실제로는 사용 사례에 따라 다르며 그 접근 방식이 더 좋습니다. 나는 많은 배우를 만들지 않을 것입니다. 실제로 배우가 필요하지 않을 때입니다. 특히 system.actorOf은 항상 새로운 오류 커널을 생성합니다.

+0

동의 - 미래는 이러한 유형의 사용 사례에 적합합니다. – sourcedelica

+2

@ericacm 동의하지 않습니다. 같은 방식으로 많은 작업을 수행하고 어떤 종류의 오류 처리 (예 : 재시작 오류)가 필요할 것이라는 것을 알고 있다면. 그런 다음 작업을 처리 할 수있는 액터 세트를 정의하면 훨씬 더 신뢰할 수 있습니다. 액터는 메시지에서 수행해야하는 작업을 수신하고 처리하며 응답을 보냅니다. 액터가 충돌하면 (어떤 이유로) 관리자를 다시 시작하고 다시 시도하라는 메시지가 표시됩니다. 선물을 사용하면이 일이 더 힘들 것이라고 믿습니다. (불가능하지는 않지만 어렵습니다.) 그러나 유스 케이스에 달려 있다고 생각합니다. 명확화를 위해 –

+0

Thx. 배우가 메시지보다 비싸다는 것을 알 수 있습니다. – rompetroll