Hangfire processamento background com resiliência em suas aplicações .Net Core

Olá pessoal, tudo bem?
Em vários projetos eu tive que criar processos em segundo plano, o famoso processo batch ou robô, para processar algum arquivo, com ou sem agendamento, processos as vezes de transformação de dados, enfim.. você ai desenvolvedor, deve já ter feito no decorrer da sua carreira, várias coisas do tipo.
Podemos fazer de várias formas, mas uma delas, e de forma muito fácil, é utilizando o Hangfire.
Uma das funcionalidades mais legais dele, é que nativamente ele aplica a resiliência, que quer dizer por exemplo, a cada execução com erro no processo, ele faz a re-tentativa da execução.
E o mais importante = Aberto e gratuito para uso comercial.
Existe sim uma versão paga, denominada Hangfire Pro, com diferenças da versão gratuita.
Mas vamos lá, vou criar um exemplo de como utilizar o Hangfire
Vamos criar uma WebApi

Agora vamos instalar as dependências do Hangfire no projeto:
PM>> install-package Hangfire
O Hangfire, utiliza uma base de dados para controlar as execuções dos processos, que serão agendados. Para isso temos que configurar uma base de dados para que funcione corretamente.
Você pode usar os seguintes banco de dados:
- Sql Server
- Mongo
- MySql
- PostGre
Para o nosso exemplo, vamos usar o MongoDb. Para isso, vamos instalar a dependência respectiva.
PM>> install-package Hangfire.Mongo
Precisamos agora adicionar no Startup.cs, a configuração do Hangfire.
No método ConfigureServices, iremos configurar a conexão com a base de dados que iremos usar.
Veja, que adicionamos na linha 13 o Hangfire na aplicação, configurando o MongoDb como base de dados, para o controle das execuções.
Para que o Hangfire crie suas tabelas para seu funcionamento, adicionamos configurações de migração, ou seja, quando a aplicação se inicializar, as tabelas de controle serão criadas na base de dados.
No método Configure, vamos configurar que essa aplicação será o servidor do Hangfire e ativar o Dashboard para acompanhamento dos processos que estão em execução.
Agora execute a aplicação: http://localhost:58977/hangfire

Veja que neste Dashboard existem algumas abas de acompanhamento dos processos.
Tarefas : Onde você acompanha os processos que estão sendo executadas;
Retentativas: Acompanhamento dos processos que estão sendo repetidos, por não sucesso de execução;
Tarefas Recorrentes: Acompanhamento dos processos que estão agendados;
Servidores: Servidores ativos do Hangfire

Agora, precisamos entender qual processo do Hangfire, vamos usar em nossa aplicação. Na versão gratuita, temos 4 opções de processamento:
Fire-and-forget jobs
Inicia imediatamente o processo que quer executar
var jobId = BackgroundJob.Enqueue(
() => Console.WriteLine("Fire-and-forget!"));Delayed jobs
Faz o agendamento do processo que quer executar. No exemplo abaixo, irá ser processado daqui 7 dias.
var jobId = BackgroundJob.Schedule(
() => Console.WriteLine("Delayed!"),
TimeSpan.FromDays(7));Recurring jobs
Faz o agendamento recorrente do processo. No exemplo abaixo, irá ser executado diariamente.
RecurringJob.AddOrUpdate(
() => Console.WriteLine("Recurring!"),
Cron.Daily);Continuations
Faz com que um processo seja executado novamente, pelo Id da execução.
BackgroundJob.ContinueWith(
jobId,
() => Console.WriteLine("Continuation!"));Vamos criar, um exemplo em nossa aplicação, para entender melhor o funcionamento do HangFire
Crei um método chamado DivisionRandom(). Esse método irá fazer uma divisão com dois números randômicos. Caso tenha alguma divisão por 0, irá acontecer uma exceção, fazendo que o HangFire, faça a re-tentativa desse processo até 10 vezes;
Vou configurar a chamada do método, para ser executado pelo Hangfire
Irei usar neste exemplo o Recurring Jobs, para que o processo seja executado a cada minuto.
Ao ser iniciado a aplicação, no Dashboard já consta como Tarefa recorrente.

Depois de um minuto, o processo se inicia. Acompanhe pelo Dashboard

Veja que existe na seção Processando a quantidade de processos sendo executados.
Caso execute com sucesso, na seção Concluído somará a quantidade dos processos executados;
Agora, vamos ver quando o processo é executado com erro;

Veja neste exemplo, na seção Agendadas, que existe um processo que deu falha, e o Hangfire, o colocou para agendamento.
No menu Retentativas, perceba que existe um processo adicionado na fila de tentativas;

Depois do tempo estipulado, ele irá re-tentar executar o processo

E novamente o processo foi executado com erro. Visualize na figura acima, que na coluna motivo, está o número da tentativa de sucesso do processo.
Caso execute com sucesso, irá ser adicionado na seção Concluído.
Veja todo o histórico das execuções na seção Concluído

Clique em um deles, e veja o detalhamento da execução:

Bom pessoal, aqui está uma ferramenta bem legal, para processamentos em segundo plano e muito fácil de se usar . Dependendo do seu projeto, isso poderá se encaixar perfeitamente.
Espero que vocês tenham gostado..
Segue o exemplo em meu Github:
Grande abraço..
Até a próxima!

