Устойчивые функции Azure PowerShell — странное поведение оркестратора

В настоящее время я сталкиваюсь со странным поведением устойчивых функций Azure, основанных на PowerShell. Я попытался отладить его, а также поискал в документации Microsoft/Интернете подобные случаи. Но у меня все еще остается вопросительный знак относительно поведения оркестратора.

Оркестратор странным и неожиданным образом выполняет мою функцию длительной активности и повторяется снова и снова.

Позвольте мне очень быстро познакомить вас с моим кодом и показать мою проблему здесь:

Оркестратор:

param($Context)
$ErrorActionPreference = "Stop"
$output = @()

try {
    #Validate Input
    Write-Information "Orchestrator: Validating Input"
    $JSONString = ($Context.Input).ToString()
    if (-not ([string]::IsNullOrEmpty($JSONString))) {
        $InputPSObject = ConvertFrom-Json $JSONString

        try {
            $TestFunction = Invoke-DurableActivity -FunctionName ‘TestFunction’ -Input $InputPSObject
        }
        catch {
            Write-Warning "Orchestrator: Test Function: $($_.Exception.Message)"
        } 

    } else {
        Write-Error "Orchestrator: Could not validate Input. String is null or empty"
        throw
    }
} catch {
    Write-Error "Orchestrator: Could not validate Input. Unexpected error"
    Write-Warning "Orchestrator: $($_.Exception.Message)"
    throw
}

Проверьте надежную функцию

param($InputObject)
Write-Information: “TestFunction”
$ErrorActionPreference = "Continue"

if ($test) {

  $array = @()
try {
  ..do someting..
  if ($Object -eq "Test") {
    $array += $Object
  } else {
    Write-Warning "Object is empty"
  }
  return $array
}
catch {
  Write-Warning "Unexpected error"
}
}

К вашему сведению: эта функция является более или менее примером моей реальной функции, так что не запутайтесь. Но этого кода должно быть достаточно, чтобы познакомить вас с проблемой.

Вырез потока журнала выполнения:

INFORMATION: Orchestrator: Validating Input
INFORMATION: TestFunction
WARNING: Object is empty
INFORMATION: Orchestrator: Validating Input
WARNING: Orchestrator: Test Function: Value cannot be null. (Parameter 'input').
Executed 'Functions.TestOrchestrator (Succeeded, Id=***, Duration=95ms)

Поведение/Объяснение: Функции запускаются триггером HTTP (файл JSON передается в теле http), а оркестратор выполняет долговременную функцию (как и ожидалось).

INFORMATION: Orchestrator: Validating Input
INFORMATION: TestFunction

Затем в устойчивой «Тестовой функции» происходит «ошибка». Но нет проблем, ошибка перехватывается (как и ожидалось), в потоке журнала отображается только предупреждающее сообщение:

WARNING: Object is empty

До сих пор это ожидаемое поведение: оркестратору возвращается пустой массив (поскольку он не смог заполнить какие-либо значения из-за ошибки). Но тогда это сбивает с толку: Оркестратор запускается снова с самого начала, это можно увидеть по потоку журнала:

INFORMATION: Orchestrator: Validating Input

И снова переходит в блок try функции try-catch и пытается повторно выполнить устойчивую функцию тестирования (это можно проверить посредством отладки в vscode). К вашему сведению: в оркестраторе нет опции повтора! Но второе выполнение функции напрямую завершается неудачей и он попадает в блок catch. Я понятия не имею, почему он думает, что «вход» функции теперь пуст? Это также можно увидеть в потоке журнала:

WARNING: Orchestrator: Test Function: Value cannot be null. (Parameter 'input').

В моей продуктивной функции Azure у меня есть более одной функции активности, и он будет повторять это поведение для каждой другой выполняемой функции. Таким образом, после каждой другой выполненной функции он снова попытается выполнить «TestFunction» и снова потерпит неудачу с этим сообщением потока журнала:

INFORMATION: Orchestrator: Validating Input
WARNING: Orchestrator: Test Function: Value cannot be null. (Parameter 'input').

Это кажется очень странным поведением, но, возможно, это «нормальное» ожидаемое поведение оркестратора, я не знаю. Я был бы рад, если бы кто-нибудь мог объяснить мне это, чтобы я мог лучше справляться с таким поведением :)

Большое спасибо

Обновлено: Код HTTP-триггера по запросу @Ikhtesam Afrin:

HTTP-триггер

using namespace System.Net

param($Request, $TriggerMetadata)

$FunctionName = $Request.Params.FunctionName
$Body = $Request.Body
$InstanceId = Start-DurableOrchestration -FunctionName $FunctionName -InputObject $Body
Write-Host "Started orchestration with ID = '$InstanceId'"

$Response = New-DurableOrchestrationCheckStatusResponse -Request $Request -InstanceId $InstanceId
Push-OutputBinding -Name Response -Value $Response

поделитесь, пожалуйста, кодом функции триггера HTTP

Ikhtesam Afrin 28.03.2024 08:21

@IkhtesamAfrin: я поделился запрошенной частью кода. Надеюсь, поможет

LKo.exp 28.03.2024 08:36

Как выглядят ваши входные данные, которые вы передаете при вызове функции http starter

Ikhtesam Afrin 28.03.2024 09:19

@IkhtesamAfrin: это относительно большой JSON в теле http. К сожалению, я не могу поделиться с вами продуктивным примером, поскольку это конфиденциальные данные. Но сами данные не представляют собой ничего особенного. Передается большой вложенный файл данных JSON, и в оркестраторе я конвертирую его в объект ps.

LKo.exp 28.03.2024 09:35
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
4
160
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это кажется очень странным поведением, но, возможно, это «нормальное» ожидаемое поведение оркестратора, я не знаю.

Да, это ожидаемое поведение функции оркестратора.

  • Обратитесь к этому MS Doc, в котором говорится ниже.

  • Даже я вижу, что функция Оркестратора выполняется дважды.

  • Если вы откроете первый запуск, вы увидите Состояние: Запланировано, Статус выполнения: Ожидание.

  • Между тем, если вы проверите время завершения функции действия, вы увидите, что оно завершилось после первого запуска функции Оркестратора.

  • Таким образом, функция Оркестратора выполняется снова после завершения функции действия, чтобы обновить статус в таблице истории: Состояние: Завершено, Состояние выполнения: Завершено.

  • Orchestrator функция будет выполняться до тех пор, пока состояние не обновится до завершенного.

Спасибо большое, отличное объяснение! Теперь это имеет смысл.

LKo.exp 28.03.2024 13:24

Другие вопросы по теме

Похожие вопросы

Ошибка выдачи приложения Microsoft Graph API. Код: Authorization_RequestDenied Сообщение: недостаточно прав для завершения операции
Альтернативы для пакета Python azure-iot-hub
Ошибка при входе в Azure AD B2C. URI перенаправления «localhost:3001», указанный в запросе, не зарегистрирован
Ошибка копирования большого двоичного объекта хранилища Azure из URL-адреса (REST API) в заголовке x-ms-requires-sync
Как узнать, повлияет ли обновление версии API на функцию AKS или нет?
Используйте DefaultAzureCredential для DataLakeServiceClient
Недопустимый атрибут «условие». Значение «@contains(string, «substring»)» находится вне диапазона допустимых значений
Ошибка входа в Azure AD B2C с ошибкой поставщика удостоверений Microsoft: для погашения кода авторизации между источниками требуется ключ подтверждения для обмена кодами
Невозможно преобразовать речь в текст с помощью службы преобразования речи в текст Azure
Автоматизация ротации ключей для ресурсов, используемых в приложении