Azure Functions 迁移到 v 4.x,增加了 Azure 文件事务计数

问题描述 投票:0回答:1

我的环境: 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 ' &amp; ' -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

powershell azure-functions azure-storage powershell-core azure-files
1个回答
1
投票

我尝试使用下面的代码来执行获取 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 操作系统中使用上述代码观察了计时器触发器的事务,并在几分钟内观察到事务中存在小峰值。

enter image description here

部署到azure函数应用程序时:

enter image description here

与 Windows 相比,在 Linux 操作系统上运行可以具有不同的文件系统、文件访问模式和资源管理行为。

改进了扩展和资源利用率,并且更改了 v4 Azure Functions 的运行时,即 Dapr 运行时

由于您没有在问题中提供完整的代码,我假设库或依赖项与 v3 和 v3 相比有所不同,这可能会导致不同的文件访问模式,从而导致文件事务增加,如 Microsoft Doc 中所示 参考。

© www.soinside.com 2019 - 2024. All rights reserved.