2011-07-30 4 views
4

저는 많은 gen_server를 시작하는 관리자가 있습니다. 각 gen_server에는 많은 시간이 걸리는 많은 데이터로드가 있습니다. 오류가 발생하면 gen_server 상태에 저장되어있는 데이터와 해당 프로세스의 사전을 다음에 계속 유지하여 다시 초기화 할 필요가 없는지 알고 싶습니다.감독자가 gen_server에서 데이터를 다시 시작한 후에도 유지됩니까?

+0

[this] (http://learnyousomeerlang.com/building-applications-with-otp#the-onion-layer-theory)를 읽을 수도 있습니다. 그것은 여러 종류의 국가에 대해 이야기하고 문제를 다루는 방법을 제안합니다. –

답변

10

얼랑 동작의 현재 상태는 아무 곳에도 저장되지 않습니다. 당신은 자신을 돌보아야 할 것입니다.

상태를 외부 (다른 프로세스, ETS 테이블, 데이터베이스 등)에 regurlarly 저장하거나 시작시 상태를 다시 만들 수 있도록 init/1 함수가 충분히 스마트하고 동적인지 확인하십시오. 기존 파일 복구, 원래 입력 인수 등을 기반으로 일부 캐시 다시 작성)

기본적으로 충돌을 견뎌야하는 데이터와 지속성 또는 재 작성 방법을 정의해야합니다.

+0

내가 추가 할 수있는 유일한 것 : 특히 많은 상태를 저장하는 프로세스 사전을 피하십시오. 가장 좋은 방법은 전혀 사용하지 않는 것입니다. –

+0

@Peer : 특히 프로세스의 메모리에 속한 모든 데이터와 마찬가지로 데이터를 유지하지 않기 때문에. –

1

응용 프로그램에서 응용 프로그램의 충돌을 지속해야하는 데이터가있는 경우 응용 프로그램에서 데이터베이스 (Mnesia) 또는 ETS/DETS tables으로 분리해야합니다. gen_server 상태에 응용 프로그램의 일시적인 상태를 신속하게 조작 할 수있는 live/temporary/transient 정보가 포함되도록합니다.
gen_server init/1이 호출 되 자마자 구성 파일이나 Database를 읽어서 시작 상태가되도록하십시오. 일반적으로 응용 프로그램이 서버의 마지막 상태에 많이 의존 할 때 gen_server 상태를 조작하는 요청이 들어올 때마다 정보를 추출하여 영구 저장소에 복사합니다 (이 데이터를 이전의 알려진 상태로 레이블 지정합니다). 이렇게하면 init/1 함수가 항상 마지막/이전 상태를 확인하거나 새로운 상태를 시작해야하는지 여부를 확인할 수 있습니다.

관련 문제