Java AIO 内核增强类库 aio-enhance

Apache
Java
跨平台
2020-06-15
三刀蜀黍

aio-enhance(音译:硬汉) 是一款无侵入式的 Java AIO 内核增强类库注意:这不是一款通信框架),解决原生 AIO 架构设计中存在的缺陷,提供更高效、更稳定的通信能力。

aio-enhance 采用了 NIO 技术实现了一套全新的异步 IO 模型,兼容完整的 Java AIO 接口。用户可自由选择 Java 原生提供的,或者 aio-enhance 增强的 AIO 实现,架构如下图。

一、项目背景

2.1 解决平台兼容性问题。

Java 原生 AIO 在 Mac 操作系统下存在兼容性问题,进行性能压测会偶发性的系统崩溃。

2.2 修复官方 AIO 架构缺陷

Java 原生 AIO 在底层架构设计上存在缺陷(参考:Java AIO通信模型)。多核 CPU 环境下处理高并发请求,会引发比较严重的锁竞争现象,以致无法充分发挥机器性能。

普通4核机器竞争压力不大,AIO 的运行表现实测优于NIO。但随着 CPU 核数的增加,AIO 的性能优势逐渐下降。

2.3 优化 AIO 线程模型

Java AIO 相较于 NIO 多了一层异步线程模型,极大降低了开发人员的编程难度。但是通信过程中的 accept、connect、read、write 等事件都是复用同一组线程资源,容易造成读写回调进入死锁状态。 AIO通信框架在设计上需要特别关注这一点,但如果引入 aio-enhance 则无此顾虑。

二、适用场景

如果您符合以下几个条件,aio-enhance 会是一个不错的选择。

  • 基于 Java AIO 实现的通信框架,如:smart-socket;
  • 对高并发实时性有严苛要求;
  • 多核CPU环境(至少4核以上)

三、集成

步骤一:依赖

引入增强包:aio-enhance.jar。可以通过maven方式引入依赖,亦可直接下载 jar 包并导入classpath。

<dependency>
	<groupId>org.smartboot.aio</groupId>
	<artifactId>aio-enhance</artifactId>
	<version>1.0.0</version>
</dependency>

步骤二:启动

可以通过硬编码的方式设置系统属性,如下:

System.setProperty("java.nio.channels.spi.AsynchronousChannelProvider", "org.smartboot.aio.EnhanceAsynchronousChannelProvider");

也可在 java 启动命令行中设置,如下:

java -Djava.nio.channels.spi.AsynchronousChannelProvider=org.smartboot.aio.EnhanceAsynchronousChannelProvider xxx.jar

四、性能对比

为了更加客观的展现 Java 原生 AIO、NIO 以及通过 aio-enhance增强后的 AIO 的性能表现,我们选择 smart-socket 和 netty 在 TFB 上的测试结果做了比较。

  • aio:smart-socket
  • nio:netty
  • aio-enhance: smart-socket

4核CPU

28核CPU

五、总结

虽说在实验场景下 Java AIO 的表现不如 NIO,但是异步非阻塞的设计思想是值得被肯定的。况且在现实场景中,这点性能差别很容易就被业务逻辑所抹平,大家无需去计较孰优孰劣,适合自己的就是最好的选择。如今有了 aio-enhance 做备选,Java AIO本身设计上的缺陷也就没那么重要了。

的码云指数为
超过 的项目
加载中
请先登录后再评论。

aio-enhance v1.0.1 发布,Java AIO 内核增强类库

aio-enhance(音译:硬汉) 是一款无侵入式的 Java AIO 内核增强类库(注意:这不是一款通信框架),解决原生 AIO 架构设计中存在的缺陷,提供更高效、更稳定的通信能力。 aio-enhance 采用了...

07/14 08:40

aio-enhance 首发,Java AIO 内核增强类库

aio-enhance(音译:硬汉) 是一款无侵入式的 Java AIO 内核增强类库(注意:这不是一款通信框架),解决原生 AIO 架构设计中存在的缺陷,提供更高效、更稳定的通信能力。 aio-enhance 采用了...

06/15 09:40

没有更多内容

加载失败,请刷新页面

没有更多内容

暂无问答

AIO 学习

AsynchronousServerSocketChannel An asynchronous channel for stream-oriented listening sockets. An asynchronous server-socket channel is created by invoking the open method of th...

2016/04/23 12:29
107
1
Linux AIO

libaio Linux从2.6的kernel开始提供aoi,系统调用的直接使用是通过汇编,使用int中断指令或者专用的syscall指令,但是gnu的glibc没有提供aoi系统调用的c语言调用封装,oracle提供了一个简单封...

2019/03/04 19:03
22
0
java中的AIO

## 简介 jdk7中新增了一些与文件(网络)I/O相关的一些api。这些API被称为NIO.2,或称为AIO(Asynchronous I/O)。AIO最大的一个特性就是异步能力,这种能力对socket与文件I/O都起作用。AIO其实是...

2016/11/30 20:16
237
1
NIO、BIO、AIO

https://gitee.com/jly521/NioAio.git NIO、AIO代码举例地址 从进程级通信的维度讨论时, 阻塞和同步(非阻塞和异步)就是一对同义词, 且需要针对发送方和接收方作区分对待。 发送方阻塞/非...

2018/10/31 12:59
230
1
BIO、NIO和AIO

文章来源:http://hollischuang.gitee.io/tobetopjavaer/#/basics/java-basic/bio-vs-nio-vs-aio IO 什么是IO? 它是指计算机与外部世界或者一个程序与计算机的其余部分的之间的接口。它对于任...

04/29 17:00
39
0
AIO及基础实现

AIO:异步非阻塞IO,当系统中有IO操作后,会产生一个单独的线程,由它将所有需要处理的事情交由本地操作系统来完成,操作系统处理完成后,再将结果返回即可。 以常用的烧水问题来举例,服务器...

2019/10/19 22:57
11
0
BIO、NIO、AIO

一、简介 BIO (Blocking I/O):同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。这里使用那个经典的烧开水例子,这里假设一个烧开水的场景,有一排水壶在烧开水,BIO的工...

03/11 20:11
131
0
BIO、NIO、AIO

适用场景 BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。 NIO方式适用于连接数目多且连接比较...

2019/07/03 13:32
17
0
NIO、AIO、BIO是个啥?

一、简介 NIO 一种同步非阻塞的I/O。 AIO 异步非阻塞I/O。 BIO 同步阻塞IO操作。 二、名词解释 阻塞和非阻塞 当线程执行阻塞操作时,是只能等待,而不能执行其他事情的。 非阻赛是不需要等待...

2019/09/05 20:38
40
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部