Можно ли добавить ограничение скорости в Invoke-RestMethod? - PullRequest
0 голосов
/ 16 мая 2019

Каждый раз, когда я пытаюсь запустить этот скрипт, я сталкиваюсь с ошибкой 429 (ограничение скорости) с сервера. Как я могу замедлить или уменьшить скорость, чтобы не встретить эту ошибку?

Это для потоковой передачи данных в службу PowerBI через API PowerBI. Я пытался выяснить, могу ли я найти что-нибудь о том, как реализовать ограничение скорости в сочетании с Invoke-RestMethod, но я не могу ничего найти. Я не уверен, если это возможно, или если другой метод должен использоваться вообще. Я не могу найти в документации PowerBI ничего, что могло бы предложить, что помимо Invoke-RestMethod существует другая альтернатива для отправки данных в конечную точку 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 BI отображало данные в квазиреальном времени.

Сценарий запускается, но быстро получает ответ 429 от сервера. По какой-то причине этого не происходило до тех пор, пока в Power BI не проверялась опция «анализа исторических данных», хотя я не уверен, что понимаю влияние и то, как эта опция повлияет на функциональность этого сценария.

1 Ответ

1 голос
/ 16 мая 2019

В вашем коде вы читаете все строки из таблицы и толкаете их одну за другой, и это в бесконечном цикле.Если в вашей таблице более 60 строк, вы достигнете limit для запросов строк POST в минуту.Ограничения следующие:

  • 75 макс. Столбцов
  • 75 макс. Таблиц
  • 10 000 макс. Строк на один запрос POST-строк
  • 1 000 000 строк добавленов час на набор данных
  • 5 макс. ожидающих запросов строк POST на набор данных
  • 120 запросов строк POST в минуту на набор данных
  • Если в таблице 250 000 или болеестрок, 120 запросов POST строк в час на набор данных
  • 200 000 макс. строк, хранящихся на таблицу в наборе данных FIFO
  • 5 000 000 макс. строк, хранящихся на таблицу в наборе данных «Политика хранения отсутствует»
  • 4000 символов на значение для строкового столбца в операции строк POST

Это означает, что вам не разрешено делать более 120 запросов портов в минуту, но вы можете добавить до 10 тысяч строк за одну запись,поэтому просто измените свой код, чтобы прочитать все строки из вашей таблицы (при условии, что они меньше 10 КБ) и отправить их в набор потоковых данных с помощью одного пост-запроса.Таким образом, вы будете делать только 2 запроса в минуту, и вы не получите ответ 429.

Если вы не включите анализ исторических данных, набор данных будет сохранять строки только в течение последнего часа.Если вы включите его, количество строк будет расти, а если их станет больше 250К, ограничение в 120 сообщений в минуту будет снижено до 120 за час , таким образом, вы попадете в него, даже если есть2 строки в вашей таблице.Так что это может объяснить разницу.

Для одновременного удаления всех строк из набора данных необходимо переместить вызов 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...