如何在启用自动缩放之前确保多租户Azure应用程序中的Quartz.NET调度兼容性?

sr4lhrrt  于 12个月前  发布在  .NET
关注(0)|答案(1)|浏览(177)

我正在做一个项目,利用Quartz.NET在多租户Azure环境中调度数据拉取。我们正在考虑启用自动缩放,并希望确保Quartz.NET兼容,并在这些条件下有效运行。
Quartz.NET是否可自动扩展,或者是否需要与Azure Functions集成以实现可扩展性?如果未更改,扩展时是否会对每个示例进行数据拉取?扩展或缩小将如何影响这一点?过渡到Azure Function是否更适合在可扩展环境中处理计划任务?任何关于在潜在的自动缩放Azure环境中处理Quartz.NET调度的见解或经验都将非常感谢。谢谢!
编辑,希望使问题更具体。这里是一个非常简化的代码示例,我们希望确保将正确缩放。这项工作,经过每个租户,并为他们中的每一个人在提醒到期时以电子邮件的形式发送提醒。

public class TuRemindersJob : IJob
{
    private readonly IServiceProvider _serviceProvider;

    private readonly ILogger<TuRemindersJob> _logger;

    public TuRemindersJob(IServiceProvider serviceProvider, ILogger<TuRemindersJob> logger)
    {
        _serviceProvider = serviceProvider;
        _logger = logger;
    }

    public async Task Execute(IJobExecutionContext context)
    {
        var correlationId = Guid.NewGuid().ToString("N");

        using var outerScope = _serviceProvider.CreateScope();
        var tenantDataProvider = outerScope.ServiceProvider.GetRequiredService<ITenantDataProvider>();

        var allTenants = tenantDataProvider.GetAllTenants()
            .Select(x => new TenantDto(x.TenantId, x.TenantName));

        foreach (var tenant in allTenants)
        {
            using var innerScope = outerScope.ServiceProvider.CreateScope();
            var claimsInitializer = innerScope.ServiceProvider.GetRequiredService<IClaimsInitializer>();
            claimsInitializer.InitializeAsMachine(tenant.Id, correlationId);

            var sendTuRemindersJob = innerScope.ServiceProvider.GetRequiredService<ISendTuRemindersCommand>();
            // This command goes over db to check for scheduled alerts, if due for a user then sends them an email
            var sendTuRemindersResponse = await sendTuRemindersJob.ExecuteAsync(DateTime.UtcNow, CancellationToken.None);

            if (sendTuRemindersResponse.IsSuccess)
            {
                continue;
            }
        }
    }
}

字符串
如果运行在一个自动缩放环境中,至少可以缩放3到10个示例,那么每个示例都会向用户发送一封电子邮件吗?我们可以使用Quartz轻松地修改这些类型的解决方案以在自动缩放环境中工作吗?或者应该将这些提取到Azure函数中?

h79rfbju

h79rfbju1#

可以将横向扩展的Azure应用程序服务想象为位于负载均衡器后面并且彼此不知道的多个服务器。因此,实际上它是一个服务器群集,如果您想要在具有多个示例的应用程序服务上运行Quartz.NET作业,则每个示例将尝试同时运行作业。在您的示例中,每个示例都将尝试发送电子邮件提醒。根据您希望作为计划作业运行的功能及其实现方式,横向扩展的应用服务可能会出现其他问题,例如竞争条件和潜在的数据损坏。
当多个服务器连接到同一个作业存储库并启用集群功能时,Quartz.NET可以在负载平衡模式下工作。集群中的所有服务器将共享相同的配置,时间触发器将在每个服务器上触发,但只有第一个服务器会锁定作业以防止其他服务器运行它。请参阅Quatz.NET群集文档以了解配置详细信息,并注意警告,因为有一些边缘情况和数据损坏仍然是可能的。
对于托管在Azure PaaS中的解决方案,我仍然建议使用Azure Functions或WebJobs。Azure Functions通常是最佳选择,因为它们提供更灵活的扩展,并且不依赖于Web应用程序的应用服务计划。虽然WebJobs在某些情况下工作得更好,但请查看此处的文档以了解这些情况是否与您的应用程序相关。

相关问题