Azure函数:当函数自动缩放时,函数被多次调用

Azure函数:当函数自动缩放时,函数被多次调用,azure,.net-core,async-await,azure-functions,Azure,.net Core,Async Await,Azure Functions,在Azure队列中,为queueitem添加单个条目,但为同一queueitem多次调用函数,无法理解错误,我们在函数中使用了Async/Wait,代码也是异步的,下面是Azure函数设置, 下面是功能代码 public class CreateTempVMTempTablesFunction { private static Container container; private static IProcessingFunctionService _processingFu

在Azure队列中,为queueitem添加单个条目,但为同一queueitem多次调用函数,无法理解错误,我们在函数中使用了Async/Wait,代码也是异步的,下面是Azure函数设置,

下面是功能代码

public class CreateTempVMTempTablesFunction
{
    private static Container container;
    private static IProcessingFunctionService _processingFunctionService; 
    private static IAzureFunctionFailuresRepository _azureFunctionFailuresRepository;
    private static ITrackLogEventsService _trackLogEventsService;

    [FunctionName("CreateTempVMTempTablesFunction")]
    public static async Task Run([QueueTrigger("%environment-plan%" + AzureFunctionConstants.CreateTempTableQueue, Connection = "AzureWebJobsStorage")]string myQueueItem, ILogger log)
    {
        string ErrorMessage = string.Empty;
        var start = DateTime.Now;
        FunctionStatusEnum IsSuccess = FunctionStatusEnum.Success;
        log.LogInformation($"C# Queue trigger function processed: {myQueueItem} - {start}");

        Guid tempid = new Guid(myQueueItem);
        TempVM tempVM = new TempVM();
        try
        {
            container = BusinessLogic.Helpers.SimpleInjectorWebApiInitializer.InitializeSingleton();;
           
            _processingFunctionService = container.GetInstance<IProcessingFunctionService>();
            _azureFunctionFailuresRepository = container.GetInstance<IAzureFunctionFailuresRepository>();
            _trackLogEventsService = container.GetInstance<ITrackLogEventsService>();

            tempVM = await _processingFunctionService.GetById(tempid);
            if (tempVM != null)
            {
                FunctionStatusEnum IsAlreadyPerformed = await _azureFunctionFailuresRepository.GetAzureFunctionFailureStatus(AzureFunctionConstants.CreateTempVMTempTablesFunction, tempVM.Id);

                if (IsAlreadyPerformed != FunctionStatusEnum.Success)
                {
                        ResponseData response = await _processingFunctionService.CreateTempVMTempTables(tempid);
                }
                else
                {
                    ErrorMessage = AzureFunctionConstants.FunctionAlreadyProcessed;
                }
            }
            else
            {
                ErrorMessage = AzureFunctionConstants.TempVMNotFound;
            }
        }
        catch (Exception ex)
        {
            IsSuccess = FunctionStatusEnum.Failed;
            ErrorMessage = ex.ToString();
        }
        finally
        {
            AzureFunctionFailures azureFunctionFailures = new AzureFunctionFailures()
            {
                Id = Guid.NewGuid(),
                FunctionName = AzureFunctionConstants.CreateTempVMTempTablesFunction,
                QueueItem = myQueueItem,
                ErrorMessage = ErrorMessage,
                StartTime = start,
                EndTime = DateTime.Now,
                FailureTypeId = tempid,
                FunctionStatus = IsSuccess,
                ProcessTime = (DateTime.Now - start).TotalMilliseconds,
            };
            await _azureFunctionFailuresRepository.Add(azureFunctionFailures);
        }
        log.LogInformation($"End Time : {DateTime.Now} - QueueItem {myQueueItem}");
        log.LogInformation($"Total Time : {DateTime.Now - start} - QueueItem {myQueueItem}");
    }
}
公共类CreateTempVMTestablesFunction
{
专用静态容器;
私有静态IPProcessingFunctionService\u processingFunctionService;
私有静态iazureRefunctionFailuresRepository _-azureFunctionFailuresRepository;
专用静态iTrackLogEvents服务_TrackLogEvents服务;
[函数名(“CreateTempVMTestablesFunction”)]
公共静态异步任务运行([QueueTrigger(“%environment plan%”+AzureFunctionConstants.CreateTestableQueue,Connection=“AzureWebJobsStorage”)]字符串myQueueItem,ILogger日志)
{
string ErrorMessage=string.Empty;
var start=DateTime.Now;
FunctionStatusEnum IsSuccess=FunctionStatusEnum.Success;
LogInformation($“C#队列触发器函数已处理:{myQueueItem}-{start}”);
Guid tempid=新Guid(myQueueItem);
TempVM TempVM=新的TempVM();
尝试
{
container=BusinessLogic.Helpers.SimpleInjectorWebApiInitializer.InitializeSingleton();;
_processingFunctionService=container.GetInstance();
_azureFunctionFailuresRepository=container.GetInstance();
_trackLogEventsService=container.GetInstance();
tempVM=await\u processingFunctionService.GetById(tempid);
if(tempVM!=null)
{
FunctionStatusEnum IsAlreadyPerformed=await AzureFunctionFailuresRespository.GetAzureFunctionFailureStatus(AzureFunctionConstants.CreateTempVMTestablesFunction,tempVM.Id);
if(IsAlreadyPerformed!=FunctionStatusEnum.Success)
{
ResponseData response=Wait_processingFunctionService.CreateTempVMTestables(tempid);
}
其他的
{
ErrorMessage=AzureFunctionConstants.FunctionAlreadyProcessed;
}
}
其他的
{
ErrorMessage=AzureFunctionConstants.TempVMNotFound;
}
}
捕获(例外情况除外)
{
IsSuccess=FunctionStatusEnum.Failed;
ErrorMessage=ex.ToString();
}
最后
{
AzureFunctionFailures AzureFunctionFailures=新的AzureFunctionFailures()
{
Id=Guid.NewGuid(),
FunctionName=AzureFunctionConstants.CreateTempVMTestablesFunction,
QueueItem=myQueueItem,
ErrorMessage=ErrorMessage,
开始时间=开始,
EndTime=DateTime。现在,
FailureTypeId=tempid,
FunctionStatus=IsSuccess,
ProcessTime=(DateTime.Now-start).Total毫秒,
};
等待azureFunctionFailuresRepository.Add(azureFunctionFailures);
}
LogInformation($“结束时间:{DateTime.Now}-QueueItem{myQueueItem}”);
LogInformation($“总时间:{DateTime.Now-start}-QueueItem{myQueueItem}”);
}
}
我已经检查了在队列中添加条目的代码,但对于一个queueitem只添加了一个条目。
当为不同的队列项目在同一队列中添加多个条目(即,仅添加了24个请求的负载测试)时,就会出现此问题。当运行单个队列时,则不会出现此问题。如注释中所述,我们的功能是具有自动缩放功能的应用内服务计划。只需在功能的应用程序设置中将
WEBSITE\u MAX\u DYNAMIC\u APPLICATION\u SCALE\u
的值设置为
1

这有什么见解吗?-不,我发现了一个问题,当自动缩放完成时,会调用多个函数,但没有找到解决方案,我尝试了更改函数的ARR设置,我已将其设置为ON。请尝试在函数的应用程序设置中将
网站\u MAX\u DYNAMIC\u APPLICATION\u SCALE\u OUT
的值设置为
1
?好,谢谢你的回复我,你有机会试一试吗?它有用吗?