Функция Azure HTTP выполняется несколько раз за одно выполнение

#c# #azure #azure-function-app

#c# #azure #azure-function-app

Вопрос:

У меня есть относительно простая функция Azure, работающая в соответствии с планом потребления с таймаутом 4 четыре минуты.

Когда я выполняю через портал, он выполняется несколько раз, причем прогоны перекрывают друг друга, хотя я выполнил его только один раз.

Например:

  • Выполнение 1

  • 00:36:52.917

  • 00:41:25.750

  • Выполнение 2

  • 00:40:41.793

  • 00:41:25.700

  • Выполнение 3

  • 00:44:27.430

  • 00:48:30.857

Нет никакой логики в отношении многократного и перекрывающегося времени выполнения.

Есть идеи, что происходит?

 using System;
using System.Threading.Tasks;
using System.Net.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using System.Collections.Generic;
using Newtonsoft.Json;
using System.IO;
using Microsoft.Data.SqlClient;


namespace FMPApiCall

{
    public static class FMPTestAPI
    {
        #region Private Data Members
        private static readonly HttpClient Client = new HttpClient();
        #endregion

        [FunctionName("FMPTestAPI")]

        public static async Task<IActionResult> Run(
           [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]
            HttpRequest req, ILogger log)

        {
            log.LogInformation("FMPTestAPI triggered - BEGIN");

            List<string> symbolsList = FMPCallAPI.CommonFunctions.GetSymbolsFromDB();   //gets as list of IDs from the database

            int counter = 0;

            using SqlConnection dbconnection = new SqlConnection(Environment.GetEnvironmentVariable("SqlServerConnectionString"));
            {
                dbconnection.Open();

                foreach (string symbol in symbolsList)
                {
                    counter  ;

                    var apiRequest =
                            $"https://myapi.com/api/v3/dataset1/{symbol}?period=quarteramp;limit=4amp;apikey=123";
                    var response = await Client.GetAsync(apiRequest);
                    var symbolsData = await response.Content.ReadAsStringAsync();

                    var sqlStr = $"INSERT INTO [dbo].[_azure] (symbol,runid, response,lastupdated) VALUES ( '{symbol}' , {counter} ,'{response}',  getutcdate() )";
                    using (SqlCommand cmd = new SqlCommand(sqlStr, dbconnection))
                    {
                        var rows = cmd.ExecuteNonQuery();
                    }


                }
                dbconnection.Close();
            }

            log.LogInformation("FMPTestAPI triggered - END");

            string name = req.Query["name"];

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            name = name ?? data?.name;

            return name != null
                ? (ActionResult)new OkObjectResult(new { Hello = name })
                : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
        }
    }
}

  

eee

Комментарии:

1. Пожалуйста, поделитесь фактическими журналами (маскируя любую конфиденциальную информацию). Это практически невозможно, если не будет повторной попытки при каком-либо сбое.

2. Это привело меня в правильном направлении. Примерно через 3 минуты 50 секунд после выполнения Azure выдает ошибку 503 и запускает другое выполнение под другим идентификатором.

3. Таким образом, 503 может быть co, поступающим из одного из вызовов API, которые вы выполняете из своей функции. Вы проверили журналы? Без этого никто не смог бы здесь помочь.