В настоящее время я сталкиваюсь со странным поведением устойчивых функций 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
@IkhtesamAfrin: я поделился запрошенной частью кода. Надеюсь, поможет
Как выглядят ваши входные данные, которые вы передаете при вызове функции http starter
@IkhtesamAfrin: это относительно большой JSON в теле http. К сожалению, я не могу поделиться с вами продуктивным примером, поскольку это конфиденциальные данные. Но сами данные не представляют собой ничего особенного. Передается большой вложенный файл данных JSON, и в оркестраторе я конвертирую его в объект ps.


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





Orchestrator функция будет выполняться до тех пор, пока состояние не обновится до завершенного.Спасибо большое, отличное объяснение! Теперь это имеет смысл.
поделитесь, пожалуйста, кодом функции триггера HTTP