Introdução

O agendamento de trabalho se refere ao processo de acionar um trabalho, tarefa ou função em um horário predeterminado ou quando certos eventos ocorrem. A maioria dos programadores de trabalho é baseada em cron, o programador de trabalho baseado em tempo em sistemas semelhantes ao Unix.

Existem vários programadores de trabalho para o ambiente de tempo de execução Node.js. Alguns desses planejadores são executados no navegador e no Node, enquanto outros são executados apenas no Node. Cada um desses agendadores tem seus próprios recursos exclusivos, portanto, escolher o melhor para o seu caso de uso pode ser um processo difícil e demorado.

Neste artigo, vou mostrar os agendadores de tarefas mais populares para Node.js para destacar seus principais recursos, diferenças e semelhanças.

Além dos principais recursos e funcionalidades oferecidos por cada pacote, destacarei métricas e informações úteis, como tamanho do pacote, estrelas do GitHub, versão contagem, estatísticas de download de npm, licenças de pacote, dependências e manutenções, entre outros.

Uma nota sobre métricas

Algumas métricas, como contagens de download de npm, podem ser usadas como indicadores iniciais para pacotes a explorar, mas não deve ser usado para decidir qual pacote é melhor do que outro. De acordo com o npm, as estatísticas de download são ingênuas por design; o número relatado de downloads excede em muito o número de instalações reais de pacotes.

Da mesma forma, as estrelas do GitHub não são nada diferentes das curtidas nas redes sociais. Eles podem ser usados ​​como um indicador proxy para a popularidade de um pacote, mas não dizem muito sobre a qualidade, estabilidade ou maturidade do projeto.

Por outro lado, métricas como lançamento contagem, tamanho do pacote, cobertura de teste, dependências, histórico de commits e idade do pacote, quando analisados ​​coletivamente, podem lhe dar alguma confiança sobre o pacote. Você pode arregaçar as mangas se desejar e mergulhar na base de código real para verificar a qualidade do código enquanto faz sua diligência.

Comparando agendadores Node.js

Nesta seção , veremos os planejadores de tarefa mais comuns para o ambiente de tempo de execução do Node. Isso inclui Agenda, Node-schedule, Node-cron, Bree, Cron e Bull.

Agenda

Agenda é um agendador licenciado pelo MIT para Node. Foi publicado pela primeira vez há oito anos e atualmente está na versão 4.2.1. Ele tem 7,8 mil estrelas no GitHub e 62.214 downloads semanais no npm.

De acordo com o gráfico de commits do GitHub, ele é mantido ativamente. Dado o número de lançamentos, o Agenda é um pacote bem desenvolvido.

O Agenda oferece funcionalidade para agendar tarefas de maneira flexível usando cron e uma sintaxe mais legível. Você precisará ter um banco de dados MongoDB funcionando para usar o Agenda como agendador de tarefas.

Se você não estiver interessado em baixar e instalar o MongoDB em seu sistema, pode ter uma amostra deste agendador por criando um contêiner Docker ou usando o banco de dados em nuvem do MongoDB Atlas. Se você não está interessado em usar MongoDB, então provavelmente este pacote não é uma boa opção para você.

No trecho de código abaixo, eu defini uma tarefa simples que registra no console a cada minuto:

const Agenda=requer (“agenda”); require (“dotenv”). config (); const databaseUri=`mongodb + srv://mawa: $ {process.env.PASSWORD} @ test.nq88g.mongodb.net/jobs? retryWrites=true & w=maioria`; const agenda=new Agenda ({db: {address: databaseUri, collection:”test-jobs”},}); agenda.define (“log”, async (job)=> {const {name}=job.attrs.data; console.log (`Olá $ {name}! $ {new Date (). toLocaleTimeString ()}`) ;}); (função assíncrona () {espera agenda.start (); espera agenda.every (“um minuto”,”log”, {nome:”João da Silva”});}) ();

