2015-02-07 2 views
17

Akka.NET의 액터에서 예외를 처리 할 표준 패턴이 있습니까?액터 내에서 예외를 처리하는 방법은 무엇입니까?

수퍼바이저를 만드는 데 몇 가지 패턴을 보았지만 SupervisorStrategy은 배우가 해결할 수없는 것들을 처리하는 방법입니다.

저는 많은 데이터를 받고 외부 서버에 저장해야하는 액터가 있습니다. 외부 데이터베이스에 연결할 수 없습니다. 이 경우 서버가 다시 시작되고 있거나 네트워크가 다운되었을 수 있습니다. 배우 나 기타 사항을 다시 시작할 필요가 없습니다. 보낸 사람에게 무슨 일이 발생했는지에 대한 정보를 알려 주기만하면 디스크에 메시지를 저장하고 나중에 일정을 변경할 수 있습니다.

보낸 사람이 데이터베이스에 연결하는이 액터의 부모가 아닙니다. 이 문제도 처리 할 감독자를 만들어야하나요? 또는 try/catch 블록에 수신 핸들러를 캡슐화하고 정상적인 메시지 인 것처럼 사용자 정의 응답으로 보낸 사람에게 알리기 위해 Tell을 사용해야합니까?

나는 Failure 클래스가 있다는 것을 알고 있지만,이 상황에서이 클래스를 사용하고 있는지 확실하지 않습니다.

+1

Roger의 답변은 정확하지만 Akka.NET에서 계층 적 감독과 오류 커널 패턴이 모두 어떻게 작동하는지에 대한 자세한 설명과 연결하고 싶습니다. http://petabridge.com/blog/how-actors-recover-from -failure-hierarchy-and-supervision/ – Aaronontheweb

답변

16

예 있습니다. 우선, 항상 위험한 작업을 어린이 배우에게 위임하고, 모든 나이프, 화염 방사기 등을 제공하십시오. 그들이 충돌하고 타 오면, 당신의 상태는 그대로이며 새로운 아이들을 출산 할 수 있습니다.

도달 할 수없는 데이터베이스 예제의 경우. DB 통신 액터를 위로 돌립니다. 그러면이 액터에 DB up과 DB down의 두 가지 상태를 갖게 할 수 있습니다.이 상태는 FSM으로 모델링하거나 Become/Unbecome을 사용하여 모델링 할 수 있습니다.

그래서 메시지가 도착하고 DB 쿼리를 요청할 때 DB 통신기 액터가 스스로를 DB-Down 상태로 만듭니다. DB-DOWN 상태에서 쿼리를 받으면 즉시 Failure 이벤트로 응답 할 수 있습니다.

그래서 DB-Down에서 DB-Up으로 다시 이동하려면 어떻게해야합니까? DB-Communicator 액터는 ScheduleOnce을 사용하여 자체 핑 (ping) 할 수 있습니다. x 초마다 자체적으로 "CheckDBStatus"메시지를 전달하십시오. CheckDBStatus 메시지가 수신되면 DB가 다시 가동되는지 확인한 후 다시 DB-Up 상태로 되돌아갑니다.

이렇게하면 높은로드로 인해 응답 할 수없는 시나리오에서 DB를 범람하지 않고 더 많은로드를 추가하면 상황이 악화됩니다. 그래서 이런 종류의 회로 차단기가 발생하지 않도록 방지합니다. 짧은

그래서 :

DB 접속 상태에서

:

DBQuery 메시지가 수신되면, 쿼리를 실행하려고하고 응답을 다시 보냅니다. 일이 터지면 DB-Down 상태로 직접 이동하여 실패 이벤트로 응답하십시오.

DB-Down 상태 : DB 쿼리 메시지가 수신되면 Failure 이벤트로 응답하지 않고 직접 DB를 건드리지 마십시오. DB가 가동 중인지 확인하려면 x 초마다 핑하십시오. 가능한 경우 DB-Up 상태로 되돌립니다.

이 시나리오에서는 수퍼바이저를 사용하여 상태를 전송하지 않으므로 정상적인 try/catch는이 문제를 처리하기에 충분합니다.

희망 사항.

+0

예, 그렇습니다. 단 한가지 : '실패'이벤트는'Tell '과 함께 생성하고 보내는 맞춤 메시지일까요, 아니면 특별한 것이 있습니까? – Natan

+0

그냥 일반적인 이벤트, 일반적인 목적을 위해 "실패"이벤트가 내장되어 있습니다 –

+0

이 DB 통신 담당자는 최상위 액터 여야합니까? – Monsignor

관련 문제