Pergunta

É um cenário muito comum: algum processo quer soltar um arquivo no servidor a cada 30 minutos ou assim. Simples, certo? Bem, eu posso pensar em um monte de maneiras isso poderia dar errado.

Por exemplo, o processamento de um arquivo pode levar mais ou menos de 30 minutos, por isso é possível para um novo arquivo para chegar antes que eu sou feito com o anterior. Eu não quero que o sistema de origem para substituir um arquivo que eu ainda estou processando.

Por outro lado, os arquivos são grandes, por isso leva alguns minutos para terminar de enviá-las. Eu não quero começar o processamento de um arquivo parcial. Os arquivos são apenas tranferred com FTP ou SFTP (minha preferência), de modo que o bloqueio em nível OS não é uma opção.

Finalmente, eu faço necessidade de manter os arquivos em torno de um tempo, no caso de eu precisar para inspecionar manualmente um deles (para depuração) ou um reprocess.

Eu vi um monte de ad-hoc abordagens para baralhar upload de arquivos ao redor, trocando nomes de arquivos, usando datestamps, tocar arquivos "indicador" para ajudar na sincronização, e assim por diante. O que eu não vi ainda é um "algoritmo" abrangente para o processamento de arquivos que endereços de concorrência, consistência e completude.

Então, eu gostaria de aproveitar a sabedoria das multidões aqui. Alguém viu realmente à prova de balas forma de arquivos de dados batch juggle para que eles nunca são processados ??muito cedo, não substituídos antes feito, e com segurança guardados após o processamento?

Foi útil?

Solução

A chave é fazer o malabarismo inicial no final enviar . Todo o remetente precisa fazer é:

  1. Armazene o arquivo com um nome único.
  2. Assim que o ficheiro foi enviado, movê-lo para um subdiretório chamado por exemplo completed.

Assumindo que há apenas um único processo receptor, todas as necessidades do receptor a fazer é:

  1. Periodicamente verificar o diretório completed para qualquer arquivo.
  2. Assim que um arquivo aparece na completed, movê-lo para um subdiretório chamado por exemplo processed, e começar a trabalhar a partir daí.
  3. Opcionalmente excluí-lo quando terminar.

Em qualquer sistema de arquivos são, movimentos de arquivo são atômicas desde que ocorrer dentro do mesmo sistema de arquivos / volume. Portanto, não há condições de corrida.

vários receptores

Se o processamento pode levar mais tempo do que o período entre arquivos que estão sendo entregues, você vai construir uma backlog menos que você tenha múltiplos processos receptor. Então, como lidar com o caso de várias receptor?

Simples: Cada processo receptor funciona exatamente como antes. O fundamental é que nós tentamos mover um arquivo para processed antes trabalhando nisso: que, eo fato do mesmo sistema de arquivos movimentos de arquivo são atômicas, significa que mesmo que vários receptores ver o mesmo arquivo em completed e tentar movê-lo, apenas um terá sucesso. Tudo que você precisa fazer é certificar-se de que você verificar o valor de retorno de rename(), ou qualquer que seja chamada OS você usa para executar o movimento, e só prosseguir com o processamento se ele conseguiu. Se o movimento falhou, algum outro receptor chegou lá primeiro, então basta ir para trás e verificar o diretório completed novamente.

Outras dicas

Se o sistema operacional suportar, ganchos do sistema de arquivos uso para interceptar aberto e operações de arquivo próximos. Algo como Dazuko . Outros sistemas operacionais podem informá-lo sobre as operações de arquivo em anoter forma, por exemplo Novell Open Enterprise Server permite que você defina as épocas, e ler lista de arquivos modificados durante uma época.

Apenas percebi que no Linux, você pode usar subsistema inotify, ou os utilitários de pacote-tools inotify

As transferências de arquivos é um dos clássicos de integração do sistema. Eu recomendo que você para obter os Enterprise Integration Patterns livro para construir a sua própria resposta a estas perguntas - para em certa medida, a resposta depende das tecnologias e plataformas que você está usando para a implementação endpoint e para transferência de arquivos. É uma coleção bastante abrangente de padrões viáveis, e bastante bem escrito.

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