Se um processo de manipulação cliente ser adicionado à árvore de supervisor?
-
02-07-2019 - |
Pergunta
em Erlang Eu tenho um supervisor-árvore de processos, contendo um que aceita TCP / IP conexões. Para cada conexão de entrada I gerar um novo processo. Caso este processo ser adicionado à árvore de supervisor ou não?
Saudações, Steve
Solução
Sim, você deve adicionar esses processos à hierarquia supervisão como você quer que eles sejam corretamente / graciosamente desligamento quando seu aplicativo está parado. (Caso contrário, você acaba vazando conexões que irá falhar como a infraestrutura de aplicativos que dependem sido desligamento).
Você pode criar uma estratégia simple_one_for_one
supervisor yourapp_client_sup
digamos que tem uma especificação filho de {Id, {yourapp_client_connection, start_link_with_socket, []}, Restart, Shutdown, worker, temporary}
. O tipo temporary
aqui é importante porque normalmente não é estratégia restart útil para um manipulador de conexão - você não pode conectar para o cliente para reiniciar a conexão. temporary
aqui fará com que o supervisor para relatar a saída manipulador de conexão, mas caso contrário, ignorá-lo.
O processo que faz gen_tcp:accept
irá criar o processo manipulador de conexão, fazendo supervisor:start_child(yourapp_client_sup, [Socket,Options,...])
em vez de yourapp_client_sup:start_link(Socket, Options, ...)
. Certifique-se de que a função youreapp_client_connection:start_link_with_socket
começa a criança através de funções gen_server
ou proc_lib
(uma exigência do módulo supervisor
) e que as transferências de função de controle do soquete para a criança com gen_tcp:controlling_process
caso contrário, a criança não será capaz de usar o soquete.
Uma abordagem alternativa é criar um processo yourapp_client_sup
manequim que os processos yourclient_connection_handler
pode conectar-se a na inicialização. O processo yourapp_client_sup
só vai existir para propagar mensagens EXIT
de seu pai aos processos de manipulador de conexão. Ele precisará existe armadilha e ignorar todos os outros do que os de seu pai mensagens EXIT
. No geral, eu prefiro usar a abordagem supervisor simple_one_for_one
.
Outras dicas
Se você espera que estes processos sejam muitos, poderia ser uma boa idéia para adicionar um supervisor sob seu supervisor principal como com a responsabilidade separada (e talvez usar a configuração simple_one_for_one
para tornar as coisas mais simples, talvez até mais simples do que o seu caso atual) .
A coisa é, se você precisa controlar estes processos, é sempre bom ter um supervisor. Se ele não importa se eles têm sucesso ou não, então você pode não precisar de um. Mas, novamente, eu sempre argumentar que isso é desleixado codificação. ; -)
A única coisa que eu não iria fazer, é adicioná-los à sua árvore existente, a menos que seja muito óbvio de onde vêm e eles são bastante poucos.