Netty 异步和数据驱动

1 、 netty 是什么?
netty 是一个利用java 的高级网络的能力,隐藏其背后的复杂而提供易于使的用的API的客户端/服务器框架。 提供了高性能和扩展性。

2 早起的java.net 的网络开发 —— blocking (阻塞)


Netty 异步和数据驱动_第1张图片
java 的阻塞式网络

1)ServerSocket 创建病监听端口的连接请求
2)accept 调用阻塞,知道一个连接被建立了。返回一个新的socket来处理客户端和服务器的交互
3)流被创建用于处理socket的输入和输出数据。ButterReader读取从字符输入流里面的文本。printWriter 打印格式化展示的对象读到本文输出流。
4)readline阻塞 处理循环开始,读取字符串直到最后换行或者输入终止。
5)如果客户端发送的是Done处理循环退出。
6)执行方法处理请求,返回服务器的相应。
7)响应发回客户端
8)处理循环继续。

1)可见:这段代码限制每一次都是处理一个连接,为了实现多个并行的客户端我们需要一个新的Thread 给每个新的客户端Socket(这里就是需要使用到多线程)。【这样必须支持大量的同步,长连接】在任何时候多线程可能处于休眠的状态,等待输入或输出数据,资源就造成了浪费,性能上就产生了负面影响。
2)原生的socket库也是支持非阻塞的I/O 的功能。这样子我们就能够确定任何一个socket中是否有数据准备读或写。可以设置标志在读写如果没有数据立即返回。也即是一个阻塞被调用了之后就会一直阻塞,,迟到处理完成。 会更加复杂。

3
NIO :Nonblocking I/O (非阻塞I/O);
OIO:Old Input /Output 阻塞I/O 。
OIO 示意图:

Netty 异步和数据驱动_第2张图片
OIO通过多线程来进行处理的示意图

必须扩大到处理多个连接,给每个连接创建一个线程,这些连接是空闲的,这种方法的可扩展性将是受限于可以在JVM中创建的线程数。
连接的数目比较少(可以接受),并发连接超过100000的时候,context-switching(上下文切换)开销将会明显的。此外,每个线程都有一个默认的堆栈内存和操作系统需要处理100000个或更多的并发连接资源。这样就不行了。

4
SELECTOR 是java实现无阻塞I/O实现的关键。


Netty 异步和数据驱动_第3张图片
Selector的基本示意图

Selector 最终决定哪一组注册的socket准备执行I/O。
通过通知,一个线程可以同时处理多个并发连接。(一个Selector由一个线程通常处理,但具体实施可以使用多个线程。)【非阻塞】
1》可以更少的线程处理更多的连接,这意味着更少的开销在内存和上下文切换上。
2》当没有I/O处理的时候,线程可以被重定向到其他的任务上。
可以直接使用这些java API 构建的NIO建立应用程序,但,安全和正确无法保证。实现可靠和扩展的event-processing(事件处理器)来处理和调度数据并保证尽可能有效地,这是一个繁琐和容易出错的任务。

所以,我们应该尽可能的直接对框架的API的evenet-processing进行调用。、

你可能感兴趣的:(Netty 异步和数据驱动)