后台需要调用多个不同的api获取数据,想采用多线程的方式,同时获取,以提高效率。有点担心在访问量大的时候,服务器会遭不住,问下有这方面经验的大神,这个解决方案靠谱么?还有其他更好地解决方案么!
应该用任务(Task)去做,由系统为你处理异步问题,而不是自己去管理线程。
即使用线程,也应该开固定数量的线程,保存到Application里,由你管理任务队列,分配任务。
如果你无法确定你的线程什么时候关闭,又无法确定有多少这样的请求,那你这是浪费资源,问题也是不可预知的。
就我的认知,如果你在一个HttpRequest中发起新线程,并且还要等待结果的话,那你这是多余的,因为asp.net本身就是多并发的,根本不在乎你这个请求阻塞,你可以尽情地阻塞这个请求。
现在希望的是在一个请求同时做多件事情
@chenhp: 同样适用
高并发情况下只能这么做,fork 线程,由OS来控制线程;一般CPU不是问题,有问题的是内存和Disk IO
内存应该够了 不写入磁盘 关键是 对IIS影响大么
这个方案靠谱,异步io能提高不少吞吐量。
你做过类似么
@chenhp: 自然是实践过,才告诉你
@calvinK: 访问量大的时候,性能影响大不
@chenhp:你是调用web api,性能在网络io,await tasks 很合适你。
所以,你觉得呢。明白原理才行
@calvinK: 线程开多了,内存CPU开销怕遭不住
@chenhp: 先实践test起来吧,靠猜是没有结果的
@calvinK: 我也想测试下,没那机会
@chenhp: 自己搭2台服务器,压测一下就完事了。。。没有机会,创造机会也要上嘛
@calvinK: 嘎嘎
最好做下评估,比如每秒可能会有多少请求及这种请求如果要并行需要耗时多少。
1.如果请求数不大,那么你直接丢线程池去处理就完了。
2.请求数较大,那么你可以将任务发到后续服务单独处理。
3.请求数很大,那么你可以将任务发送到队列,由后续服务来处理。
不太建议你直接开启一定量的线程去处理数量未知的任务,这样可能会导致资源得不到充分利用甚至更糟的请求积压。
担心API扛不住?
api 可能扛不住,这边的服务器也扛不住