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

4653 次点击
所在节点    问与答
49 条回复
gaius
2019-04-19 11:04:25 +08:00
1s 是网络问题还是对方处理的比较慢?
EdwardLee
2019-04-19 11:10:09 +08:00
@gaius 对方处理慢
EdwardLee
2019-04-19 11:14:53 +08:00
@gaius 请问您觉得在不减少 HTTP 请求次数的情况下,我这边还有什么更好的处理方式吗?
2kCS5c0b0ITXE5k2
2019-04-19 11:16:59 +08:00
@EdwardLee 感觉没啥办法。。1s 太慢了
peyppicp
2019-04-19 11:18:47 +08:00
ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor(100, 200,
10, TimeUnit.MINUTES, new ArrayBlockingQueue<>(100),
new NamedThreadFactory("trade-thread-", true), new ThreadPoolExecutor.CallerRunsPolicy());
然后你主线程 for 循环提交 runnable 或者 callable 任务就完事了。200 条线程应该可以了
EdwardLee
2019-04-19 11:22:46 +08:00
@emeab 是啊,太慢了,扎心
orangeade
2019-04-19 11:23:58 +08:00
换 golang 然后无脑开 goroutine ?
EdwardLee
2019-04-19 11:28:13 +08:00
@peyppicp 200 个线程会不会出问题啊?我试试。多线程不太会用,我是参照网上说的 IO 密集型任务应设置线程数为核心数的两倍,HTTP 请求应该属于网络 IO 吧。
EdwardLee
2019-04-19 11:29:36 +08:00
@orangeade 这...
xuwenping
2019-04-19 11:33:05 +08:00
对方能不能也使用多线程?
HuHui
2019-04-19 11:33:25 +08:00
让对方提供批量查询接口
peyppicp
2019-04-19 11:42:04 +08:00
@EdwardLee IO 密集型,线程数可以开到很高。CPU 密集型,线程数开到核心数。

如果对方接口允许,我觉得开 500 线程都行
honeycomb
2019-04-19 11:45:53 +08:00
@EdwardLee spring webflux ?
honeycomb
2019-04-19 11:47:23 +08:00
@EdwardLee 楼主遇到的情况是每个线程大部分时间在等回复,这个意义上再多开一些(三五百个)也成。
gz911122
2019-04-19 11:52:58 +08:00
用 netty 异步回调
这种性能主要是卡在网络 io 的情况下用异步再合适不过了
gz911122
2019-04-19 11:53:36 +08:00
@gz911122 或者就是楼上说的那样,往死里开线程
feiyuanqiu
2019-04-19 11:56:36 +08:00
对方一个请求都能处理一秒,开几百个线程的不一下把人家服务器打死?
问问看能不能提供批量查询接口吧,估计没戏
az422
2019-04-19 12:13:45 +08:00
异步 httpclient,如 Apache 那个 httpasync 或者 vertx.client (多个实例),并设置 keepalive (双方)
当然还是批量接口靠谱
EdwardLee
2019-04-19 12:25:19 +08:00
@xuwenping
@HuHui
@feiyuanqiu 就是坑在这,第三方暂时不可控,增加批量接口行不通
EdwardLee
2019-04-19 12:27:46 +08:00
@peyppicp 好的,谢谢,我先试试,有结果了我再来反馈

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

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

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

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

© 2021 V2EX