关于t-io框架的学习

公司的某个系统用到了这个框架来开发即时通讯的功能,但在压测过程中发现了一些现象。例如在频繁发送消息的情况下,无法创建链接等等....看了官网也是一头雾水,核心内容基本没有,但毕竟作者已将框架开源,基本是在用爱发电了,所以本文不是对框架的吐槽,是对框架的学习与问题分析。

tio官网:自行百度吧,csdn会认为我在做广告,无法通过审核

再讲作者的源码之前,有几个知识点需要先了解下

  • epoll
  • java aio
  • reactor、proactor模型
  • netty

这些知识应该大家都有所耳闻,网上的资料也很多,不再赘述

源码自行从官网下载,当我们打开tio的核心类,TioServer

会惊奇的发现,start方法里直接就是使用了java aio的原生语法,没有一丝丝防备,我们就直击tio的核心,这个框架的底层就是java aio,几乎没有任何封装。

抱着继续研究的态度,我开始了java aio原理的学习,对于aio网上有一堆介绍,什么异步呀,回调呀,之类的描述,java 虽然早早地有了aio的相关语法,但是几乎没有遇到任何框架表示在使用java aio;包括netty5(现在想想,我居然会觉得netty5会使用java aio来写,真的是很傻很天真了),至于这个原因,看下面的分析。

因为java aio相关资料很少,所以我就开始从源码入手,去学习原理。

首先,有几个典型的方法我们可以从上图找到

我们从java的aio了解到,我们会设置一些handler,aio会回调我们的handler,至于如何回调的等下在看,我们先进入上图的 AcceptCompletionHandler

 CompletionHandler是java aio提供的接口,所有handler需要实现它,在回调的时候,会默认执行类中的completed方法(详细清查阅java aio语法)

这里我们可以发现,回调的时候传入了一个普通socket,普通socket读取时,又传入了一个回调的handler,说明还是异步的。

至此我们已经大概了解了,java aio的套路,接受连接与读取数据都是异步的,通过回调handler来实现。

两个问题:

1.linux服务器是如何实现异步呢

通过查阅资料我们很容易知道,linux操作系统底层是没有支持网络部分的AIO的,而windows有一个被多个博主提过很多次的IOCP,但是没卵用呀,我们程序宿主服务器不会用windows的,所以操作系统底层是如何实现呢

2.如何实现回调呢

 带着这两个问题,我们开始进入jdk的源码找寻答案:
首先我们点入,open方法,一步一步点入

最终我们会点入到这里, 在点进去

 因为我本地是win版jdk,所以再往下肯定都是win版的系统方法了,这时我们需要去下载下openjdk的源码,来看下linux版是如何实现的。

openJDK之如何下载各个版本的openJDK源码 - 云+社区 - 腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1413521下载好了源码之后,我们通过DefaultAsynchronousChannelProvider这个类名去搜索下,看create方法

这个时候,我们就找到了激动人心的linux实现类!!!

关于源码的分析,建议大家看下边的文章

异步 - 简书 (jianshu.com)https://www.jianshu.com/p/aa41ca5bd82d我这边用比较通俗的语言来讲解下源码,

首先,linux底层没有意外依然使用的是epoll,这个在epollport类可以看到

而整个异步处理的流程,总结下来也就是

1.启动一个线程不断地轮训监听epoll的新的事件

2.将将事件封装为任务,放入一个线程池中执行;而封装的任务里就有需要调用的handler。

 总结:

1.通过阅读源码可以发现jdk中aio的实现类似于,单reactor/多线程模型,在高并发情况下会有瓶颈,例如处理业务较多或单个业务处理时间较长导致无法创建链接。

2.javaNIO可以理解为提供了一些工具(操作epoll),而netty把它做成了一个框架;javaAIO相比之下是深入了一步,jdk会帮助我们来调度epoll而不是我们主动来操作,至于性能如何,目前使用此项技术的框架很少,并没有确定的数据。

3.tio和netty没有比较的意义,因为两者根本不是一个概念,netty是一个异步的io框架,而tio更像是一个即时通讯程序的脚手架工程,方便我们迅速开发一个即时通讯的程序,可以改名t-im ?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值