DEV Community

Cover image for Agendando Mensagens com Brighter V10 e Hangfire
Rafael Andrade
Rafael Andrade

Posted on

Agendando Mensagens com Brighter V10 e Hangfire

Em artigos anteriores, abordei o Brighter V10 RC1 e o uso do PostgreSQL como gateway de mensagens. Um dos recursos principais do Brighter é o agendamento de mensagens através dos métodos Send, Publish e Post usando parâmetros DateTimeOffset ou TimeSpan. Embora o agendador padrão do Brighter utilize um Timer em memória, ele também suporta agendadores externos como Hangfire, Quartz.NET, AWS EventBridge Scheduler e Azure Service Bus.

Por Que Usar Hangfire com o Brighter?

O Hangfire oferece uma solução robusta e pronta para produção com armazenamento persistente, monitoramento via dashboard e capacidades de repetição - tornando-o ideal para aplicações empresariais onde a confiabilidade na entrega de mensagens é crítica. Ao contrário do agendador em memória, o Hangfire mantém as tarefas agendadas mesmo após reinicializações da aplicação.

Requisitos

Revisão Rápida do Brighter

Antes de mergulhar na integração com o Hangfire, vamos revisar brevemente os conceitos-chave do Brighter:

Request (Command/Event)

Defina mensagens usando IRequest:

public class Greeting() : Event(Guid.NewGuid())
{
    public string Name { get; set; } = string.Empty;
}
Enter fullscreen mode Exit fullscreen mode
  • Commands: Operações para um único destinatário (ex.: SendEmail).
  • Events: Notificações de broadcast (ex.: OrderShipped).

Message Mapper (Opcional)

Traduz entre as mensagens do Brighter e os objetos do seu aplicativo. Por padrão, o Brighter usa serialização JSON.

Request Handler

Processa as mensagens recebidas:

public class GreetingHandler(ILogger<GreetingHandler> logger) : RequestHandler<Greeting>
{
    public override Greeting Handle(Greeting command)
    {
        logger.LogInformation("Hello {Name}", command.Name);
        return base.Handle(command);
    }
}
Enter fullscreen mode Exit fullscreen mode

Configurando o Brighter com o Agendador Hangfire

1. Registrar o Hangfire no Microsoft DI

Para desenvolvimento, você pode usar armazenamento em memória, mas em ambientes de produção, sempre use uma solução de armazenamento persistente como PostgreSQL, SQL Server ou Redis:

services
    .AddHangfire(opt => opt
        .UseDefaultActivator()
        .UseRecommendedSerializerSettings()
        .UseSimpleAssemblyNameTypeSerializer()
        .UseInMemoryStorage())
    .AddHangfireServer();
Enter fullscreen mode Exit fullscreen mode

2. Registrar o Hangfire no Brighter

Registre a fábrica do agendador Hangfire com o Brighter. Como o Hangfire precisa ser totalmente inicializado antes que o Brighter possa usá-lo, utilizamos o padrão fábrica:

services
    .AddHostedService<ServiceActivatorHostedService>()
    .AddServiceActivator(opt => ... )
    .UseScheduler(_ => new HangfireMessageSchedulerFactory())
Enter fullscreen mode Exit fullscreen mode

3. Usando o Agendador

Agende mensagens com controle preciso de tempo usando timing relativo (TimeSpan) ou absoluto (DateTimeOffset):

// Agenda para 1 segundo a partir de agora
await process.PostAsync(TimeSpan.FromSeconds(1), new SchedulerCommand { Name = name, Type = "Post"});

// Agenda para 2 segundos a partir de agora
await process.SendAsync(TimeSpan.FromSeconds(2), new SchedulerCommand { Name = name, Type = "Send"});

// Agenda para exatamente 3 segundos a partir de agora
await process.PublishAsync(DateTimeOffset.UtcNow + TimeSpan.FromSeconds(3), new SchedulerCommand { Name = name, Type = "Publish"});
Enter fullscreen mode Exit fullscreen mode

Considerações Importantes

  1. Implantação em Produção: Nunca use o Hangfire.InMemory em produção. Configure o Hangfire com um backend de armazenamento persistente que corresponda à sua infraestrutura.

  2. Tratamento de Erros: O Hangfire automaticamente tenta novamente trabalhos falhos de acordo com sua configuração. Revise as políticas de repetição do Hangfire para garantir que estejam alinhadas com seus requisitos de entrega de mensagens.

  3. Monitoramento: Aproveite o dashboard do Hangfire para monitorar trabalhos agendados, histórico de processamento e possíveis falhas.

Conclusão

Integrar o Hangfire com o Brighter V10 cria uma poderosa solução de agendamento que combina os padrões robustos de mensagens do Brighter com o processamento confiável de trabalhos do Hangfire. Essa combinação é particularmente valiosa para cenários que exigem processamento de mensagens com atraso ou entrega garantida após reinicializações do sistema.

O agendador em memória é perfeito para desenvolvimento e testes, mas para ambientes de produção, o Hangfire fornece a durabilidade e as capacidades de monitoramento necessárias para aplicações empresariais.

Veja a implementação completa no GitHub

Top comments (0)