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

标签 azure multi-tenant autoscaling quartz.net azure-durable-functions

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

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

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

关于azure - 在启用自动缩放之前,如何确保 Multi-Tenancy Azure 应用程序中的 Quartz.NET 调度兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77359918/

相关文章:

grails - 通过Grails Multi-Tenancy 核心插件使用多个GSP模板/皮肤?

Azure DNS 解析器 - 规则集 VNet 链接

c# - 无法从不同的应用程序读取 azure 缓存数据

c# - 如何使用 MSAL 使用特定范围的客户端 key 从 azure 获取 OAuth token

database - Multi-Tenancy 数据库架构

architecture - 什么是 Multi-Tenancy 及其实现方式?

kubernetes - Kubernetes 如何计算 HPA 的 CPU 利用率?

amazon-web-services - 任务节点上具有多个横向扩展规则的 EMR 自动扩展行为

amazon-web-services - 特定 Auto-Scaling 组 Cloudformation AWS

azure - 如何使用 Graph API 获取无效用户名尝试的日志?