2009-05-10 10 views
7

충돌 한 프로세스를 다시 시작할 때 상태를 유지하는 좋은 방법은 무엇입니까?충돌 후 프로세스 상태를 복원하려면 어떻게해야합니까?

저는 OTP 애플리케이션에서 수퍼바이저가 여러 개의 "서브 시스템"gen_servers를 감시합니다.

예를 들어, 하나는 15 분마다 새로운 날씨 상태를 생성하고 현재 날씨 상태에 대한 쿼리를 처리하는 "날씨"하위 시스템입니다. (레모네이드 스탠드 게임을 생각해보십시오.)

gen_server가 충돌하면 다시 시작하고 싶지만, init()에 하드 코드 된 일부 최신 상태가 아닌 가장 최근의 기상 상태로 재시작해야합니다. 충돌로 인해 시뮬레이션 상태가 갑자기 "우박 폭풍"에서 "쾌적하고 시원한"상태로 바뀌는 것은 당연합니다.

추가 된 복잡성으로 인해 매 업데이트 후에 상태를 저장하기 위해 mnesia 또는 ETS를 사용하기를 주저합니다. 더 쉬운 방법이 있습니까?

답변

4

런타임 중에 있으면 ETS의 사용을 제안합니다. 그 가치는 복잡성보다 훨씬 큽니다. API는 간단하며 명명 된 테이블로 작업하는 경우에도 액세스가 간단합니다. 관리자가 gen_server를 시작하기 전에 테이블을 만들어야합니다.

두 - 더 복잡한 - 대안 :

  • 빌드 프로세스의 한 쌍, 할 수있는 일 하나, 상태 유지를위한 한. 두 번째 제품의 단순성으로 인해 실제로 신뢰할 수 있습니다.
  • 실제 바보 같은 사람은 상태가 바뀔 때마다 현재 상태를 가진 감독자의 하위 스페 이스를 인수로 사용할 수 있습니다. (미소) 아니요, 농담입니다.
2

더 쉬운 방법이 있습니까? 당신이 당신의 서버가 시작할 때 (을 초기화하기) (mnesia 또는 감독자의 상태) 감독에 저장이 값을 사용할 수 있도록

프로세스가 죽었을, 프로세스의 상태를 포함하는 관리자에게 메시지를 보냅니다 상태 값을 얻기 위해 수퍼바이저에게 동기화 호출을 보내야합니다. 나는 진짜 모범이 아니지만 그것이 의미가 있기를 바랍니다.

어쨌든 mnesia에 주를 저장하는 데 문제가 발생하지 않습니다.

죄송합니다. 내 영어 :)

+1

관리자는 가능한 한 로직을 적게 포함해야하며 재시작 만해야합니다. 이 논리의 단일 버그로 인해 전체 하위 트리가 충돌 할 수 있습니다. –