Netty进阶之路-I/O线程和业务线程分离
前言
之前我们对于Netty的客户端进行了优化,现在我们来看看服务端有哪些地方可以优化。
Netty的线程模型
目前服务端我们通常用的就是主从Reactor多线程模型
一个线程组用于接收客户端的连接请求
一个线程组用于处理I/O相关的读写或者执行系统Task和定时任务
//netty主从线程模型(建立2个线程组) 一个用于网络读写 一个用于和客户端进行连接
final EventLoopGroup bossGroup=new NioEventLoopGroup(2);
final EventLoopGroup workerGroup=new NioEventLoopGroup(4);
//final EventExecutorGroup businessGroup = new DefaultEventExecutorGroup(4);
try {
//启动辅助类 用于配置各种参数
ServerBootstrap b=new ServerBootstrap();
b.group(bossGroup,workerGroup)
I/O线程和业务线程
对于RPC框架来说,客户端调用服务,服务端的操作基本都是修改数据库数据或者获取数据库数据。对于数据库的操作我们可以认为是比较耗时的,所以在Netty的I/O线程中我们不适合处理这些操作。
I/O线程:在我看来对于服务端来说Netty的I/O线程是处理客户端的连接和处理数据读写的(根据主从Reactor多线程模型,已经将网络读写 和客户端进行连接分开),对于耗时的业务逻辑来说是不适合也在I/O线程中执行的。
业务线程:处理比较耗时的业务。
解决思路
既然我们已经找到了可以优化的点,那我们就可以开始进行优化了。
- 第一中方法是在添加 pipeline 中的 handler 时候,添加一个Netty提供的线程池
- 在ChannelHandler的回调方法中,使用自己定义的业务线程池,这样就可以实现异步调用。
后面的内容我将来分析一下这两种方法,并且记录一下自己踩的坑