2016-12-22 7 views
1

장기간 머무르는 Windows 서비스에서 akka.net의 원격 액터를 사용하고 있습니다. ActorSelection을 사용하여 원격 액터에 대한 IActorRef를 얻습니다. 그리고이 IActorRef를 활성 상태로 유지합니다. IActorRef는 다른 Windows 서비스에서 실행중인 액터 시스템을 가리 킵니다. 원격 액터를 다시 시작해도 원격 액터 참조가 무효화되지 않는다는 것을 알고 있습니다. 그러나 원격 Windows 서비스가 어떤 시점에서 다시 시작될 수 있으며 호출 창 서비스의 IActorRef가 유효하지 않게 될 수 있습니다.오래된 akka.net 원격 iactorref를 처리하는 방법

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 솔직한 접근 방법은 원격 액터를 호출 할 때마다 ActorSelection을 사용하여 새로운 IActorRef를 얻는 것입니다. 이것은 분명히 비효율적 일 것입니다.

다른 접근법은 예외를 트랩하고 actorselection을 사용하여 새 IActorRef를 얻고 재 시도하는 일종의 오류 처리 봉투에서 해당 IActorRef에 대한 모든 호출을 간단히 래핑하는 것일 수 있습니다. 또는 실제 호출 전에 테스트 콜을 사용하여 원격 액터가 아직 살아 있는지, 새 액터 ref를 얻지 못했는지 확인할 수 있습니다.

더 좋은 방법이 있습니까?

답변

1

죽은 액터를 탐지하기위한 기본 옵션은 Watch입니다 (documentation 참조). 한 배우가 다른 배우를 볼 때, 배우가 죽거나 도달 할 수 없으면 메시지는 Terminated 번으로 수신됩니다.

+0

답해 주셔서 감사합니다. 액터 자체에 있지 않은 코드에서 원격 액터에게 메시지를 보낼 때 어떻게 작동합니까? 예를 들어 액터 선택을 사용하여 원격 액터에 IActorRef를 가져 와서 Ask()를 통해 메시지를 보냅니다. 호출 시스템에는 행위자 자체가 없으므로 종료 된 메시지를받을 액터가 없습니다. 나는이 목적을 위해서 배우를 만들 수 있다고 생각하지만, 그런 전용 액터를 만들 필요없이 이것을 수행 할 다른 방법이 있습니까? – cfcal

0

종료 된 메시지를 보게되면 원격 행위자가 사망했음을 시스템에 경고하지만 종료 된 원격 행위자에게 얼마나 정확하게 응답해야하는지에 대한 질문이 있습니다. 액터가 생성자를 통해 원격 액터에 IActorRef를 가져 오는 것으로 가정하면 액터가 다시 활성화 될 때 액터가 원격 액터에 새로운 IActorRef를 얻는 방법은 무엇입니까? 한 가지 방법은 액터가 실패하고 부모 액터로 위임 한 다음 액터 선택을 통해 원격 액터에 새로운 IActorRef를 얻는 것입니다. 그러나 이것의 문제점은 원격 액터에 대한 원래 액터 선택이 의존성 삽입이 정상적으로 발생하는 컴포지션 루트의 비 액터 코드에서 일어 났을 수 있다는 것입니다. 액터 선택 팩토리 대리자를 전달하여이 문제를 해결할 수 있다고 가정합니다.이 대리자를 사용하면 원격 IActorRef를 재구성하는 데 사용할 수 있습니다. 내가 생각해 낸 대안은 FaultTolerantActorRef라는 IActorRef를 구현하는 래퍼 클래스를 만드는 것입니다.

이 클래스는 생성자에서 원격 (또는 로컬) 액터의 경로를 사용하고 액터 선택을 주기적으로 수행하여 원격 액터로 IActorRef를 새로 고칩니다. 원격 액터가 죽은 동안 어떤 이유로 원격 액터가 FaultTolerantActorRef에 대한 호출을하면 죽은 글자로 끝납니다. 그러나 원격 액터가 다시 온라인 상태가되면 FaultTolerantActorRef에 대한 호출은 호출하는 로컬 액터 측에서 명시 적으로 액션을 취할 필요없이 새로 부활 한 원격 액터에 도달하게됩니다.

FaultTolerantActorRef가 다음 호출시에 새로운 액터 선택을하도록하는 Invalidate 메소드가 있습니다. 이것은 원격 액터로부터의 Terminated 메시지에 대한 응답으로 액터에 의해 아마도 불려질 수 있습니다. 무효화를 호출하지 않아도 생성자에 전달 된 새로 고침 간격에 따라 새 액터 선택이 수행됩니다.