首页 > 解决方案 > Azure 函数 - 队列触发器函数意外停止处理消息

问题描述

在我们的项目中有多个队列函数,当一个消息完成时处理消息,所有函数按顺序执行一条消息,但多条消息可以并行执行。在做负载测试通过 72 请求函数时,每个函数都需要对消息进行一些操作, { "version": "2.0", "extensions": { "queues": { "visibilityTimeout": "00:00:10", "maxPollingInterval": "00:00:00.100", "batchSize": 6, "maxDequeueCount": 2 }, "functionTimeout": "-1" } } 这是函数项目的 host.json。问题是有时函数没有完成对消息的处理,函数将消息出列处理但没有完成,无法理解背后的问题,下面是天蓝色的函数设置图像 在此处输入图像描述 在此处输入图像描述

 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}");
    }
}

在此处输入图像描述

标签: c#asp.netazureasync-awaitazure-functions

解决方案


推荐阅读