网站采集接口,每分钟差不多有100个左右得接口要采集

网站是个数据采集api系统
数据都是从别人的网站采集过来的,大概有100个三方api接口
为了保证数据快速获取,每分钟都要请求一次三方api接口,每次都要请求100个左右CURL
每次采集第三方接口的时候服务器CPU基本都是100%,搞得我头大,同时还有别人采集我的数据

采集三方api逻辑大概就是采集到数据然后 in判断数据库是否存在,如果不存在就批量入库,如果存在就更新指定字段

开始的时候没考虑那么多三方api,现在想分表,但是业务逻辑不太允许,现在不知道怎么优化了,有合适的方案么,数据量大概有500W+,超过500W我就会手动清理下
用的宝塔NGINX + mysql5.6 + php7.3 所有配置都是默认的,没改过东西
都是自学的,实在是不知道怎么优化了

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 13

我们公司也有类似的业务,环境貌似和你的一样

关键点就是api任务平均分发执行,不要每分钟同一时间去执行。

比如每秒执行一个任务,等100个任务执行完了,再从头开始执行第一个任务,这样 100个任务就平均分给每秒了,等于是100秒更新完所有任务。服务器压力会少很多。

然后就是加几台配置小的服务器,来负载任务,比如A服务器来执行 1-50条任务,B服务器执行 51-100条任务,这样也等于是缓解压力了

数据库方面A服务器采集回来在A中的mysql 去缓存,B服务器采集的在B中缓存,最后由主服务器只需要去定时同步合并AB服务器的数据库就行了

目前公司是这样做的,希望对你有帮助

1年前 评论

我们公司也有类似的业务,环境貌似和你的一样

关键点就是api任务平均分发执行,不要每分钟同一时间去执行。

比如每秒执行一个任务,等100个任务执行完了,再从头开始执行第一个任务,这样 100个任务就平均分给每秒了,等于是100秒更新完所有任务。服务器压力会少很多。

然后就是加几台配置小的服务器,来负载任务,比如A服务器来执行 1-50条任务,B服务器执行 51-100条任务,这样也等于是缓解压力了

数据库方面A服务器采集回来在A中的mysql 去缓存,B服务器采集的在B中缓存,最后由主服务器只需要去定时同步合并AB服务器的数据库就行了

目前公司是这样做的,希望对你有帮助

1年前 评论

加服务器就完事了

1年前 评论

这种应该单独的服务器去跑吧,避免影响主业务

1年前 评论
skarner
  1. 简单点就用1楼说的,把定时任务均匀的分配到一分钟,不要同时执行(个人觉得成本最低)
  2. 可以用队列,这样可以控制进程数量,这样可以降低服务器峰值的资源占用(个人觉得方案最优)
1年前 评论

使用laravel导致cpu满很正常,可以把opencache开起来

你请求别人之后把数据丢到队列里执行异步执行

500W数据的话可以写个删除脚本,然后创建数据增加redis的分布式锁,删除脚本在数据删除的时候跟着删除锁,每次单条循环判断redis锁,推到数组里批量新增数据

1年前 评论

数据采集,网站对于频繁请求会对IP进行封禁,请问大家是如何解决的? 是使用的 随机切换IP(DAILI) 去请求吗? 有推荐的不?

1年前 评论
jfpl 1年前
gyp719 (作者) 1年前
jfpl 1年前
jfpl 1年前
gyp719 (作者) 1年前
jfpl 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!