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