单层解决方案:后台工作器
后台工作器是在应用程序后台持续运行的进程。它们适用于非即时性任务,例如数据处理、发送通知或监控系统健康状况。后台工作器通常在应用启动时开始运行,并持续工作直至应用停止。更多相关信息,可查阅后台工作器文档。
简单来说,您可以根据需求创建定时工作器,比如检查非活跃用户状态,若用户超过30天未登录应用,则将其状态更改为“未激活”。
public class PassiveUserCheckerWorker : AsyncPeriodicBackgroundWorkerBase
{
public PassiveUserCheckerWorker(
AbpAsyncTimer timer,
IServiceScopeFactory serviceScopeFactory) : base(
timer,
serviceScopeFactory)
{
Timer.Period = 600000; // 10分钟
}
protected async override Task DoWorkAsync(
PeriodicBackgroundWorkerContext workerContext)
{
Logger.LogInformation("开始:设置非活跃用户状态...");
// 解析依赖项
var userRepository = workerContext
.ServiceProvider
.GetRequiredService<IUserRepository>();
// 执行工作
await userRepository.UpdateInactiveUserStatusesAsync();
Logger.LogInformation("完成:设置非活跃用户状态...");
}
}
创建工作器后,还需在应用中注册它。您可以在模块类的 OnApplicationInitializationAsync 方法中注册工作器:
public class BookstoreModule : AbpModule
{
public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
{
await context.AddBackgroundWorkerAsync<PassiveUserCheckerWorker>();
}
}
在分布式系统中扩展应用程序时,必须注意同一后台工作器可能在多个服务实例上同时运行,这需要仔细管理潜在的副作用。例如,若要从队列中处理消息,需确保每条消息仅被处理一次。为避免多个实例处理同一消息,可以使用分布式锁。
抠丁客


