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
- .NET 8 ou superior (o Brighter V10 suporta net8.0, net9.0 e netstandard2.0)
- Um projeto .NET com estes pacotes NuGet:
- Hangfire.AspNetCore: Habilita a integração do Hangfire com o ASP.NET Core.
- Hangfire.InMemory: Fornece uma opção de armazenamento em memória para desenvolvimento (use armazenamento baseado em banco de dados em produção)
- Paramore.Brighter.MessageScheduler.Hangfire: Integra o Hangfire com o sistema de agendamento do Brighter.
- Paramore.Brighter.MessagingGateway.Postgres: Habilita a integração com Postgres para filas de mensagens.
- Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection: Permite registrar o Brighter com o Microsoft DI.
- Paramore.Brighter.ServiceActivator.Extensions.Hosting: Executa o Brighter como serviço em segundo plano.
- Serilog.AspNetCore: Para logging estruturado (opcional, mas recomendado).
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;
}
- 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);
}
}
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();
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())
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"});
Considerações Importantes
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.
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.
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.
Top comments (0)