关于rpc调用的问题
来源:18-9 使用连接池链接爬虫集群

linzexin
2020-05-05
老师您好, 04:01这里的代码, Call一个远程服务, 这里要等待远程服务处理返回对吗?
如果要, 那么如果并发量很高, 例如设置的是100个goroutine在处理, 现在有1000个request同时过来, 那么后面的900个request是不是会因为Call导致要在scheduler的队列里等待一下?
那么,如果是一个比较耗时的远程调用, request卡在排队那里了, 好像瓶颈就是goroutine的数量, 远程服务进程的增加并不能提高爬虫的速度, 反而还多了Call调用产生的网络开销?
不知道我的理解对不对, 遇到这种情况怎么处理?用rpc的异步调用?
写回答
1回答
-
ccmouse
2020-05-08
goroutine你在用同步的形式写代码,但其实有异步的性能。这里的确是Call的时候是要等待处理返回的,但是在等待的时候,系统会切到其它goroutine去运行。而且有可能这个“其它goroutine"被安排到同一个底层操作系统线程上运行,这就是所谓“异步的性能“。
不过,如果的确这个Call比较耗时,而上游请求却来的太快,那必然还是会造成请求在这里排队。goroutine的数量我们认为不会是一个瓶颈,甚至百万级都有可能接受,而瓶颈一般会是goroutine过多以后对内存的开销。真的发生上游请求过来太快导致队列过大的话,我们可以考虑上上游请求慢一点,可以让他发的慢一点,也可以我们收的慢一点,收的慢了通过channel过来的请求就会卡住。
最后,关于增加远程服务器数量的问题,一般来说远程服务器并发请求QPS越高,性能越差。基于这个考虑,增加远程服务器数量是有用的。
00
相似问题