Práticas recomendadas ao gerenciar tarefas assíncronas de longa execução

12

Estou na fase de design de um projeto em que o usuário final enviará uma solicitação de uma página da web que gerará um trabalho processado assíncrono e de longa execução. Existe uma "melhor prática" para esse problema? Os serviços da Web e os corretores de serviços são um bom caminho a percorrer? A fila de mensagens da Microsoft é aplicável aqui?

John Ruf
fonte
Se você fizer isso pela Web e se demorar muito, poderá enviar uma mensagem de texto ou e-mail para o usuário quando ele for concluído.

Respostas:

6

Eu não sei sobre "melhores práticas". Eu sei os erros mais comuns.

Primeiro erro: DOS você mesmo

Você usa o manipulador da web para processar o trabalho de longa duração. Isso pode ser ruim ou extremamente ruim, dependendo da porcentagem de ocorrências que se tornam trabalhos demorados, por quanto tempo eles são executados e quanto tráfego você recebe.

Você quer ter certeza de que não está recebendo mais de um trabalho de execução demorada dentro do período que leva para concluir esse trabalho. Se você faz o DOS você mesmo. Também piorará quanto mais tráfego você assumir, enquanto a porcentagem e o tempo permanecerem consistentes. É um desses problemas que impõe um limite ao crescimento do tráfego.

Segundo erro: surgindo do webhandler

Gerar um processo do manipulador da Web para lidar com um processo de longa execução pode ser complicado e, como resultado, também propenso a erros.

  • Você precisa se desassociar dos pais corretamente, caso contrário, o webhandler aguarda a conclusão do filho.
  • Quando você bifurca um filho no unix, ele herda identificadores abertos do pai. Eles serão fechados automaticamente, a menos que sejam substituídos. Isso inclui coisas como conexões com bancos de dados, identificadores de arquivos e outras conexões de rede abertas. Todos os quais são fechados quando o processo filho é concluído.

Opções

Eu costumo usar at(1)para me dissociar do manipulador da Web sem bifurcar.

Você também pode usar uma implementação de pesquisa com cron.

Você pode se comunicar com outro processo do servidor que lida com o processamento. Essa comunicação pode ser feita com sockets, pipesou mais elevadas abstrações nível como uma chamada http RESTO ou encaminhamento de uma mensagem fila.

dietbuddha
fonte
2

Suponho que você esteja falando mais do que alguns minutos.

Em alguns minutos, você poderá iniciar um thread de trabalho em segundo plano e exibir algum progresso na interface do usuário. Muitos aplicativos da web usam esse método.

Se for mais do que, digamos, 5 minutos, convém delegar a tarefa a um serviço dedicado. Um exemplo são os relatórios gerados pelo Google Analytics.

A fila do Microsoft Messaging pode ser usada para transmitir informações de um sistema para outro ou de um componente para outro.


fonte
Como linguagens como PHP conseguem isso? Eu sei que alguns aplicativos web que fazem isso, mas são escritas em PHP
TheLQ
Não sou especialista em PHP, mas acho que, em vez de um thread lançado pela mesma página, outro é chamado. Isso é o que realmente acontece com o AJAX.