Pergunta

Quais são os prós e contras do uso de um arquivo para comunicação entre processos? Deixe-me dar algumas informações sobre o contexto estou fazendo esta pergunta no.

O problema é o problema clássico produtor do consumidor com algumas restrições. Os produtores são definidos de processo em execução cooperativa em um cluster de máquinas e comunicar uns com os outros transmissões usando. Cada processo tem usuários locais que ele conhece e também permite que os outros processos conhecê-los pelo mecanismo de transmissão acima. Até agora as informações de estado a ser transmitido / shared não estava sendo persistiu, mas agora ele precisa ser.

Este sistema foi executado em produção por anos agora suporte a milhares de usuários e pessoas são understandbly muito apreensivo sobre a adição de qualquer dependência extra para esta para adicionar o suporte para persistência. O caminho que escolhemos foi a gerar um novo segmento no processo existente que escreve o tráfego local para um arquivo no sistema de arquivos que é então lido por um novo processo (vamos chamá-lo ao consumidor) e persistiu. As vantagens que vemos com esta abordagem são:

  1. Recebemos persistência gratuitamente. Incase o novo processo tem problemas, não estamos perdendo qualquer parte do tráfego local como estamos escrevendo-lo para o sistema de arquivos. Enquanto o consumidor sabe onde parou, quando ele vem para cima ele pode iniciar o processamento de dados.
  2. Não há nenhuma curva de aprendizagem para usar filas bibliotecas sua planície arquivo unix velho IO.
  3. A maior pro é que nós não afetam o processo de produção atual em tudo, exceto o novo segmento para as gravações de arquivo.

Algumas das preocupações com esta abordagem são:

  1. bloqueio de arquivos e contenção e seus efeitos sobre o desempenho.
  2. Certificar-se os buffers de gravação são liberadas e produtor só libera o bloqueio de arquivo uma vez um evento completo foi escrito para o arquivo. O consumidor deve ler registros incompletos.

Pensamentos? esta abordagem para é ingênuo e devemos pagar apenas o custo inicial para a rampa acima do tempo para usar um fora da biblioteca fila persistente prateleira? O ponto principal aqui é que queremos ter o mínimo impacto possível sobre o processo atual e adicione nenhuma dependência a ele.

Foi útil?

Solução

fui confrontado com esta escolha recentemente e pensou em aprender o suficiente sobre Berkeley DB usar seu mecanismo de fila. Mas finalmente eu decidi, em vez de usar o sistema de arquivos Unix e escrever a minha própria fila atômica primitivas com POSIX semáforos . Se todos os processos estão em uma máquina isso é muito fácil. A função put atômica é de cerca de uma dúzia de linhas de código; o get atômica, porque tem que esperar se a fila está vazia, é cerca de três vezes o tamanho.

O meu conselho é que você projetar um atômico-fila API que irá esconder estes detalhes. (Exemplo clássico de seguir o conselho de usar uma interface para detalhes do projeto ocultar que são susceptíveis de mudança de Parnas.) Você pode fazer a primeira versão da API usando plain Unix arquivo I / O. Então você pode tentar variações como bloqueio, Berkeley DB, ou semáforos --- tudo com o "mínimo impacto sobre o processo atual".

Você não vai saber impactos de desempenho até que você tentar algo. bloqueio de arquivos em sistemas de arquivos reais é muito bom; bloqueio de arquivos em NFS é um urso.

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