netty asynchronous

netty 异步(asynchronous)与事件驱动(event-driven)

本章主要介绍java网络、介绍netty、netty核心模块

blocking i/o

传统的java版阻塞i/o编程,使用java原生API,要编写很多代码,并且这些api并没有经过装饰,所以比较臃肿。
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class BlockingIoExample {

/**
* Listing 1.1 Blocking I/O example
* */
public void serve(int portNumber) throws IOException {
ServerSocket serverSocket = new ServerSocket(portNumber);
Socket clientSocket = serverSocket.accept();
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out =
new PrintWriter(clientSocket.getOutputStream(), true);
String request, response;
while ((request = in.readLine()) != null) {
if ("Done".equals(request)) {
break;
}
response = processRequest(request);
out.println(response);
}
}

private String processRequest(String request){
return "Processed";
}

public static void main(String[] args) throws IOException {
new BlockingIoExample().serve(8090);
}
}

试想一下,如果client数量有多少个,就有多少个线程,那么对于资源是极度浪费的,包括栈内存、堆内存、以及系统间线程的切换,以及内存的使用

non-blocking java NIO

java是在2002年的JDK1.4支持NIO

简介

  • nio是使用setsockopt(),你自己可以配置sockets 读写请求,如果没数据这个将立即返回,如果有数据,则会堵塞。
  • 可以通过注册一系列的非阻塞sockets 使用系统的事件提示API去决定是否有准备读写的数据

nio: new i/o
nio:non-blocking i/o
oio: old blocking i/o

选择器 selector

selector 是一个实现nio的关键因素,它使用了事件通知的API来表示,在一系列sockets中,哪些准备好了可以进行i/o事件,这样一个线程就可以通过selector监控处理多个sockets,这个模型提供给了一个更好的资源管理。

  • 很多的连接可以通过一些线程去处理,因此可以减少堆内存溢出,减少多线程之间的切换
  • 在没有nio处理的时候,这些线程可以处理其他任务

尽管nio的出现使得编写应用简单的多,但是想要正确并且安全的编写

introduce netty

  • design

    多种传输格式使用统一的Api,包括阻塞与非阻塞。简单有力的线程模型、真正的无连接socket支持、链式逻辑部分重用支持

  • ease of use

    大量的javadoc,以及很多例子、不要求支持jdk1.6以上

  • performance

    更大的吞吐量、更小的时延远比传统的java Api好的多,并且通过pooling以及reuse减少资源的占用,最小的内存拷贝

  • robustness(强劲、结实)

    不会由于慢、快以及超负载的连接导致outofMemoryError ,在传统nio高速网上排除不公平的读写速率

  • Security

    完整的SSL/TLS 以及StartTLS支持。可用于限制环境、例如Applet 或者OSGI

  • Community-driven

    非常快的迭代版本

asynchronous and event-Driven

  • 异步

    顾名思义,当你调用一个方法时,可以立即给你回复、如果这个事件没有完成,也会给你立即回复,然后一会儿当事件完成时通知你

  • 事件驱动

    一个问题与一个答案总是挂钩的(事务的处理逻辑),无论何时何地(当事件发生的时候(问题触发、事务触发))他都可以响应(答案)

netty 核心部分

  • channels

    java NIO的基本构成,
    一个(实体,例如硬件设备、文件、网络socket)打开的连接,一个或多个不同的I/o操作,例如读和写
    可以认为channel 是一个进入、出去数据的载货车,当然,它可以关闭或打开,连接或断开

  • Callbacks

    回调方法,当事情发生了,会调用

  • Futures

    future主要用于另外一种方式来通知应用,当操作完成的时候,相当于异步操作结果的占位对象,它可能在未来某个时间节点完成,并且提供完成的结果

netty 中的ChannelFuture提供额外的方法允许我们注册一个或者多个ChannelFutureListener 实例,当任务完成的时候,会进行这些监听器方法的调用,每一个outbound(往外发的数据)异步操作都会返回一个Future

  • Event and handlers

    基于时间触发后的处理可以包括:日志、数据转换、流控、应用逻辑
    时间的类型:连接的active、inactive、数据读、用户事件、错误事件
    出站的事件类型:打开或者关闭远程连接,写数据并且刷新到socket中

坚持原创技术分享,您的支持将鼓励我继续创作!