Azure functions Azure函数有时在解列时启动多个实例

Azure functions Azure函数有时在解列时启动多个实例,azure-functions,Azure Functions,我有一个相当简单的azure函数,具有以下设置: { "queues": { "maxPollingInterval": 2000, "visibilityTimeout": "00:10:00", "maxDequeueCount": 3, "batchSize": 12, "newBatchThreshold": 6 } } 我注意到,有时当函数失败时,它会按预期将消息出列,然后重试再次执行该函数。问题是有时它会在同一条消息上启动两个实例。这

我有一个相当简单的azure函数,具有以下设置:

{
  "queues": {
    "maxPollingInterval": 2000,
    "visibilityTimeout": "00:10:00",
    "maxDequeueCount": 3,
    "batchSize": 12,
    "newBatchThreshold": 6
  }
}
我注意到,有时当函数失败时,它会按预期将消息出列,然后重试再次执行该函数。问题是有时它会在同一条消息上启动两个实例。这是已知的行为吗?我的功能如下所示。我应该在抛出异常之前做些什么吗

[FunctionName("MoveCopyFilesFolders")]
public static void Run([QueueTrigger("xx", Connection = "StorageConnStr")]string jobIdStr, TraceWriter log)
{
    log.Info($"MoveCopyFilesFolders processed: {jobIdStr}");

    Dictionary<string, string> properties = new Dictionary<string, string> { { "service", "xx" }, { "jobid", jobIdStr } };
    KK.Common.Instrumentation.AILogger logger = new KK.Common.Instrumentation.AILogger(configuration.ApplicationInsightsKey, properties);

    try
    {
        logger.WriteTrace($"Start moving/copy files/folders for jobid: {jobIdStr}", SeverityLevel.Verbose); 

        var jobId = Int32.Parse(jobIdStr);

        var moveCopyRepo = new CopyMoveRepository(configuration.DBConnectionString);
        var appRegRepo = new AppRegistrationRepository(configuration.DBConnectionString);

        CopyOrMoveItemsService.Run(jobId, moveCopyRepo, appRegRepo, logger);
        logger.WriteTrace("End move/copy files for site", SeverityLevel.Information);
        logger.Flush();
    }
    catch (Exception ex)
    {
        log.Info(ex.Message);
        logger.WriteException(ex);
        logger.Flush();
        throw ex;
    }          
}
[FunctionName(“MoveCopyFilesFolders”)]
公共静态无效运行([QueueTrigger(“xx”,Connection=“StorageConnStr”)]字符串jobIdStr,TraceWriter日志)
{
log.Info($“MoveCopyFilesFolders已处理:{jobIdStr}”);
字典属性=新字典{{“service”,“xx”},{“jobid”,jobIdStr};
KK.Common.Instrumentation.AILogger记录器=新的KK.Common.Instrumentation.AILogger(configuration.ApplicationInsightsKey,properties);
尝试
{
WriteTrace($“开始移动/复制jobid:{jobIdStr}的文件/文件夹”,severittylevel.Verbose);
var jobId=Int32.Parse(jobIdStr);
var moveCopyRepo=新的CopyMoveRepository(configuration.DBConnectionString);
var appregepo=新的AppRegistrationRepository(configuration.DBConnectionString);
CopyOrMoveItemsService.Run(作业ID、moveCopyRepo、appRegRepo、记录器);
logger.WriteTrace(“结束站点的移动/复制文件”,服务器级别信息);
logger.Flush();
}
捕获(例外情况除外)
{
日志信息(例如消息);
logger.WriteException(ex);
logger.Flush();
掷骰子;
}          
}

我看到的行为是,函数按预期启动时只有一个实例。失败时,有时会在同一条消息上启动两个实例。我可以看到这一点,因为我添加了10条不同id的消息作为输入,在出现故障后,两个实例以相同id运行。

该函数实际运行了两次,还是只有日志记录使它出现了两次?您从何处检索它运行两次的信息?我在一个数据库中有日志记录和数据,它们都反映了作业运行两次。代码的作用是移动一个文件。移动文件时,它会在数据库中标记该文件已移动。我可以在ApplicationInsights中看到,函数app被重新启动,然后消息被出列。当它醒来时,它会启动两个实例。