IT

[Erlang OTP]죽지 않는 서버 만들기(1) (feat. supervisor)

BoBooBoo 2018. 6. 9. 17:12
반응형

?Supervisor

슈퍼바이저는 트리 형태로 연결된 하위(자식) 프로세스들을 감시 및 제어하는 감독자(?) 템플릿이다. 프로세스 시작, 종료 뿐 아니라 상태를 감시하고 있다가, 필요한 경우 재시작 시키는 원리로 죽지 않는 서버를 만들 때 유용하게 쓰인다. 하위에 또 다른 슈퍼바이저 프로세스가 들어갈 수 도 있고, 슈퍼바이저마다 자식 프로세스들의 재시작 방식도 설정할 수 있다.


?Supervisor Flag

자식 프로세스들의 재시작 방식을 결정하는 요소들이다. 크게는 2가지로 sup_flags, strategy이다. sup_flags는 재시작 주기, 몇 번 재시작할지를 설정하는 값인데, intensityperiod로 구성되어 있다. 예를 들어 동일한 원인으로 서버가 계속해서 죽는다면 재시작 시키는 의미가 없기 때문이다. 그래서 슈퍼바이저에서는 몇 초안에(period) 최대 몇 번까지(intensity) 재시작 할 것인지를 설정할 수도있다. 두 플래그의 디폴트 값은 intensity=1, period=5이다. period로 설정된 기간 내 intensity로 설정된 횟수를 초과하여  서버가 재시작될 경우, 슈퍼바이저는 모든 자식 프로세스들을 종료하고 슈퍼바이저 본인도 종료한다. 상위에 또다른 슈퍼바이저가 있을 경우 다시 재시작될 수도 있다.

strategy는 재시작 방식을 설정하는 값인데, one_for_all, one_for_one, rest_for_one, simple_one_for_one 이렇게 4가지가 있다. 자식 프로세스가 하나 죽으면 모든 자식프로세스를 재시작시킨다거나, 죽은 자식 프로세스만 다시 시작한다거나 이런 식으로 재시작 방식을 설정할 수  있다.




one_for_one 방식


자식 프로세스가 하나 죽으면, 그 프로세스만 재시작 시킨다.



one_for_all 방식


자식 프로세스가 하나 죽으면, 다른 자식 프로세스들을 모두 종료시킨 후 모든 자식 프로세스들을 재시작 시킨다.


rest_for_one 방식


자식 프로세스가 하나 죽으면, 죽은 그 프로세스 이후에 시작된 다른 자식 프로세스들을 종료시킨 후 종료된 모든 자식 프로세스들을 재시작 시킨다.


simple_one_for_one 방식


one_for_one 방식과 유사한데, 차이점은 슈퍼바이저에 동적으로 자식 프로세스들이 추가된다. 제일 처음 슈퍼바이저가 시작되면 이 슈퍼바이저는 아무런 자식 프로세스도 가지고 있지 않다. 대신 supervisor:start_child 함수를 통해 동적으로 자식 프로세스들이 추가된다. 즉, one_for_one 방식의 슈퍼바이저는 처음 시작될 때부터 자식 프로세스들의 정보 리스트 전체를 시작된 순서대로 정렬하여 갖고 있다. 하지만 simple_one_for_one 방식의 슈퍼바이저는 동적으로 자식 프로세스를 추가하기 때문에, 새로 자식 프로세스가 생성될 때 마다 자식 프로세스 정의만 하나씩 추가되고, 나머지 정보는 사전 형태로 가지게 된다. 그래서 많은 수의 자식 프로세스를 가지는 경우에는 simple_one_for_one방식이 one_for_one 방식보다 유리하다. 


여기까지는 슈퍼바이저 설정이다. 이어지는 포스팅에서는 슈퍼바이저에 저장되는 자식 프로세스 정보(child specification)에 대해 정리해 보려 한다. 

반응형