Agenda é um programador rico em recursos. Ele oferece APIs baseadas em promessa, agendamento de trabalho com prioridade e simultaneidade configuráveis, persistência de resultados de trabalho e muito mais, que você pode ler em seu documentação .

Apesar dos ricos recursos oferecidos pelo Agenda, ele também vem com várias dependências, conforme destacado no gráfico de dependências abaixo.

O tamanho do pacote de publicação da Agenda é 256 KB e o tamanho da instalação é 18,8 MB.

Node-schedule

Este é outro pacote de código aberto licenciado pelo MIT para agendamento de trabalhos no Node. É o segundo agendador de nó mais popular considerando o número de downloads no npm. Com 43 versões lançadas até a versão atual 2.0.0, o Node-schedule teve muito tempo para se adaptar e melhorar ao longo dos anos.

O Node-schedule é principalmente baseado em tempo, em vez de baseado em intervalo agendamento, embora você também possa usá-lo de forma flexível. Com o Node-schedule, você pode facilmente agendar um trabalho para ser executado em datas específicas com uma configuração de recorrência opcional.

O Node-schedule oferece a flexibilidade de agendar trabalhos usando agendamento no estilo cron e agendamento baseado em data. Com o agendamento no estilo cron, você pode passar uma expressão cron para especificar quando o trabalho é disparado e a expressão é analisada usando o analisador cron:

const nodeSchedule=require (‘node-schedule’); const job=nodeSchedule.scheduleJob (‘* * * * *’, function () {console.log (‘Job foi acionado em:’, new Date.toLocaleTimeString ());})

Por outro lado, com o agendamento baseado em data, você pode passar um objeto de data JavaScript real para especificar a data exata em que um trabalho deve ser executado. Ele também fornece uma opção para vincular dados atuais para uso no futuro, conforme ilustrado no trecho de código abaixo:

const nodeSchedule=require (‘node-schedule’); const birthDay=new Date (2021, 11, 21, 5, 30, 0);//Aniversário de Bae let birthDayGift=; const job=nodeSchedule.scheduleJob (birthDay, function (gift) {console.log (‘Happy Birthday Baby’, new Date.toLocaleDateString ()); console.log (gift);}.bind (null, birthDayGift)); birthDayGift=null;

Uma limitação do Node-schedule, como a maioria dos Node Schedulers, é que o trabalho será disparado apenas quando o script estiver em execução. Se você deseja agendar um trabalho que persistirá mesmo quando o script não estiver em execução, considere o uso do Cron. Da mesma forma, não é uma boa opção se você deseja persistir a tarefa entre as reinicializações.

A programação do nó tem três dependências de primeiro nível. Você pode ver as dependências do Node-schedule no gráfico de dependências abaixo.

Depois de executar o Packagephobia, o Node-schedule tem tamanho de publicação de 33,2 KB e tamanho de instalação de 3,15 MB.

Node-cron

Node-cron é um pacote de código aberto licenciado pelo ISC. Publicado pela primeira vez há 6 anos, o Node-cron é outro agendador Node maduro, estável e testado em batalhas.

Ele usa a expressão GNU crontab para agendamento de tarefas. Você pode agendar o Node-cron para acionar o trabalho em um horário específico ou em intervalos de tempo:

