Pergunta

Eu estou trabalhando em um aplicativo de Django que permite que um usuário para upload de arquivos. Eu preciso executar algum processamento do lado do servidor sobre esses arquivos antes de enviá-los para Amazon S3 . Depois de ler as respostas para esta questão e este post eu decidi que a melhor maneira em que para lidar com isso é ter meu ponto de vista manipulador invoke um método em Pyro objeto remoto para executar o processamento de forma assíncrona e, em seguida, retornar imediatamente um HTTP 200 para o cliente. Eu tenho este protótipo e parece funcionar bem, no entanto, eu também gostaria de armazenar o estado do processamento para que o cliente pode consultar o aplicativo para ver se o arquivo foi processado e enviado para o S3.

Eu posso lidar com a votação com bastante facilidade, mas não tenho a certeza onde o local apropriado é armazenar o estado do processo. Ele precisa ser escrito pelo processo de Pyro e legível pelo meu ponto de vista polling.

  • Estou hesitante para adicionar colunas ao banco de dados para dados que realmente só deve persistir por 30 a 60 segundos.
  • Eu tenho considerado usando baixo do Django -nível de cache API e usando um ID de arquivo como a chave, no entanto, eu não acredito que este é realmente o que o framework de cache é projetado para e eu não tenho certeza do que problemas imprevistos pode haver com esse caminho .
  • Por último, tenho considerado armazenar estado no objeto Pyro fazendo o processamento, mas, em seguida, ainda parece que eu preciso adicionar um "processing_complete" coluna de banco de dados boolean para que a exibição sabe se deve ou não consulta do estado do Pyro objeto.

Claro, há também algumas preocupações de integridade de dados com desacoplamento estado do banco de dados (o que acontece se o servidor vai para baixo e todos esses dados é in-memory?). Estou para ouvir como os desenvolvedores de aplicativos web mais experientes iria lidar com este tipo de processamento stateful.

Foi útil?

Solução

Nós fazemos isso por ter uma tabela "Request" no banco de dados.

Quando o carregamento chega, criamos o objeto arquivo carregado, e criar uma solicitação.

Nós iniciar o processador de lote de fundo.

retornar um 200 "Nós estamos trabalhando nisso" página -. Ele mostra os pedidos e seu status

O nosso processador de lote usa o Django ORM. Quando terminar, ele atualiza o objeto de solicitação. Nós podemos (mas não) enviar uma notificação por e-mail. Principalmente, nós apenas atualizar o status de modo que o usuário pode logar novamente e ver que o processamento foi concluído.


Batch notas arquitetura de servidor.

É um servidor WSGI que espera em uma porta para um lote processamento de pedido. O pedido é um POST RESTO com um número de identificação; o processador de lote parece isso no banco de dados e processa-lo.

O servidor é iniciado automagicamente pela nossa interface REST. Se não estiver em execução, nós desovar ele. Isso faz com que uma transação do usuário aparecem lento, mas, oh bem. Não é suposto acidente.

Além disso, temos um crontab simples para verificar se ele está funcionando. No máximo, ele será para baixo por 30 minutos entre "você está vivo?" Verificações. Não temos um script de inicialização formais (corremos sob o Apache com mod_wsgi), mas podemos criar um script "restart" que toca o arquivo WSGI e, em seguida, faz um POST para uma URL que faz um health-cheque (e inicia o processador de lote).

Quando o servidor de lote começa, pode haver pedidos não processados ??para o qual nunca tem obtido um POST. Assim, a inicialização padrão é para puxar todo o trabalho fora da fila Request - supondo que ele pode ter perdido alguma coisa.

Outras dicas

Eu sei que isto é uma questão de idade, mas alguém pode encontrar a minha resposta útil, mesmo depois de todo esse tempo, então aqui vai.

Você pode de banco de dados de uso curso como fila, mas existem soluções desenvolvido exatamente para esse fim.

AMQP é feito só para isso. Juntamente com Aipo ou Carrot e um servidor corretor como RabbitMQ ou ZeroMQ .

Isso é o que nós estamos usando em nosso mais recente projeto e está trabalhando muito.

Para o seu problema aipo e RabbitMQ parece ser um melhor ajuste. RabbitMQ fornece persistência de suas mensagens, e aipo expõe vistas fáceis para pesquisa para verificar o status dos processos executados em paralelo.

Você pode também estar interessado em octopy .

Então, é uma fila de trabalho que você precisa. Para o seu caso, eu seria absolutamente ir com o DB para salvar estado, mesmo que esses estados são de curta duração. Parece que irá satisfazer todas as suas necessidades, e não é muito difícil de implementar desde que você já tem todas as partes móveis lá, disponível para você. Mantenha-o simples não ser que você necessidade algo mais complexo.

Se você precisa de algo mais poderoso ou mais sofisticado, eu olhar para algo como Gearman .

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