我的环境: Azure Functions 应用程序启用了 2 个 TimeTrigger 函数(每天触发 1-2 次,持续几分钟)。 Powershell Core、Windows 操作系统、消费计划。 函数用于从网站上抓取数据。
伪代码:
Invoke-webrequest -uri XXX | Convert-FromJson
foreach (){
data += element
}
send-data
几周前,我已将 Azure Functions 迁移到 v.4。昨天,我检查了连接存储帐户的见解,发现迁移后文件事务计数几乎增加了 5-6 倍。
现在有一个问题,也许有人知道 Azure Function App 在 v4.x 中发生了什么,为什么与 v2.x / v3.x 相比有这么多事务?
你尝试了什么: 首先想到的是迁移的实例存在一些问题,但没有。我创建了一个新的 Azure Function App(Powershell 核心、消费计划,但现在是 Linux 操作系统),但情况没有改变,还会发生一些随机峰值和不间断的创建关闭 AzureFiles 事务。
UPD。提供代码。
Send-TelegramTextMessage
- Poshgram 模块 (https://github.com/techthoughts2/PoshGram)
param($Timer)
$currentUTCtime = (Get-Date).ToUniversalTime()
if ($Timer.IsPastDue) {
Write-Host "PowerShell timer is running late!"
}
$ID1 = "XXX"
$ID2 = "YYY"
$botToken = "XXXX"
$weekNR = get-date -UFormat %V
$year = get-date -UFormat %Y
$ParseFrom = Invoke-WebRequest "example.com"
$UpcomingFree = $ParseFrom.ToString() -split {$_ -eq ">" -or $_ -eq "<"} | Select-String -Pattern 'title="Free'
$UF1 = $UpcomingFree | Select-Object -First 1
$UpcomingFree1 = $UF1 -split '"' | Select-String -Pattern 'Free ' | Out-String
$AddAvalableNow = $ParseFrom.ToString() -split {$_ -eq ">" -or $_ -eq "<"} | Select-String -Pattern 'Available Now'
$AddAvalableNow -split ' & ' -join " & "
#============GET WebSiteName DATA================
$getWebSiteNameJson = Invoke-WebRequest "example2.com/json"
$WebSiteNameJson = $getWebSiteNameJson.Content | ConvertFrom-Json
$WebSiteNameJsonElements= $WebSiteNameJson.data.Catalog.searchStore.elements
$nnn = Get-Date
foreach ($WebSiteNameJsonElement in $WebSiteNameJsonElements) {
$promLen = $WebSiteNameJsonElement.promotions.promotionalOffers.promotionalOffers
$promLenUpc = $WebSiteNameJsonElement.promotions.upcomingPromotionalOffers.promotionalOffers
if ($promLen.Count -gt 0){
foreach ($promLenItem in $promLen)
{
if (($promLenItem.endDate - $promLenItem.startDate).Days -le 7 -and $promLenItem.discountSetting.discountPercentage -eq 0 -and (($nnn -ge $promLenItem.startDate) -and ($nnn -le $promLenItem.endDate)) ) {
$Available += "`n- "+$WebSiteNameJsonElement.title + "; "
}
}
}
if ($promLenUpc.Count -gt 0){
foreach ($promLenItemUpc in $promLenUpc)
{
if (($promLenItemUpc.endDate - $promLenItemUpc.startDate).Days -le 7 -and $promLenItemUpc.discountSetting.discountPercentage -eq 0 -and (($nnn.AddDays(7) -ge $promLenItemUpc.startDate) -and ($nnn.AddDays(7) -le $promLenItemUpc.endDate))) {
$coming += "`n- "+$WebSiteNameJsonElement.title + "; "
}
}
}
}
$coming1 += " `n$coming"
$Available1 += "`n$Available"
$today = (Get-Date).DayOfWeek.value__
if ($today -lt 4){
$daysleft = 4-$today
$daysleftMessage = "`n$daysleft"
} elseif ($today -gt 4) {
$daysleft = 12-$today
$daysleftMessage = "`n$daysleft"
}
$messageHeader = "$weekNR; $year"
$messageWebSiteNameBody = "`n$Available1 `n`n$coming1"
$oldMessageBody = "$UpcomingFree1"
$sendchanel = Send-TelegramTextMessage -BotToken $botToken -ChatID $ID2 -Message "$messageHeader `n`n$messageWebSiteNameBody`n`n `n$daysleftMessage"
$messageSendChat = $sendchanel.result.message_id
$send = Send-TelegramTextMessage -BotToken $botToken -ChatID $ID1 -Message "$messageSendChat `n`n$oldMessageBody"
Clear-Variable coming, coming1, Available, Available1
我尝试使用下面的代码来执行获取 API 响应并将其发送到存储在 blob 存储中的文本文件的功能。
param($Timer)
$currentUTCtime = (Get-Date).ToUniversalTime()
if ($Timer.IsPastDue) {
Write-Host "PowerShell timer is running late!"
}
$apiUrl = "https://randomuser.me/api/"
$timestamp = Get-Date -Format "yyyyMMddHHmmss"
Connect-AzAccount -Tenant '<tenant_id>' -SubscriptionId '<subscription_id>'
$resourceGroup= "DefaultResourceGroup-CID"
$storageAccountName = "kamstorage101azfps"
$containerName = "apidatactr"
$blobName = "response_$timestamp.txt"
# $localFilePath = "C:\Users\kamalid\source\repos\Kamali\ResponseFiles\$blobName"
$localFilePath = "https://kamstorage101azfps.file.core.windows.net/kamfunpsapp101baf0/apiresponsefiles/$blobName"
$response = Invoke-WebRequest -Uri $apiUrl -Method Get
if ($response.StatusCode -eq 200) {
$response.Content | Set-Content -Path $localFilePath
Write-Host "Response from the API is saved in the text file"
} else {
Write-Host "Request failed with status code: $($response.StatusCode)"
}
if (-not $script:storageContext) {
$storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey (Get-AzStorageAccountKey -ResourceGroupName $resourceGroup -Name $storageAccountName).Value[0]
Set-AzStorageBlobContent -Container $containerName -File $localFilePath -Blob $blobName -BlobType Block -Context $storageContext -Force
}
$storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey (Get-AzStorageAccountKey -ResourceGroupName $resourceGroup -Name $storageAccountName).Value[0]
Set-AzStorageBlobContent -Container $containerName -File $localFilePath -Blob $blobName -BlobType Block -Context $storageContext -Force
Write-Host "PowerShell timer trigger function ran! TIME: $currentUTCtime"
我使用了 Azure Functions v4,并在 Windows 和 Linux 操作系统中使用上述代码观察了计时器触发器的事务,并在几分钟内观察到事务中存在小峰值。
部署到azure函数应用程序时:
与 Windows 相比,在 Linux 操作系统上运行可以具有不同的文件系统、文件访问模式和资源管理行为。
改进了扩展和资源利用率,并且更改了 v4 Azure Functions 的运行时,即 Dapr 运行时。
由于您没有在问题中提供完整的代码,我假设库或依赖项与 v3 和 v3 相比有所不同,这可能会导致不同的文件访问模式,从而导致文件事务增加,如 Microsoft Doc 中所示 参考。