【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”
小弟正在做一个大批量的联机交易系统, 对netty正在熟悉中.
由于一直认为,使用cachedThreadPool不方便控制大量客户端恶意并发连接的风险,给我一种不可控的感觉,所以在启动NIO server时,我一直使用fixedThreadPool方式
new NioServerSocketChannelFactory( Executors.newSingleThreadExecutor(), Executors.newFixedThreadPool(5))
我一直认为,是5个worker线程负责并行处理客户端的连接请求,一次请求处理完毕后就丢弃本次连接(不是关闭),换下一个连接请求. 但是当我并发连接超过5个tcp连接时,只要前面5个连接不关闭(这5个连接可以执行任何输入,只要不关闭),后续的新增连接虽然能连接到,但是无法到达后续的具体handler进行处理,好像被worker线程池阻塞住了.我想问有没有什么方法能够不使用cachedThreadPool作为worker线程池,却又能够并发的处理大量客户端连接,话说SOCKET NIO不就是以这个(处理大量并发连接)为新特性的吗? 我总是感觉这样风险太大.假如客户的客户端发生bug,一直不断死循环来连接,连上又不关闭,那我的服务器性能岂不是要受到巨大影响吗?
难道各位的生产环境都是用cachedThreadPool方式吗?如果是这样的话,那还不如回到OIO的时代,通过自己创建的可控线程池处理,还更好控制一些.
网上说的用connectionTimeout和Server的backlog参数解决方案,我都觉得不是很有说服力
谢谢!
LZ所说的情况应不会发生的,除非你在handler里写了死循环。
另外可以设定timeout时间,让超时的连接释放调
nio的特性就保证了,不会因为某几个连接有问题而影响到整个服务器
楼主可以放心使用
引用来自“JavaGG”的答案
LZ所说的情况应不会发生的,除非你在handler里写了死循环。
另外可以设定timeout时间,让超时的连接释放调
nio的特性就保证了,不会因为某几个连接有问题而影响到整个服务器
楼主可以放心使用
其实我只是连接,并没有要求handler做什么操作,前2个connect也并没有发出消息,只是连接上了,也没有走到handler里面,但就是这样,就阻塞了第三个连接的写操作
下面是一些日志,前两个连接都是先open,再bound,最后connect,我没有关闭,随后发起第三个connect并且发出一些信息,netty就在handler里面无法响应,只有关闭前面的connection 才能进去,感觉就是被blocked一样.
引用来自“谢远熙”的答案