Netty高并发

Java中,内存分为堆和栈以及字符串常量值等等,要从IO中读取数据,分为两个步骤:

(1)IO流中读取出来放到缓冲区,程序从缓冲区中读取,再放到堆中,此时数据就会被拷贝两次才能到达堆或者堆内存中。如果数据量很大,那么就会造成资源的浪费。
(2)Netty其实就是利用NIO中的零拷贝特性,当Netty需要接收数据或者传输数据的时候,就会新开辟一块堆内存,然后数据就直接通过IO读取到了新开辟的堆内存中,这样也就加快了数据传输的速度。

阻塞与非阻塞

线程在访问某一个资源的时候,该资源是否准备就绪的一种处理方式,如果说该资源当前没准备就绪,这时线程就会有两种处理方式:阻塞与非阻塞
    (1)阻塞:这个线程会一直持续等待这个资源就绪并处理完毕,直到响应返回一个结果,这个时候线程是一直阻塞状态,不可以去做任何事情
    (2)非阻塞:这个线程直接返回结果,不会持续等待这个资源处理完毕才响应,它会去请求别的资源。

同步与异步

 “同步与异步” 指的是访问数据的一种机制,类似于Ajax。
    (1)同步:整个处理过程顺序执行,当各个过程都执行完毕,并返回结果
    (2)异步:只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕,而是继续执行下面的流程,多个请求完成之后再逐一的通过异步形式通知。

 BIO

(1)同步式阻塞IO:Block IO,IO在进行读取的时候,这个线程是会被阻塞的,无法去做其他操作,传统简单,通信方式也是如此。并发处理能力非常低,线程之间访问资源通信的时候,耗时也非常久,所以会比较依赖于网速与带宽,JDK1.4之前均是如此。
(2)服务器会有一个专门的线程称之为Acceptor,专门用于负责监听来自客户端之间的请求,只要客户端与服务端有建立请求,此时客户端与服务端之间都会创建一个新的线程进行处理,这是一种典型的  一应一答的模式。随着客户端逐渐增多,两者之间会频繁的创建和频繁销毁线程,此时服务器端会有很大的压力,甚至宕机。
(3)改进之后则通过线程池来处理,这种方式也可以称之为伪异步IO。    

NIO

(1)同步非阻塞IO:New IO(Non-Block IO):JDK1.4之后。selector(其实就是一个线程,并且会主动轮询),也称之为多路复用器Buffer,它是一个缓冲区;Chanel,是一个双向通道。
(2)客户端在与服务端进行通信的时候就会使用到selector,两者要建立链接的时候,客户端到selector进行一个注册,注册完毕之后就会有一个chanel01,每一个客户端和selector建立连接之后都会有一个chanel,chanel是一个双向通道,可以进行一些相应数据的读写,这些数据的读写都会到Buffer缓冲区中
(3)通过selector注册并建立chanel通道就可以实现两者之间的通信,chanel的数据是一种非阻塞的读取,如果没有数据会直接跳过,不会同步等待数据。selector其实一个单线程,整体来讲,线程开销会非常小,光是一个selector就可以处理成千上万个客户端,客户端的增多不会影响它的性能,这也是与BIO的区别所在。
(4)chanel相当于是一个读取的工具,每一个客户端都可以理解为一个单独的chanel,每一个服务端会有一个selector,Buffer的数据会进行读取,数据被读完之后还是会存在Buffer中,不会因为数据被读取之后会被消息,String中的数据读完之后就没有了。 

Netty的三种线程模型

(1)Reactor线程模型:
        1)单线程模型:所有的IO操作都由同一个NIO线程处理,仅限于一些小型应用场景。但在高负载、高并发等情况下使用单线程肯定就不太合理,主要是因为NIO的一个线程同时要去处理成千上万的请求 的时候,在性能上会支撑不了,即便CPU负载100%,对于海量消息的处理,编码解码以及读取、发送消息等情况,依然满足不了。
        2)当NIO的线程负载过重之后,整体服务性能处理就会变慢,结果就是导致客户端在向服务端发起请求、链接就会超时,由于客户端一般都会有一种超时机制,反复地向服务端再次发起请求,此时就相当于陷入了死循环,更加加重了服务器负载。
(2)多线程模型:由一组NIO线程处理IO操作
(3)主从线程模型:一组线程池接受请求,一组线程池处理IO

简单的Netty服务端包含了五个步骤:

1)构建一对主从线程组
2)定义服务器启动类
3)为服务器设置Channel
4)设置处理从线程池的助手类初始化器
5)监听启动和关闭的服务器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值