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 双核

4649 次点击
所在节点    问与答
49 条回复
rrfeng
2019-04-19 12:30:11 +08:00
你算一下对方最多能提供每秒几个
然后就写自己的并发量

取决于对方而不是自己
EdwardLee
2019-04-19 12:30:45 +08:00
@honeycomb 是的,瓶颈就卡在请求等待这里,我先试试多开线程看下结果
EdwardLee
2019-04-19 12:32:12 +08:00
@gz911122
@az422 异步的方式是不是也类似于多线程。需要取决于第三方接口的承受能力?
lhx2008
2019-04-19 12:51:03 +08:00
异步可以一下打 13 万条请求出去,对方回数据,操作系统会自动保存,然后程序可以慢慢拿返回结果。但是对方的服务器是妥妥的挂了。。

所以先压测一下,看看同时打多少条出去
MoHen9
2019-04-19 13:00:05 +08:00
数据量有多大,返回怎么那么慢?还有为什么不能自定义获取条数?
CoSpLi
2019-04-19 13:12:37 +08:00
对接的蛋疼事儿,并发量只能看对方接口了。。之前也碰到过,并发请求多了被对方拉黑了。。。
az422
2019-04-19 13:18:33 +08:00
@EdwardLee 是取决于对方承受能力,但跟多线程本质不同,多线程本质会阻塞的,异步不会,在对方承受能力下能增大你这边的吞吐量。
`我设计的是使用多线程每 3w 条作为一个任务进行请求,目前的消耗时间大概能减少到 16 小时左右` 像你这样设计,在对方 1s 内没有返回内你的线程是被阻塞不能干其他事的,完全浪费了性能。130000/(16*3600)约 2.25 ,相当于你 1s 才 3 个请求?要是对方能力真这样当我没说。。。 假设对方最大 qps=10000, 你可以开 10000 线程, (但是你单 CPU 双核 = =), 这种情况下还是用异步 IO 能压榨对方性能
misaka19000
2019-04-19 13:22:45 +08:00
异步操作
33and66
2019-04-19 13:58:08 +08:00
这种数据 建议生成 txt 文件 然后通过文件内容建议直接做
方法很土 但是很实用
我们现在和银行每天上千万的数据对账就是这么干
liujan
2019-04-19 15:37:55 +08:00
如果是对方数据加工处理比较慢的话,是不是可以先让他每天 定时离线处理好了数据,然后你再过去拉处理后的数据?
whp1473
2019-04-19 15:51:58 +08:00
每天根据你的数据定时获取对方数据,将获取的数据保存起来,用户查询时查自己库,然后缓存起来。
mritd
2019-04-19 15:57:14 +08:00
可能这个回答不对路,但是如果这种需要大并发处理的我真的会上 golang 写,因为这样基本不需要带脑子....
xdlucky
2019-04-19 15:57:40 +08:00
联系对方直接买数据
xzg
2019-04-19 17:44:51 +08:00
看你响应结果是否需要,不需要就搞异步多线程。如果需要响应结果那就只能等待 1s,尝试开启多线程,实在不行部署多个服务并行发
Yourshell
2019-04-19 20:39:07 +08:00
寄 U 盘吧
EdwardLee
2019-04-22 09:49:17 +08:00
@rrfeng
@lhx2008 好的,感谢建议
EdwardLee
2019-04-22 09:52:26 +08:00
@MoHen9 数据量不算大,从一条到两三千条 JSON 字符串不等,应该是数据需要处理比较慢吧
EdwardLee
2019-04-22 09:52:52 +08:00
@CoSpLi 拉黑,这么过分的吗,Hahh
EdwardLee
2019-04-22 09:55:59 +08:00
@az422 目前使用 30 个线程,处理时间已经减少到 3.5 小时,偶尔会有 HTTP 请求超时的情况出现。我再观察一下,感谢您的建议
EdwardLee
2019-04-22 09:56:52 +08:00
@misaka19000 很多都是建议异步操作的,没怎么了解过,我试试看。感谢建议

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

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

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

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

© 2021 V2EX