Se um processo de manipulação cliente ser adicionado à árvore de supervisor?

StackOverflow https://stackoverflow.com/questions/152744

  •  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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top