Netty进阶之路-I/O线程和业务线程分离

Netty进阶之路-I/O线程和业务线程分离

  • 前言
  • 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线程中执行的。

业务线程:处理比较耗时的业务。

解决思路

既然我们已经找到了可以优化的点,那我们就可以开始进行优化了。

  1. 第一中方法是在添加 pipeline 中的 handler 时候,添加一个Netty提供的线程池
  2. 在ChannelHandler的回调方法中,使用自己定义的业务线程池,这样就可以实现异步调用。

后面的内容我将来分析一下这两种方法,并且记录一下自己踩的坑

你可能感兴趣的:(Netty,RPC)