首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以添加速率限制的调用-RestMethod方法?

是否可以添加速率限制的调用-RestMethod方法?
EN

Stack Overflow用户
提问于 2019-05-15 22:52:13
回答 1查看 1.2K关注 0票数 1

每次我尝试运行这个脚本时,我都会遇到来自服务器的429个错误(速率限制)。我怎样才能放慢速度,或降低速度,以免遇到这一错误?

这是为了通过PowerBI API将数据流传输到PowerBI服务。我试图了解如何结合来实现速率限制,但是我无法找到任何东西。我不确定这是否可能,或者是否应该完全使用另一种方法。我在PowerBI文档中找不到任何提示除了Invoke之外还有其他替代方法来将数据发送到API端点。

代码语言:javascript
复制
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中签入时,这似乎才开始发生,尽管我不确定我是否理解该选项的影响以及该选项将如何影响此脚本的功能。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-16 08:04:55

在您的代码中,您正在读取表中的所有行,并逐个推送它们,这是一个无穷无尽的循环。如果表中有超过60行,则每分钟将按限制发出POST行请求。限额如下:

  • 75根最大柱
  • 75个最大表
  • 每个POST行请求最多10,000行
  • 每个数据集每小时增加1 000 000行
  • 每个数据集5个最大待定的POST行请求
  • 120按数据集每分钟发送行请求
  • 如果表有25万或更多行,则每个数据集每小时有120个POST行请求。
  • FIFO数据集中每个表存储的最大行数为20万行
  • “无保留策略”数据集中每个表存储的5,000,000最大行
  • POST行操作中字符串列的每个值4,000个字符

这意味着您不允许每分钟提出超过120个端口请求,但是您可以用一个post添加10K行,因此只需更改代码,从表中读取所有行(假设它们小于10K),并使用单个post请求将它们推送到流数据集。这样,您将只提出每分钟2个请求,您将不会得到429响应。

除非启用历史数据分析,否则dataset将只保留最后一个小时的行。如果启用它,行数将继续增长,如果它们超过250 K,则每分钟120个帖子的限制将降低到每小时 120条,因此即使表中有2行,也会按下它。所以这可以解释两者的区别。

若要一次从dataset中推送所有行,需要在循环之后移动对API的调用。使用循环来初始化带所有行的数组,并将该数组推送到服务。将循环更改为如下所示:

代码语言:javascript
复制
## 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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56158639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档