2012-11-02 2 views
8

나는 자식 프로세스의 수를 시작하는 관리자 프로세스가 있습니다. 현재 아이가 죽으면 새로운 Pid로 새로운 프로세스를 생성합니다. 즉, 방금 죽은 자녀 과정의 상태 정보를 잃어버린 것입니다. 내 고객이 항상 동일한 식별자를 사용하여 하위 프로세스와 통신하기를 원합니다. 자식 프로세스가 사망하고 감독자가 다시 시작할 수 있다는 사실에도 불구하고.erlang 프로세스 다시 시작 및 상태 보존

나는 자식 프로세스를 유일한 이름으로 등록하고 ets 테이블에 자식 상태를 저장하려고 생각했다. 문제는 얼랑 (Erlang)에서 그러한 문제에 접근하기 위해 권장되는 방법은 무엇입니까?

감사합니다.

답변

8

ets 테이블에 프로세스 상태를 저장하면 충돌 사이에 상태를 유지하는 데 효과적 일 수 있으며 일반적으로 프로세스에 영구적 인 이름을 부여하기 위해 전역 레지스트리를 사용합니다. (플레이어 200은 {player, 200}으로 등록 될 것입니다.) 원자를 사용해야하고 많은 자식 프로세스가있는 경우 로컬 레지스트리를 사용하지 않는 것이 좋습니다. 동적으로 (player_200, player_201 등)

ets 테이블에 자식 상태를 저장하는 것은 자체 위험과 문제가 있습니다. 오류가 발생하는 순간과 ets 테이블에 저장하는 사이에 자식이 충돌하면 문제가 발생하지 않습니다. 그러나 자식이 가비지 상태를 저장하도록하는 데이터를 처리 한 후 다음 메시지 처리시 충돌이 발생합니다. 프로세스를 다시 시작하고 ets 테이블에서 잘못된 상태를로드하고 다음 메시지를 다시 충돌시킵니다. 이 문제를 해결할 확실한 방법이 있지만, 가능성과 주위를 해결해야한다는 것을 알고 있어야합니다.

얼랭 (Erlang)은 ets 테이블을 모든 프로세스에 배포하는 문제를 숨기지 만, CPU 및 잠재적 인 경합을 희생하면서이를 수행합니다. ets 테이블에 많은 변경 사항을 적용한다면 성능면에서 비용을 지불하게됩니다.

자녀가 충돌하는 경우, 어쨌든 잘못된 조건을 제거 할 수있는 방법을 찾고 있지 않아야합니까? 보통 프로세스 크래시를 원인과 수정의 근본 원인으로 생각했습니다. ?

+0

ets 테이블을 사용하여 자식 프로세스 상태를 저장하는 데 가장 큰 걱정거리는 잠재적 인 병 목입니다. 많은 프로세스가 상태를 변경하는 경우 변경이 발생할 때마다 ets 테이블을 새로운 상태로 업데이트해야합니다. 아이가 죽을 때마다 나는 충돌 이전과 같은 상태로 재시작해야한다. 아이 프로세스가 죽을 때마다 { 'EXIT', Pid, ​​Reason}을 보내 감독자에게 알린다. 자식 프로세스가 충돌 이전에 상태를 보낼 수도있는 경우 동일한 상태로 다시 시작할 수 있으므로 업데이트를 테이블에 보내지 않아도됩니다. – Mark

+0

얼랑 (Erlang)에서는 가능하지 않다고 생각하지만 일반적으로 멋진 기능이라고 생각합니다. 자식 충돌시 감독자에게 프로세스 스택을 보내는 것과 같은 것 – Mark

+0

@Mark 내 대답에서 내가 언급 한 기사는 소유 프로세스가 충돌 할 때 ETS 테이블 gifting/상속을 다른 프로세스에 사용하는 방법을 설명합니다. – johlo

5

ETS 테이블을 사용하면 아마도 상태를 유지하는 방법 일 수 있습니다. Vinoski's article은 ETS 테이블 데이터를 유지하면서 충돌 프로세스를 다시 시작하는 방법을 설명합니다.

@ user30997은 실제로 테이블의 데이터가 프로세스가 충돌 한 원인 일 수 있다고 지적하므로 재시작 할 때 테이블을 확인하거나 프로세스가 몇 번 재시작 될지에 대한 제한을 설정하는 것이 좋습니다.)

id와 프로세스를 연결하려면 gproc을 참조하십시오. 이는 매우 유용합니다.

+0

+1 for gproc - 표준 OTP 여야 함 – jtmoulia

0

이벤트 소스를 사용하고 모든 이벤트를 유지 한 다음 다시 재생하여 상태를 재구성하십시오. 빠른 재생이 필요한 경우 스냅 샷을 만드십시오. 아래 예제 : https://github.com/bryanhunter/cqrs-with-erlang/tree/ndc-oslo

실제로이 예제를 기반으로 완전한 프레임 워크를 구축하는 것이 좋습니다.

관련 문제