17 | 异步RPC:压榨单机吞吐量 https://time.geekbang.org/column/article/216803
当然不会在一个,对二进制消息数据包拆解包的处理是一定要在处理网络 IO 的线程中,如果网络通信框架使用的是 Netty 框架,那么对二进制包的处理是在 IO 线程中,而解码与反序列化的过程也往往在 IO 线程中处理,那服务端的业务逻辑呢?也应该在 IO 线程中处理吗?原则上是不应该的,业务逻辑应该交给专门的业务线程池处理,以防止由于业务逻辑处理得过慢而影响到网络 IO 的处理。
这时问题就来了,我们配置的业务线程池的线程数都是有限制的,在我运营 RPC 的经验中,业务线程池的线程数一般只会配置到 200,因为在大多数情况下线程数配置到 200 还不够用就说明业务逻辑该优化了。那么如果碰到特殊的业务场景呢?让配置的业务线程池完全打满了,比如这样一个场景。
我这里启动一个服务,业务逻辑处理得就是比较慢,当访问量逐渐变大时,业务线程池很容易就被打满了,吞吐量很不理想,并且这时 CPU 的利用率也很低。
对于这个问题,你有没有想到什么解决办法呢?是不是会马上想到调大业务线程池的线程数?那这样可以吗?有没有更好的解决方式呢?