Java 如何设计频繁 HTTP 请求(至少 13w 次)的统计程序?

2019-04-19 10:51:47 +08:00
 EdwardLee

1.场景描述   
  现有基础数据 13w 条,需循环通过第三方 HTTP 接口获取历史数据进行分析统计,意味着要发生 13w 次 HTTP 请求。接口请求速度还比较慢,平均每次请求需要 1s,如果在单线程的情况下至少需要 36 个小时,目前我设计的是使用多线程每 3w 条作为一个任务进行请求,目前的消耗时间大概能减少到 16 小时左右,但效率还是太低了,有没有大佬有更好的解决方案的?求 Help!!

2.部署环境   
系统:CentOS7

配置:单 CPU 双核

4538 次点击
所在节点    问与答
49 条回复
EdwardLee
2019-04-22 10:00:46 +08:00
@33and66 如果有现成的数据文件是可行,但是在第三方不改动的情况下,暂时也没有其他方式可以获取数据来源,还是得调接口请求
EdwardLee
2019-04-22 10:02:11 +08:00
@liujan 第三方那边不可控,还是得我这边想办法优化一下。感谢建议
EdwardLee
2019-04-22 10:07:06 +08:00
@whp1473 您建议的这种方式可能不太适合我这个场景,应该适合那种一次性响应数据量比较大的情况。目前接口并非因为响应数据量大而缓慢,所以即使定时获取也无法迈过多次 HTTP 请求这道坎,还是得想办法提高 IO 利用率
EdwardLee
2019-04-22 10:08:43 +08:00
@mritd 好多大佬说 golang 的,不带脑子都行,那么强大的吗,hah
mritd
2019-04-22 10:52:44 +08:00
@EdwardLee #44 怎么说呢,就是相对于 java 开并发 心智负担小得多,基本上不用带脑子 😂
EdwardLee
2019-04-22 10:58:14 +08:00
@Yourshell 每天寄 U 盘也挺累的,手动狗头🐶
EdwardLee
2019-04-22 11:00:11 +08:00
@xzg 业务场景是不需要实时响应的,异步应该是可行的。暂时不太了解异步,尝试了下多线程,效果还是很明显的,已经能够满足需求了。
EdwardLee
2019-04-22 11:17:22 +08:00
目前情况:
1. 单线程:耗时约 36 小时,请求稳定(效率极低)
2. 分批 3w 数据 /线程,共 5 个线程:耗时约 16 小时,请求较稳定 (效率略低)
3. 固定 30 个线程:耗时约 3.5 小时,偶有 HTTP 请求超时(效率已经能够满足,需解决部分超时异常)
4. 固定 100 个线程:测试过程因请求超时案例过多,暂不予考虑,所以未计耗时

总结:
我的业务场景属于网络 IO 密集型任务,时间基本都消耗在等待 HTTP 请求的响应,所以多线程请求还是效果很明显的,至于固定多少线程效率最高我无法确定,纯手工尝试😂,有科学测量方式的小伙伴麻烦指教一下。30 线程数已经能够满足业务需求,暂以项目交付为先,关于各位 V 友的建议比如异步请求之类的有空的时候再尝试。

在此感谢各位 V 友的不吝赐教
CoSpLi
2019-04-22 11:21:43 +08:00
@EdwardLee 被当做恶意爬虫了。那会儿写还真没考虑过这么多

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/556698

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX