충돌 후 프로세스 상태를 어떻게 복원 할 수 있습니까?
-
21-08-2019 - |
문제
충돌 된 프로세스를 다시 시작할 때 상태를 유지하는 좋은 방법은 무엇입니까?
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을 감독자에게 보내야합니다. 나는 진짜 모범이 아니지만 이해가되기를 바랍니다.
어쨌든 나는 실제로 주를 저장하는 데 문제가 보이지 않습니다.
미안해 내 영어 :)