仅在第一个Azure WebApp实例上运行代码



我在Azure上运行了一个网络应用程序。该网站构建在aspnetcore3中,并在Docker容器中运行。

有一个后台工作人员在做一些事情,比如数据库清理和发送内置到应用程序中的电子邮件。

我的问题是,如果我需要扩展应用程序,我应该如何最好地处理这个问题。也就是说,如果我创建了它的多个实例,那么确保后台工作程序只在其中一个实例上运行的最佳方法是什么。。如果删除了另一个实例,则另一个将接管该工作。

我意识到一个解决方案是将应用程序拆开,并将后台工作程序作为Azure函数单独运行。但出于成本(这是一个业余项目(和复杂性的原因,我宁愿避免这样做。

因此,我很想知道是否有更多的方法可以解决这个问题,将东西放在一个docker容器中。

例如,是否有一个环境变量,我可以查询它来获得当前实例名称和所有实例的列表(然后我可以说,按字母顺序排列的第一个实例是"主"实例(。并每隔一段时间检查一下,以了解当前实例是否是主实例。

附带说明:如果您重用网站的应用程序服务计划,Azure功能不会产生额外费用。从复杂性来看,它们可能没有你目前所想的那么复杂。但是,如果你的主要目标是在一个容器中运行所有内容,你也可以实现这一点:

您可以使用WebJobs SDK基本上运行";事件处理程序端";Azure功能,包括所需工作的协调。如果需要额外的并发限制,请使用singleton属性。在基础架构方面,WebJobs需要一个存储帐户来管理规模。

您可以在与ASP.NET核心应用程序的其余部分相同的过程中运行WebJobs。如果你想走这条路,一些代码可以让你开始:

var builder = Host.CreateDefaultBuilder(args);
builder.ConfigureWebHostDefaults(webBuilder =>
{
// webBuilder.UseStartup<Startup>();
webBuilder.Configure(app =>
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Hello World!");
});
});
});
});
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddAzureStorage();
b.AddTimers();
});
IHost host = builder.Build();
using (host)
{
await host.RunAsync();
}

相关内容

最新更新