用于 Web App 后台任务的暂存槽处理消息
Staging Slot processing messages for Web App background task
我正在使用 Azure App 服务计划来托管处理服务总线主题消息的 Web 应用程序。
我正在使用 Azure Function App,它也有 http 触发器来执行事件网格数据。
Web App(App Service Plan) 和 Function App(Elastic Premium plan) 在生产中都有暂存槽。
在交换插槽时,我观察到 Web 应用程序的 stgaing 插槽正在处理消息。这是预期的行为吗?
对于函数应用程序暂存槽,我没有观察到这种行为。为什么会这样?
请务必停止插槽,否则会处于运行状态(可以接收消息)。如果你不想让它接收信息,你应该停止它。
在每个槽中添加一个名为“IsStaging”的应用程序设置,其中包含 true 和 false 值,然后当应用服务预热时(启动或方法使用消息)停止请求,这样消息就不会从暂存槽中消耗。
if (CurrentConfiguration.IsStaging)
{
logger.LogWarn("Staging slot cannot consume messages");
return;
}
网络作业更新:
static void Main(string[] args)
{
JobHost host = CreateJobHost();
if (CurrentConfiguration.IsStaging)
{
host.Call(typeof(Program).GetMethod("DoStagingInfiniteLoop"));
}
else
{
host.Call(typeof(Program).GetMethod("ProcessQueue"));
}
}
private static JobHost CreateJobHost()
{
JobHostConfiguration jobHostConfig = new JobHostConfiguration();
jobHostConfig.DashboardConnectionString = "DashboardCS";
jobHostConfig.StorageConnectionString = "StorageCS";
var JobHost = new JobHost(jobHostConfig);
return JobHost;
}
[NoAutomaticTrigger]
public static void DoStagingInfiniteLoop(TextWriter logger, CancellationToken token)
{
const int LOOP_TRACE_INTERVAL = 10000;
ProcessLogger.WriteTrace("This is a staging environment, waiting...");
while (true)
{
Task.Delay(LOOP_TRACE_INTERVAL).Wait(token);
}
}
[NoAutomaticTrigger]
public static void ProcessQueue(TextWriter logger, CancellationToken token)
{
//Your processing code here
}
我正在使用 Azure App 服务计划来托管处理服务总线主题消息的 Web 应用程序。 我正在使用 Azure Function App,它也有 http 触发器来执行事件网格数据。 Web App(App Service Plan) 和 Function App(Elastic Premium plan) 在生产中都有暂存槽。
在交换插槽时,我观察到 Web 应用程序的 stgaing 插槽正在处理消息。这是预期的行为吗? 对于函数应用程序暂存槽,我没有观察到这种行为。为什么会这样?
请务必停止插槽,否则会处于运行状态(可以接收消息)。如果你不想让它接收信息,你应该停止它。
在每个槽中添加一个名为“IsStaging”的应用程序设置,其中包含 true 和 false 值,然后当应用服务预热时(启动或方法使用消息)停止请求,这样消息就不会从暂存槽中消耗。
if (CurrentConfiguration.IsStaging)
{
logger.LogWarn("Staging slot cannot consume messages");
return;
}
网络作业更新:
static void Main(string[] args)
{
JobHost host = CreateJobHost();
if (CurrentConfiguration.IsStaging)
{
host.Call(typeof(Program).GetMethod("DoStagingInfiniteLoop"));
}
else
{
host.Call(typeof(Program).GetMethod("ProcessQueue"));
}
}
private static JobHost CreateJobHost()
{
JobHostConfiguration jobHostConfig = new JobHostConfiguration();
jobHostConfig.DashboardConnectionString = "DashboardCS";
jobHostConfig.StorageConnectionString = "StorageCS";
var JobHost = new JobHost(jobHostConfig);
return JobHost;
}
[NoAutomaticTrigger]
public static void DoStagingInfiniteLoop(TextWriter logger, CancellationToken token)
{
const int LOOP_TRACE_INTERVAL = 10000;
ProcessLogger.WriteTrace("This is a staging environment, waiting...");
while (true)
{
Task.Delay(LOOP_TRACE_INTERVAL).Wait(token);
}
}
[NoAutomaticTrigger]
public static void ProcessQueue(TextWriter logger, CancellationToken token)
{
//Your processing code here
}