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的回调方法中,使用自己定义的业务线程池,这样就可以实现异步调用。
后面的内容我将来分析一下这两种方法,并且记录一下自己踩的坑
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/15325.html