netty
2016-02-25 15:56
197 查看
如果只有1个服务器线程来处理所有的客户端请求,在高并发的情况下,处理速度慢,这回导致大量的客户端超时,超时后再进行重连,这会加重线程的负载。导致大量消息挤压和超时。
一旦线程造成死循环,那么回导致通信不可再用。
这里就提到多线程的问题了。一般会 服务器监听线程和io线程分开。。
串行处理,避免了并发问题。
http://www.infoq.com/cn/articles/netty-threading-model/
以下是netty多线程的流程图
分别有服务器监听线程池和io线程池
netty服务器端启动
Acceptor 线程绑定监听端口,启动服务器。
上面的group()就是服务器监听线程池,next()是从线程池中取出一个可用线程.
服务器Channel创建后,将其注册到多路复用器上,用于接收客户端的连接
如果监听到客户端的连接,就创建SocketChannel连接,重新注册到io的线程池中
一旦线程造成死循环,那么回导致通信不可再用。
这里就提到多线程的问题了。一般会 服务器监听线程和io线程分开。。
串行处理,避免了并发问题。
http://www.infoq.com/cn/articles/netty-threading-model/
以下是netty多线程的流程图
分别有服务器监听线程池和io线程池
netty服务器端启动
start() { ServerBootstrap bootstrap = new ServerBootstrap() EventLoopGroup workerGroup= new NioEventLoopGroup(1);//服务器监听线程池,负责处理客户端的连接请求的,如果只有一个端口需要监听,那么线程数设置为1. EventLoopGroup workerGroup = new NioEventLoopGroup();//io线程池 Class<? extends ServerChannel> channelClass = NioServerSocketChannel.class; SocketAddress localAddress = new InetSocketAddress(port); bootstrap.group(this.bossGroup, this.workerGroup) .channel(this.channelClass) .option(ChannelOption.TCP_NODELAY, false) .option(ChannelOption.SO_KEEPALIVE, true) .localAddress(localAddress) .childHandler(channelHandler()); } protected ChannelHandler channelHandler() { return new ChannelInitializer<Channel>() { protected void initChannel(Channel ch) throws Exception { SimpleEncrypt encrypt = new SimpleEncrypt(); ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(trafficShapingHandler); pipeline.addLast(new PortUnificationServerHandler(idleSeconds, handler, encrypt)); } }; }
Acceptor 线程绑定监听端口,启动服务器。
Channel createChannel() { EventLoop bossLoop = group().next(); //从服务器监听线程池中取出一个 return channelFactory().newChannel(bossLoop , workerGroup); }
上面的group()就是服务器监听线程池,next()是从线程池中取出一个可用线程.
public EventExecutor next() { return bossGroup[Math.abs(bossIndex.getAndIncrement()%bossGroup.length)]; }
服务器Channel创建后,将其注册到多路复用器上,用于接收客户端的连接
如果监听到客户端的连接,就创建SocketChannel连接,重新注册到io的线程池中
相关文章推荐
- 用NSURLSe 4000 ssionDownloadTask断点续传、后台下载、锁屏下载
- python根据nagios配置文件将监控的服务联系人等信息导出到excel表格
- mycat 离散分片(程序指定分区的分片)
- 压缩感知(2)
- MyEclipse 2016 CI 0发布
- 五大常用算法之一:分治算法
- ejabberd 学习网站
- UltraWebGrid中列固定效果
- epoll详解
- mysql中的索引
- BCB使用管道
- CSS3制作各种形状图像(转)
- Python27 with Oracle Sample(Windows OS)
- Java多线程总结
- java 异常处理方式
- yii框架
- 访问控制与继承
- Divide and Conquer
- 遍历Map集合的两种方式
- 《Linux操作系统分析》笔记1