문제

충돌 된 프로세스를 다시 시작할 때 상태를 유지하는 좋은 방법은 무엇입니까?

OTP 응용 프로그램의 감독자가 여러 "서브 시스템"Gen_Servers를 보는 것입니다.

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

그 gen_server가 충돌하면 다시 시작되기를 원하지만 가장 최근의 기상 상태로 다시 시작해야하며 임의의 상태가 아닌 일부 기상 상태로 다시 시작해야합니다. init(). 시뮬레이션 상태가 충돌로 인해 갑자기 "Hail Storm"에서 "Pleasant and Breezy"로 갑자기 이동하는 것은 의미가 없습니다.

복잡성이 추가되어 업데이트 한 후 모든 업데이트 후 상태를 저장하기 위해 MNESIA 또는 ETS를 사용하는 것을 망설입니다. 더 쉬운 방법이 있습니까?

도움이 되었습니까?

해결책

런타임 중에야만 필요한 한 A는 ETS의 사용을 제안합니다. 가치는 복잡성보다 훨씬 큽니다. API는 간단하며 이름이 지정된 테이블로 작업하는 경우 액세스도 간단합니다. Gen_Server가 감독자가 시작하기 전에 테이블 만 만들면됩니다.

두 가지 - 더 복잡한 대안 :

  • 한 쌍의 프로세스를 구축하고, 하나는 일을하기 위해, 하나는 상태 유지 보수를위한 것입니다. 두 번째의 단순성으로 인해 실제로 신뢰할 수 있습니다.
  • 진짜 바보 같은 사람은 국가가 변화 할 때마다 논쟁으로 현재 상태를 가진 감독자의 아동 사양을 교환하는 것일 수 있습니다. (웃다) 장난 치지 마.

다른 팁

더 쉬운 방법이 있습니까?

프로세스가 사망하면 프로세스 상태가 포함 된 감독자에게 메시지를 보냅니다. 따라서이 값을 사용하여 감독자 (MNESIA 또는 SUPERVISOR 'S State)에 저장하고 서버가 시작되는시기 ( 이니) 주 가치를 얻으려면 Sync Call을 감독자에게 보내야합니다. 나는 진짜 모범이 아니지만 이해가되기를 바랍니다.

어쨌든 나는 실제로 주를 저장하는 데 문제가 보이지 않습니다.

미안해 내 영어 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top