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

问题描述 投票:0回答:1

我正在开发一个项目,该项目利用 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 函数中?

azure multi-tenant autoscaling quartz.net azure-durable-functions
1个回答
0
投票

将横向扩展的 Azure 应用服务视为位于负载均衡器后面且彼此互不了解的多个服务器。因此,它实际上是一个服务器集群,如果您想在具有多个实例的应用程序服务上运行 Quartz.NET 作业,则每个实例都将尝试同时运行作业。在您的示例中,每个实例都会尝试发送电子邮件提醒。根据您想要按计划作业运行的功能及其实现方式,横向扩展的应用程序服务可能会出现其他问题,例如竞争条件和潜在的数据损坏。

当多个服务器连接到同一个作业存储并启用集群功能时,Quartz.NET 可以在负载均衡模式下工作。集群中的所有服务器将共享相同的配置,时间触发器将在每个服务器上触发,但只有第一台服务器会锁定要执行的作业,以防止其他服务器运行它。请参阅Quatz.NET集群文档了解配置详细信息,并注意警告,因为存在一些边缘情况,数据损坏仍然可能。

对于 Azure PaaS 中托管的解决方案,我仍然建议使用 Azure Functions 或 WebJobs。 Azure Functions 通常是最佳选择,因为它们提供更灵活的扩展,并且不依赖于 Web 应用程序的应用服务计划。在某些情况下,WebJobs 工作得更好,请查看文档此处,看看这些情况是否与您的应用程序相关。

© www.soinside.com 2019 - 2024. All rights reserved.