SwifType超出速率限制

时间:2019-10-17 12:34:23

标签: elasticsearch swiftype

我目前有一个模拟帐户。我正在尝试使用SwifType为雇主创建POC。我们有一个非常大的数据库,该数据库每1小时创建一次indexec并创建一个JSON文件。考虑到它只是在生成字符串时发送字符串的主键,因此我认为与Elastic集成将非常容易。我使用PHP Curl并连接到API。代码发送出部分数据,然后出现“超出速率限制”错误。

如何解决该错误并获得完整的JSON索引?

此刻我的代码如下:

// SENDING DATA TO ELASTIC SEARCH
$arr = array_change_key_case($arr, CASE_LOWER); // Keys to lower case
$arrlist = array_chunk($arr,100); // Split to chunks of 100
foreach($arrlist as $key=>$arr){
    $json = json_encode($arr); // Making the JSON string from the array
    $ch = curl_init('https://host-***.api.swiftype.com/api/as/v1/engines/***/documents');                                                                      
    curl_setopt($ch, CURLOPT_POST, 1);                                                                     
    curl_setopt($ch, CURLOPT_POSTFIELDS, $json);                                                                  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);      
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);                                                                
    $headers = array();
    $headers[] = 'Content-Type: application/json';
    $headers[] = 'Authorization: Bearer private-***';
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    $result = curl_exec($ch);
    if (curl_errno($ch)) {
        echo 'Error:' . curl_error($ch);
    }
    curl_close($ch);

    echo $result."<hr>";
}

此外,考虑到此代码将每小时索引一次,如果我要反复发送相同的数据,它将更新前一个还是重复它?如果是这样,我该如何处理?

1 个答案:

答案 0 :(得分:0)

X-RateLimit-Remaining标头达到0(或接近0)或收到429响应时,您需要查看sleep()标头(请参见详细信息here),unfold和然后重试。如果您连续收到多个429响应,我建议您使用exponential backoff(每次收到429的睡眠时间都要加倍,请在请求成功后将其重置为默认值)。