本文共 896 字,大约阅读时间需要 2 分钟。
Netty是高性能的异步非阻塞NIO框架!
下面先来理解一下两组关键的概念。
同步和异步
拿方法调用来说,同步是指调用一个方法能够在方法结束时立即得到方法的结果,异步就是方法调用时没有返回结果,由另外的线程去做方法中的事情,当前线程可以去做其他的事情。异步调用的结果会通过中间状态改变或者回调函数等来通知。
拿一个生活的例子来说,同步就好比你去小区附近的一个4S点修车,老板在帮你修车,你一直在旁边等老板修好位置,可能是等1个小时,也有可能是等2天;而异步就好比你去修车,老板说修好了给你打电话来取车,你会可以回家等了,老板通过电话的形式来通知到你。
阻塞和非阻塞
用一个队列来说,当你需要从队列中获取一个元素,如果当前队列为空,那么线程会一直在当前方法处于等待,线程会挂起。非阻塞则不会挂起!侧重点在于线程是否会挂起。
基础架构模型
在这个基础架构模型中,创建了两个线程池,这两个线程池分别是boss线程池和worker线程池。在网络中,我们知道,一个连接过来,先要建立连接,然后再发送和接收信息。服务器开启时,boss线程池负责注册ServerSocketChannel到当前selector,事件为OP_ACCEPT连接事件,专门负责客户端请求的接收连接工作。boss线程池对于连接进来的SocketChannel,会交给worker线程池处理,worker线程池会将这个注册SocketChannel到selector,事件为OP_READ事件,专门处理消息的读取工作。
一般情况下,boss线程池中线程数量较少,worker线程池中线程数量较多。
我们可以把这样一个基础框架模型比喻成饭店吃饭,一般来说,客户去饭店吃饭,饭店有门口处的服务员接待客户到饭桌上,把点餐、倒水、上菜等工作交给大厅服务员。门口服务员接待了客户到饭桌上,就继续回到门口接待下一个要来吃饭的客户。而大厅服务员不可能是每一桌分配一个服务员,因为这样比较浪费,而且并不是时时刻刻每一桌都会有事情叫服务员帮忙,所以一个大厅服务员可以服务多个饭桌的客户,只要客户叫到,服务员就来帮忙。这里类似于selector的作用。