您现在的位置是:亿华云 > IT科技类资讯
一个公式看懂:为什么Dubbo线程池会打满
亿华云2025-10-09 03:52:26【IT科技类资讯】1人已围观
简介本文转载自微信公众号「JAVA前线」,作者IT徐胖子 。转载本文请联系JAVA前线公众号。0 文章概述大家可能都遇到过DUBBO线程池打满这个问题,刚开始遇到这个问题可能会比较慌,常见方案可能就是重启
本文转载自微信公众号「JAVA前线」,式看什作者IT徐胖子 。懂为打满转载本文请联系JAVA前线公众号。线程
0 文章概述
大家可能都遇到过DUBBO线程池打满这个问题,式看什刚开始遇到这个问题可能会比较慌,懂为打满常见方案可能就是线程重启服务,但也不知道重启是式看什否可以解决。我认为重启不仅不能解决问题,源码库懂为打满甚至有可能加剧问题,线程这是式看什为什么呢?本文我们就一起分析DUBBO线程池打满这个问题。
1 基础知识
1.1 DUBBO线程模型
1.1.1 基本概念
DUBBO底层网络通信采用Netty框架,懂为打满我们编写一个Netty服务端进行观察:
public class NettyServer { public static void main(String[] args) throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(8); try { ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup,线程 workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.SO_KEEPALIVE, true) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new NettyServerHandler()); } }); ChannelFuture channelFuture = bootstrap.bind(7777).sync(); System.out.println("服务端准备就绪"); channelFuture.channel().closeFuture().sync(); } catch (Exception ex) { System.out.println(ex.getMessage()); } finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } }BossGroup线程组只有一个线程处理客户端连接请求,连接完成后将完成三次握手的式看什SocketChannel连接分发给WorkerGroup处理读写请求,这两个线程组被称为「IO线程」。懂为打满
我们再引出「业务线程」这个概念。b2b信息网线程服务生产者接收到请求后,如果处理逻辑可以快速处理完成,那么可以直接放在IO线程处理,从而减少线程池调度与上下文切换。但是如果处理逻辑非常耗时,或者会发起新IO请求例如查询数据库,那么必须派发到业务线程池处理。
DUBBO提供了多种线程模型,源码下载选择线程模型需要在配置文件指定dispatcher属性:
<dubbo:protocol name="dubbo" dispatcher="all" /> <dubbo:protocol name="dubbo" dispatcher="direct" /> <dubbo:protocol name="dubbo" dispatcher="message" /> <dubbo:protocol name="dubbo" dispatcher="execution" /> <dubbo:protocol name="dubbo" dispatcher="connection" />很赞哦!(2341)