Erlang 나는 프로세스의 수퍼바이저 트리가 있으며, TCP/IP 연결을 허용하는 프로세스가 포함되어 있습니다. 들어오는 연결마다 나는 새로운 프로세스를 생성합니다. 이 프로세스를 수퍼바이저 트리에 추가 할 것인지 여부를 결정해야합니다.클라이언트 처리 프로세스를 수퍼바이저 트리에 추가해야합니까?
감사합니다, 스티브
Erlang 나는 프로세스의 수퍼바이저 트리가 있으며, TCP/IP 연결을 허용하는 프로세스가 포함되어 있습니다. 들어오는 연결마다 나는 새로운 프로세스를 생성합니다. 이 프로세스를 수퍼바이저 트리에 추가 할 것인지 여부를 결정해야합니다.클라이언트 처리 프로세스를 수퍼바이저 트리에 추가해야합니까?
감사합니다, 스티브
예, 응용 프로그램이 중지되었을 때 정상적으로 종료되도록하려면 프로세스를 감독 계층에 추가해야합니다. (그렇지 않으면 연결이 끊어지기 때문에 의존하는 응용 프로그램 인프라로 인해 실패하게됩니다.)
{Id, {yourapp_client_connection, start_link_with_socket, []}, Restart, Shutdown, worker, temporary}
의 하위 사양을 가진 yourapp_client_sup
이라고 말하는 simple_one_for_one
전략 수퍼바이저를 만들 수 있습니다. temporary
유형은 중요합니다. 연결 처리기에 대한 유용한 재시작 전략이 없기 때문입니다. 연결을 다시 시작하기 위해 클라이언트에 연결할 수 없습니다. 여기서 temporary
은 관리자가 연결 처리기 종료를보고하지만 그렇지 않으면 무시합니다.
gen_tcp:accept
을 수행하는 프로세스는 yourapp_client_sup:start_link(Socket, Options, ...)
대신 supervisor:start_child(yourapp_client_sup, [Socket,Options,...])
을 수행하여 연결 처리기 프로세스를 만듭니다. youreapp_client_connection:start_link_with_socket
함수가 gen_server
또는 proc_lib
함수 (supervisor
모듈의 요구 사항)를 통해 자식을 시작하고 함수가 gen_tcp:controlling_process
인 자식에 대한 소켓 제어를 전송하는지 확인하십시오. 그렇지 않으면 자식이 소켓을 사용할 수 없습니다.
다른 방법은 yourclient_connection_handler
프로세스가 시작할 때 연결할 수있는 더미 yourapp_client_sup
프로세스를 만드는 것입니다. yourapp_client_sup
프로세스는 부모로부터 연결 처리기 프로세스로 EXIT
메시지를 전파하기 위해 존재합니다. 트랩이 존재해야하며 부모의 메시지가 아닌 다른 메시지가 모두 EXIT
이면 무시해야합니다. 전체적으로 관리자 접근 방식 인 simple_one_for_one
을 선호합니다.
이러한 프로세스가 많은 것으로 예상 경우에는 책임을 분리 (어쩌면 것들을 간단하게하기 위해 simple_one_for_one
설정을 사용으로 메인 관리자에서 감독자를 추가하는 좋은 아이디어가 될 수 , 어쩌면 당신의 현재의 경우보다 간단합니다).
이러한 프로세스를 제어해야하는 경우 감독자가 있어야합니다. 성공 여부에 상관이 없다면, 필요하지 않을 수도 있습니다. 그러나 다시, 나는 항상 그것이 엉성한 코딩이라고 주장한다. ;-)
은 (는)이 아니며, 어디에서 왔는지 매우 분명하지 않은 한 기존 트리에 추가하는 것입니다.