更好的处理同时刮取大量数据的过程

时间:2017-04-03 14:09:24

标签: php mysql laravel curl

我正在构建一个具有此过程的Web应用程序。

1)用户注册

2)用户注册后,我正在运行一个queuing process,用于清除价值60k +的客户数据。这些数据来自第三方API,我使用curl来执行此操作。

3)在我抓取这些数据后,我将其存储在数据库中。

4)来自第三方api的这些抓取数据有一个分页,所以我做的是我检查了API的响应,如果它有另一个页面(nextPageUrl),如果它有响应,我然后curl再次获取所有客户数据并再次存储。这一直持续到api响应中没有nextPageUrl

//this is a pseudo code

RegisterUser(user);
CallThirdPartyAPI()

function RegisterUser(user){
 insert_in_users_table(user)
}

function CallThirdPartyAPI($url=null){
    $customers = get_all_customers();
    for($customer as $cust){
      store_in_customers_table();
      if($cust->response_has_next_page_url)
         CallThirdayPartyAPI($cust->next_page_url);
      else
         return false;
 }
}

现在你可以看到,如果我一次只有一个用户在我的网络应用程序中注册,这是可以的。但是,由于我有超过100个用户在我的网络应用程序中注册,这已成为一个问题,因为数据抓取需要20-30分钟才能完成,而我正在运行的作业队列一次只能有2个作业。所以基本上需要完成2个工作才能执行其他工作。

现在,我正在寻找一种能够提高系统效率的更好的解决方案。

非常感谢您的建议。

PS:

我正在通过主管排队工作

我在我的数据库中实现了一个只读副本。我在副本上读取时写入主数据库,以减少我的数据库的CPU使用率。

2 个答案:

答案 0 :(得分:0)

您使用的是sql数据库吗?您是否考虑过不使用像MongoDB这样的sql。我有一个类似的问题:使用curl获取大量数据。使用MongoDB它更高效,更快,因为它不使用sql,你可以将这些数据存储为json / array,无论你想要什么。 您也可以将MongoDB用于您的API,将sql数据库用于其他人。

答案 1 :(得分:0)

我建议您查看类似RabbitMQ(https://www.rabbitmq.com/)的内容并使用以下包:https://github.com/vladimir-yuldashev/laravel-queue-rabbitmq

您可以将其设置为可以让一些工作人员在后台收集数据的地方。我认为这也可能是一个更具可扩展性的解决方案。