加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 湛江站长网 (https://www.0759zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

聊聊高性能服务器Server之Reactor模型

发布时间:2019-01-28 11:22:15 所属栏目:业界 来源:正经地扯淡
导读:副标题#e# 在这个充斥着云的时代,我们使用的软件可以说99%都是C/S架构的! 你发邮件用的Outlook,Foxmail等 你看视频用的优酷,土豆等 你写文档用的Office365,googleDoc,Evernote等 你浏览网页用的IE,Chrome等(B/S是特殊的C/S) C/S架构的软件带来的一个明显

虽然上面说到NIO一个线程就可以支持所有的IO处理。但是瓶颈也是显而易见的!我们看一个客户端的情况,如果这个客户端多次进行请求,如果在Handler中的处理速度较慢,那么后续的客户端请求都会被积压,导致响应变慢!所以引入了Reactor多线程模型!

Reactor多线程模型

聊聊高性能服务器Server之Reactor模型

Reactor多线程模型就是将Handler中的IO操作和非IO操作分开,操作IO的线程称为IO线程,非IO操作的线程称为工作线程!这样的话,客户端的请求会直接被丢到线程池中,客户端发送请求就不会堵塞!

但是当用户进一步增加的时候,Reactor会出现瓶颈!因为Reactor既要处理IO操作请求,又要响应连接请求!为了分担Reactor的负担,所以引入了主从Reactor模型!

主从Reactor模型

聊聊高性能服务器Server之Reactor模型

主Reactor用于响应连接请求,从Reactor用于处理IO操作请求!

Netty

Netty是一个高性能NIO框架,其是对Reactor模型的一个实现!

  • Netty客户端代码
  1. EventLoopGroup workerGroup = new NioEventLoopGroup(); 
  2. try { 
  3.     Bootstrap b = new Bootstrap(); 
  4.     b.group(workerGroup); 
  5.     b.channel(NioSocketChannel.class); 
  6.     b.option(ChannelOption.SO_KEEPALIVE, true); 
  7.     b.handler(new ChannelInitializer<SocketChannel>() { 
  8.         @Override 
  9.         public void initChannel(SocketChannel ch) throws Exception { 
  10.             ch.pipeline().addLast(new TimeClientHandler()); 
  11.         } 
  12.     }); 
  13.  
  14.     ChannelFuture f = b.connect(host, port).sync(); 
  15.  
  16.     f.channel().closeFuture().sync(); 
  17. } finally { 
  18.     workerGroup.shutdownGracefully(); 
  • Netty Client Handler
  1. public class TimeClientHandler extends ChannelInboundHandlerAdapter { 
  2.     @Override 
  3.     public void channelRead(ChannelHandlerContext ctx, Object msg) { 
  4.         ByteBuf m = (ByteBuf) msg; 
  5.         try { 
  6.             long currentTimeMillis = 
  7.                 (m.readUnsignedInt() - 2208988800L) * 1000L; 
  8.             System.out.println(new Date(currentTimeMillis)); 
  9.             ctx.close(); 
  10.         } finally { 
  11.             m.release(); 
  12.         } 
  13.     } 
  14.  
  15.     @Override 
  16.     public void exceptionCaught(ChannelHandlerContext ctx, 
  17.                 Throwable cause) { 
  18.         cause.printStackTrace(); 
  19.         ctx.close(); 
  20.     } 
  • Netty服务端代码
  1. EventLoopGroup bossGroup = new NioEventLoopGroup(); 
  2. EventLoopGroup workerGroup = new NioEventLoopGroup(); 
  3. try { 
  4.     ServerBootstrap b = new ServerBootstrap(); 
  5.     b.group(bossGroup, workerGroup) 
  6.      .channel(NioServerSocketChannel.class) 
  7.      .childHandler(new ChannelInitializer<SocketChannel>() { 
  8.          @Override 
  9.          public void initChannel(SocketChannel ch) throws Exception { 
  10.              ch.pipeline().addLast(new TimeServerHandler()); 
  11.          } 
  12.      }) 
  13.      .option(ChannelOption.SO_BACKLOG, 128)   
  14.      .childOption(ChannelOption.SO_KEEPALIVE, true); 
  15.     // Bind and start to accept incoming connections. 
  16.     ChannelFuture f = b.bind(port).sync(); 
  17.     f.channel().closeFuture().sync(); 
  18. } finally { 
  19.     workerGroup.shutdownGracefully(); 
  20.     bossGroup.shutdownGracefully(); 
  • Netty Server Handler
  1. public class TimeServerHandler extends ChannelInboundHandlerAdapter { 
  2.  
  3.     @Override 
  4.     public void channelActive(final ChannelHandlerContext ctx) { 
  5.         final ByteBuf time = ctx.alloc().buffer(4); 
  6.         time.writeInt((int) 
  7.             (System.currentTimeMillis() / 1000L + 2208988800L)); 
  8.  
  9.         final ChannelFuture f = ctx.writeAndFlush(time); 
  10.         f.addListener(new ChannelFutureListener() { 
  11.             @Override 
  12.             public void operationComplete(ChannelFuture future) { 
  13.                 assert f == future; 
  14.                 ctx.close(); 
  15.             } 
  16.         }); 
  17.     } 
  18.  
  19.     @Override 
  20.     public void exceptionCaught(ChannelHandlerContext ctx, 
  21.         Throwable cause) { 
  22.         cause.printStackTrace(); 
  23.         ctx.close(); 
  24.     } 

(编辑:PHP编程网 - 湛江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!