2014-07-25 158 views
3

我正在將40,000條記錄從一個系統遷移到另一個系統,並且將數據導入接收系統的唯一方法是通過其餘API POST調用。批量REST API POST處理

我在通過40,000 REST API調用迭代的最快方法尋找建議。我有我需要傳輸格式爲JSON的數據,並且我已經使用PHP將對象分塊成了40多個.json文件。理想情況下,我希望儘可能異步處理POST,任何有關使用PHP,JavaScript,Node.js或bash的方法的建議都將非常有用。

+0

'將'40個JSON文件'POST'作爲blob,解碼並解析爲JSON。然後直接在服務器上導出。這可以用任何服務器端語言來完成,但爲了提高速度和易用性,我願意與Node.JS – Deryck

回答

1

您可以通過curl的多功能與PHP同時進行POST調用。代碼中的註釋。

$json_files = array('1.json','2.json', ... , '40.json'); 
$count = 0; 
foreach($json_files as $json_file) { 

    $list_of_objects = json_decode(file_get_contents($json_file),true); 

    if(!$list_of_objects) { 
     //log error 
     continue; 
    } 

    //chunk into arrays of size 10 
    //or whatever # you want to run simultaneously 
    $chunked_list = array_chunk($list_of_objects,10); 

    foreach($chunked_list as $chunk) { 
     $handles = array();  
     $mh = curl_multi_init(); 

     foreach($chunk as $item) { 
      $ch = curl_init('your api url here'); 
      curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1); 
      curl_setopt($ch,CURLOPT_POST, 1); 
      curl_setopt($ch,CURLOPT_POSTFIELDS, http_build_query($item)); 
      curl_multi_add_handle($mh, $ch); 
      //index your handles by item id so 
      //you know what succeeded or failed 
      $handles[$item['id']] = $ch; 
     } 

     //execute all 10 posts simultaneously 
     //continue when all are complete 
     $running = null; 
     do { 
      $status = curl_multi_exec($mh, $running); 
     } while ($status === CURLM_CALL_MULTI_PERFORM || $running); 

     foreach($handles as $item_id => $handle) { 

      if(curl_multi_getcontent($handle) == 'my success message') { 
       //log $item_id to success file 
      } 
      else { 
       //log $item_id to fail file so you can retry later 
      } 

      curl_multi_remove_handle($mh, $handle);   
     } 

     curl_multi_close($mh); 
     $count += 10; 
     print "$count ...\n";   
    } 
} 
0

首先說:如果你已經使用PHP編寫的JSON文件,我相信你一定能適應該PHP腳本直接張貼到新的服務器?

這是一個批處理作業,因此您可以假定這是一次性腳本(儘管最好將其寫入以便重用)。關鍵是要找出新服務器可以處理多少個併發請求。 40k請求說,10個併發請求說,每個1秒,你應該在兩個小時內完成。

而在具體的節點中,請確保將您的全局並行請求數設置爲多於6,如果您的新服務器可以處理它。 (http.globalAgent.maxSockets = 20 - 最大請求相同的主機名)。

您可以使用像async這樣的模塊,或爲並行請求編寫自己的簡單模塊。如果您使用的是異步,那麼您可以爲此使用async.parallelLimit()。

爲了得到更具體的答案,你必須指定你的請求多一點,也許扔一點代碼。

+0

這很好,謝謝Zlatko。這是爲了讓用戶遷移到Auth0進行單點登錄,我將不得不與他們一起檢查併發性。 –