每次我尝试运行这个脚本时,我都会遇到来自服务器的429个错误(速率限制)。我怎样才能放慢速度,或降低速度,以免遇到这一错误?
这是为了通过PowerBI API将数据流传输到PowerBI服务。我试图了解如何结合来实现速率限制,但是我无法找到任何东西。我不确定这是否可能,或者是否应该完全使用另一种方法。我在PowerBI文档中找不到任何提示除了Invoke之外还有其他替代方法来将数据发送到API端点。
while($true)
{
Clear-Host;
$SysDateTime = Get-Date -DisplayHint DateTime -Format F
$SqlServer = 'nt-sql-db';
$SqlDatabase = 'stream-db';
$SqlConnectionString = 'Data Source={0};Initial Catalog={1};Integrated Security=SSPI' -f $SqlServer, $SqlDatabase;
$SqlQuery = "SELECT * FROM dbo.streamTable;";
$SqlCommand = New-Object -TypeName System.Data.SqlClient.SqlCommand;
$SqlCommand.CommandText = $SqlQuery;
$SqlConnection = New-Object -TypeName System.Data.SqlClient.SqlConnection -ArgumentList $SqlConnectionString;
$SqlCommand.Connection = $SqlConnection;
$SqlConnection.Open();
$SqlDataReader = $SqlCommand.ExecuteReader();
## identify the API endpoint
$endpoint = "https://api.powerbi.com/beta/1234567890"
## structure the JSON payload
while ($SqlDataReader.Read()) {
$payload = @{
"name" =$SqlDataReader['name']
"queueTime" = $SqlDataReader['queueTime']
"promisedTime" =$SqlDataReader['promisedTime']
"sys_datetime" = $SysDateTime
}
Invoke-RestMethod -Method Post -Uri "$endpoint" -Body (ConvertTo-Json @($payload))
}
$SqlConnection.Close();
$SqlConnection.Dispose();
Start-Sleep -Seconds 30;
}这里有一个循环,目的是查询网络上的SQL服务器,并一次又一次地将数据传输到API端点,以便Power应用程序以准实时的方式显示数据。
脚本似乎正在运行,但很快就会遇到来自服务器的429响应。由于某些原因,直到“历史数据分析”选项在Power中签入时,这似乎才开始发生,尽管我不确定我是否理解该选项的影响以及该选项将如何影响此脚本的功能。
发布于 2019-05-16 08:04:55
在您的代码中,您正在读取表中的所有行,并逐个推送它们,这是一个无穷无尽的循环。如果表中有超过60行,则每分钟将按限制发出POST行请求。限额如下:
这意味着您不允许每分钟提出超过120个端口请求,但是您可以用一个post添加10K行,因此只需更改代码,从表中读取所有行(假设它们小于10K),并使用单个post请求将它们推送到流数据集。这样,您将只提出每分钟2个请求,您将不会得到429响应。
除非启用历史数据分析,否则dataset将只保留最后一个小时的行。如果启用它,行数将继续增长,如果它们超过250 K,则每分钟120个帖子的限制将降低到每小时 120条,因此即使表中有2行,也会按下它。所以这可以解释两者的区别。
若要一次从dataset中推送所有行,需要在循环之后移动对API的调用。使用循环来初始化带所有行的数组,并将该数组推送到服务。将循环更改为如下所示:
## structure the JSON payload
$AllRows = @()
while ($SqlDataReader.Read()) {
$CurrentRow = @{
"name" =$SqlDataReader['name']
"queueTime" = $SqlDataReader['queueTime']
"promisedTime" =$SqlDataReader['promisedTime']
"sys_datetime" = $SysDateTime
}
$AllRows += $CurrentRow
}
Invoke-RestMethod -Method Post -Uri "$endpoint" -Body (ConvertTo-Json $AllRows)https://stackoverflow.com/questions/56158639
复制相似问题