我正在构建一个具有此过程的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使用率。
答案 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
您可以将其设置为可以让一些工作人员在后台收集数据的地方。我认为这也可能是一个更具可扩展性的解决方案。