const nodeCron=require (‘node-cron’); nodeCron.schedule (‘* * * * * *’, ()=> {//Este trabalho será executado a cada segundo console.log (new Date (). toLocaleTimeString ());})

Além do método de programação para agendar um trabalho, o Node-cron também expõe métodos para validar uma expressão cron, iniciando, parando ou destruindo um trabalho agendado.

Embora o Node-cron atenda às suas necessidades se você estiver agendando um trabalho simples em Node ou no lado do servidor, não será muito útil se você precisar de um agendador que execute no navegador ou com suporte para threads de trabalho.

O Node-cron tem apenas uma dependência de primeiro nível.

O Node-cron tem tamanho de publicação e instalação de 65,6 KB e 5,26 MB, respectivamente, de acordo com Packagephobia.

Bree

Bree é outro agendador de tarefas JavaScript licenciado pelo MIT. Ele roda tanto no Node quanto no navegador.

Este pacote é bem novo se comparado a outros planejadores mencionados acima. Foi publicado há cerca de nove meses e cerca de 72 versões foram publicadas desde então. A versão atual é 6.3.0 e tem cerca de 9.109 downloads semanais no npm.

No entanto, apesar de ser o mais novo, o Bree oferece muito mais recursos do que a maioria dos outros programadores, e é o único que é executado no navegador e no Node. De acordo com a documentação, Bree usa threads de trabalho no Node e trabalhadores da web no navegador para gerar processos em área restrita.

Ele fornece suporte para simultaneidade, limitação, trabalhos de longa duração e muito mais. Verifique a documentação para uma lista completa de recursos.

O snippet de código abaixo mostra como você pode usar o Bree para agendar um trabalho simples. scrape-data.js, backup-database.js e send-email.js são funções declaradas na pasta de jobs na raiz do diretório do projeto:

const Bree=require (‘bree’); const jobs=[{name:’scrape-data’, interval:’every 1 minute’}, {name:’backup-database’, timeout:’at 12:00 am’}, {name:’send-email’, tempo limite:’1m’, intervalo:’5m’}]; Const bree=novo Bree ({jobs}); bree.start ();

Este pacote tem 13 dependências de primeiro nível, conforme ilustrado na árvore de dependências abaixo.

O tamanho da publicação é 1,38 MB e o tamanho da instalação é 5,64 MB após executá-lo por meio do Packagephobia.

Da mesma forma, se você está pensando em executar o Bree no lado do cliente, o tamanho do pacote minimizado e compactado com gzip é de 64,3 KB após a execução do pacote por meio do Bundlephobia:

Cron

Este agendador Node licenciado pelo MIT não deve ser confundido com o Node-cron-tenha cuidado! Ambos Cron e Node-cron têm o mesmo nome de repositório, node-cron, no GitHub. Ao pesquisar no GitHub, você pode pensar que um é um fork do outro.

Este pacote foi publicado pela primeira vez há dez anos, com 37 versões publicadas desde então. Ele está atualmente na versão 1.8.2 e tem 909.120 downloads semanais no npm, a maior contagem de download entre os agendadores de Node destacados aqui.

Você pode usar a sintaxe do crontab,’* * * * * *’, para agendar quando um trabalho será acionado. A expressão estende o padrão Unix adicionando uma opção de segundos. Se você não passar a opção de segundos, o padrão é zero.

Também oferece a flexibilidade de passar um objeto de data em vez da expressão cron. O Cron é muito semelhante ao Node-cron em termos de funcionalidade, como você pode ver aqui:

const {CronJob}=require (‘cron’); const job=new CronJob (‘* * * * * *’, function () {console.log (‘Este trabalho é disparado a cada segundo!’);}); job.start ();

O Cron tem uma dependência de primeiro nível e 1.516 dependentes do npm. As dependências do Cron são exatamente as mesmas do Node-cron, conforme destacado na árvore de dependências abaixo.

Possui tamanho de publicação de 69,3 KB e tamanho de instalação de 5,25 MB. Você notará que o tamanho da publicação é apenas 3,7 KB maior do que o do Node-cron.

Bull

Bull é um Sistema de fila baseado em Redis para Node que requer um servidor Redis em execução. Se você não quiser usar o Redis, terá que se contentar com os outros agendadores. Existem serviços de hospedagem Redis que funcionam bem com a Bull se você não estiver interessado em instalá-los em seu sistema.

A Bull possui o sistema de fila baseado em Redis mais rápido e confiável para ambientes de tempo de execução Node. Este pacote licenciado pelo MIT publicado há oito anos e tem 216.275 downloads semanais. A versão atual é 3.29.1, indicando sua maturidade e estabilidade.

A Bull oferece recursos como agendamento de tarefas baseado em sintaxe cron, limitação de taxa de tarefas, simultaneidade, execução de várias tarefas por fila, novas tentativas e prioridade de trabalho, entre outros. Para obter uma lista completa de recursos, verifique a documentação .

O exemplo trivial abaixo irá registrar “Hello World!” para o console após cinco segundos com a configuração padrão do Redis:

const Queue=require (‘bull’); const helloWorldQueue=new Queue (‘hello-world-queue’); const data={someData:’Hello World!’}; opções const={atraso: 5000, tentativas: 3}; helloWorldQueue.add (dados, opções); helloWorldQueue.process ((job)=> {console.log (job.data.someData);});

Este pacote possui dez dependências de primeiro nível. Você pode verificar as dependências de nível subsequente no gráfico de dependências abaixo.

O pacote tem tamanho de publicação de 170 KB e tamanho de instalação de 9,14 MB.

Visão geral do trabalho agendadores no Nó

Algumas das métricas e informações destacadas nas subseções anteriores foram resumidas na tabela abaixo:

Agenda Nó-cron Nó-agenda Bree Cron Bull Tamanho do pacote de instalação 18,8 MB 5,26 MB 3,15 MB 5,64 MB 5,25 MB 9,14 MB Estrelas do GitHub 7,8k 2k 8k 1,2k 7,1k 11,2k Cobertura do teste 80% 100% 95% 100% 81,3% 94% Versões lançadas 85 19 43 72 37 136 Publicar tamanho do pacote 256 KB 65,6 KB 33,2 KB 1,38 MB 69,3 KB 170 KB Minificado +Tamanho do pacote compactado em gzip 336,8 KB 103,3 KB 31,1 KB 64,3 KB 94,4 KB 193,4 KB Downloads semanais 62.214 326.261 697.002 8.527 909.120 310.809 Documentação Bom Bom Bom Bom Bom Bom Licença MIT ISC MIT MIT MIT MIT

Todos os pacotes que vimos acima são gratuitos, de código aberto e bem documentados. As licenças amigáveis ​​(MIT ou ISC) dão a você a liberdade de fazer praticamente qualquer coisa com a base de código.

Node-cron, Node-schedule e Cron são bastante maduros e estáveis. Para agendamento de trabalho simples, você pode querer ir com um deles.

Por outro lado, embora Agenda e Bull também sejam agendadores maduros, eles exigem MongoDB e Redis respectivamente.

Finalmente, o mais novo de todos os agendadores acima é Bree. Apesar de sua idade, Bree é rica em recursos. Ele é executado no Node e no navegador.

Conclusão

Existem vários agendadores de trabalho para escolher no ecossistema de pacotes do Node. A maioria dos pacotes tem funcionalidade que atenderá às suas necessidades básicas de agendamento de trabalho, e sua escolha de um agendador dependerá muito do seu caso de uso.

Se você pretende fazer agendamento de trabalho simples no lado do servidor, você pode querer explorar Cron, Node-cron e Node-schedule porque são simples, maduros, populares, estáveis ​​e têm licenças amigáveis. Eu recomendaria usar um dos três para trabalhos simples.

Agenda e Bull também oferecem agendamento de trabalho simples, mas com recursos adicionais e suporte para persistência de banco de dados. Você não gostaria de todos esses pacotes e dependências em seu aplicativo, a menos que esteja interessado em usar os recursos adicionais que eles oferecem.

Por outro lado, se você está procurando um planejador com funcionalidades estendidas, como suporte para threads de trabalho ou capacidade de execução no navegador e no Node (além de agendamento de trabalho simples), então Bree pode ser a melhor opção para você.

Há algo que eu perdi? Deixe-me saber na seção de comentários abaixo.