项目

微服务解决方案:后台工作器

您必须拥有ABP商业版或更高版本许可证,才能创建微服务解决方案。

后台工作器是长时间运行的后台任务进程。在微服务系统中,它们用于处理持续或定期运行的任务,例如数据处理、通知发送等。ABP框架内置了一套在应用程序中创建和运行这些工作器的系统。您可以在后台工作器文档中了解更多信息。

基本上,您可以根据需求创建按特定时间间隔运行的定时工作器,例如检查非活跃用户状态,如果用户超过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 AdministrationServiceModule : AbpModule
{
    public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
    {
        await context.AddBackgroundWorkerAsync<PassiveUserCheckerWorker>();
    }
}

分布式系统中一个重要的问题是:相同的后台工作器可能在同一个服务的多个实例中同时运行。因此您需要特别注意工作器可能产生的副作用。例如,如果要从队列中处理消息,必须确保每条消息仅被处理一次。您可以使用分布式锁来防止多个实例处理同一条消息。更多关于微服务环境中分布式锁的信息,请参阅分布式锁文档。


在本文档中