Qual é uma boa abordagem para lidar com processos em segundo plano em um aplicativo NodeJS?
Cenário : depois que um usuário posta algo em um aplicativo, eu quero processar os dados, solicitar dados adicionais de recursos externos etc. Tudo isso consome muito tempo, então eu quero sair do loop req / res. O ideal seria apenas ter uma fila de trabalhos onde você pode rapidamente despejar um trabalho e um daemon ou executor de tarefas sempre pegará o mais antigo e o processará.
No RoR, eu teria feito isso com algo como Delayed Job. Qual é o Node equivalente a esta API?
javascript
node.js
background-process
task-queue
Ole Spaarmann
fonte
fonte
ChildProcess
API que pode ser útil. nodejs.org/api/child_process.htmlRespostas:
Se você quer algo leve, que rode no mesmo processo do servidor, eu recomendo fortemente a Bull . Tem uma API simples que permite um controle refinado sobre suas filas.
Se você estiver procurando por algo que funcione como um processo de trabalho autônomo, talvez dê uma olhada em Kue . Ele pode ser executado como um servidor RESTful API e até mesmo tem vários aplicativos de front-end escritos para ele.
Se você estiver familiarizado com o Resque de Ruby, há uma implementação de nó chamada Node-resque
Bull, Kue e Node-resque são todos apoiados pelo Redis , que é onipresente entre as filas de trabalho do Node.js. Todos os 3 seriam capazes de fazer o que RoR's DelayedJob faz, é uma questão de recursos específicos que você deseja e suas preferências de API.
fonte
As tarefas em segundo plano não estão diretamente relacionadas ao seu trabalho de serviço da web, portanto, não devem estar no mesmo processo. Conforme você aumenta, o uso de memória das tarefas em segundo plano afetará o desempenho do serviço da web. Mas você pode colocá-los no mesmo repositório de código se quiser, o que fizer mais sentido.
Uma boa escolha para troca de mensagens entre os dois processos seria redis , se soltar uma mensagem de vez em quando está OK. Se você quiser "nenhuma mensagem deixada para trás", você precisará de um corretor mais pesado como o Rabbit . Seu processo de serviço da web pode ser publicado e seu processo de trabalho em segundo plano pode ser assinado.
Não é necessário que os dois processos sejam co-hospedados, eles podem estar em VMs, contêineres Docker separados, o que quer que você use. Isso permite que você dimensione sem muitos problemas.
fonte
Se você estiver usando o MongoDB, recomendo Agenda . Dessa forma, instâncias separadas do Redis não estão em execução e recursos como agendamento, enfileiramento e IU da Web estão todos presentes. A IU da Agenda é opcional e pode ser executada separadamente, é claro.
Também recomendaria configurar uma abstração fracamente acoplada entre a lógica do aplicativo e o sistema de enfileiramento / agendamento, de forma que todo o sistema de processamento em segundo plano possa ser trocado, se necessário. Em outras palavras, mantenha o máximo de lógica de aplicativo / processamento longe de suas definições de trabalho da Agenda para mantê-las leves.
fonte
Eu gostaria de sugerir o uso do Redis para agendar trabalhos. Ele tem muitas estruturas de dados diferentes, você sempre pode escolher uma que se adapte melhor ao seu caso de uso.
Você mencionou RoR e DJ, então presumo que você esteja familiarizado com o sidekiq. Você pode usar node-sidekiq para agendamento de trabalho se quiser, mas é subótimo, já que seu objetivo principal é integrar nodejs com RoR.
Para a daemonização do trabalhador, eu recomendo o uso do PM2 . É amplamente utilizado e com manutenção ativa. Ele resolve muitos problemas (por exemplo, implantação, monitoramento, clustering), portanto, certifique-se de que não será um exagero para você.
fonte
Tentei Bee-queue & Bull e escolhi Bull no final. Eu primeiro escolhi bee-queue porque é bastante simples, seus exemplos são fáceis de entender, enquanto os exemplos de touros são um pouco complicados. wiki de bee A Origem da Bee Queue também ressoou comigo. Mas o problema com o bee é <1> que o tempo de resolução do problema é muito lento, a última atualização foi há 10 meses. <2> Não consigo encontrar uma maneira fácil de pausar / cancelar o trabalho.
A Bull, por outro lado, atualiza frequentemente seus códigos, em resposta aos problemas. A avaliação da fila de tarefas do Node.js disse que o ponto fraco do touro é o "tempo de resolução de problemas lento", mas minha experiência é o oposto!
Mas de qualquer forma, sua API é semelhante, por isso é muito fácil alternar de uma para outra.
fonte
Eu sugiro usar uma estrutura Node.js adequada para construir seu aplicativo.
Acho que o mais poderoso e fácil de usar é o Sails.js .
É um framework MVC, então se você está acostumado a desenvolver em ROR, vai achar que é muito, muito fácil!
Se você usá-lo, ele já apresenta um poderoso (em termos de javascript) gerenciador de tarefas.
Se precisar de mais informações não hesite em contactar-me!
fonte