一种基于异步IO模型的网络编程框架系统及方法技术方案

技术编号:27058724 阅读:16 留言:0更新日期:2021-01-15 14:37
本发明专利技术提供了一种基于异步IO模型的网络编程框架系统及方法,系统包括:通道层,用于接收待处理的原始数据;管道层,用于从所述通道层读取所述原始数据,并通过保存的多个处理器节点对所述原始数据进行操作;其中,所述多个处理器节点通过前向指针和后向指针首尾相连以形成责任链形式的链式处理模型,且每个处理器节点绑定有一个工作者线程,使得所述处理器节点的方法执行处于其绑定的工作者线程中。本实施例通过管道层和处理器节点上的处理器上下文的设计,为处理器节点提供单线程运行环境,既能给予每个处理器节点单线程的运行环境来减低编码的难度,又可以给予整体责任链模式串行化运行的可能来提升运行性能。

【技术实现步骤摘要】
一种基于异步IO模型的网络编程框架系统及方法
本专利技术涉及计算机
,特别涉及一种基于异步IO模型的网络编程框架系统及方法。
技术介绍
在网络编程方面,操作系统为上层应用提供了几种网络模型,分别是:阻塞IO模型,非阻塞IO模型,IO复用模型,信号驱动模型,异步IO模型。在语言层面的API方面,Java语言在JDK1.0时提供了Socket套接字接口,提供了对阻塞IO模型的支持。在JDK1.4版本的时候提供了对非阻塞IO模型的支持。在JDK1.7版本的时候提供了对异步IO模型的支持。阻塞IO模型实现和应用起来较为简单,但是在并发量较高的时候,程序的整体性能不够高,开销也比较大。因为阻塞IO模型,针对每一个连接都需要消耗一个线程,而在长连接的情况下,对服务器的线程消耗会很大。IO复用模型解决了阻塞IO模型在实现中对资源消耗大的问题。通过IO复用技术,可以实现较少的线程支撑大量的接入链接。在高并发和大量接入的场景中,IO复用模型的性能较高。然而IO复用模型在实现上比较复杂,需要用户手动处理数据的读写操作。
技术实现思路
有鉴于此,本专利技术的目的在于提供一种基于异步IO模型的网络编程框架系统及方法,以解决上述问题。本专利技术实施例提供了一种基于异步IO模型的网络编程框架系统,包括:通道层,用于接收待处理的原始数据;管道层,用于从所述通道层读取所述原始数据,并通过保存的多个处理器节点对所述原始数据进行操作;其中,所述多个处理器节点通过前向指针和后向指针首尾相连以形成责任链形式的链式处理模型,且每个处理器节点绑定有一个工作者线程,使得所述处理器节点的方法执行处于其绑定的工作者线程中。本实施例提供的基于异步IO模型的网络编程框架系统,通过管道层和处理器节点上的处理器上下文的设计,为处理器节点提供单线程运行环境,既能给予每个处理器节点单线程的运行环境来减低编码的难度,又可以给予整体责任链模式串行化运行的可能来提升运行性能。附图说明为了更清楚地说明本专利技术实施方式的技术方案,下面将对实施方式中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本专利技术的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。图1是本专利技术第一实施例提供的基于异步IO模型的网络编程框架系统的模块示意图。图2是绑定工作者线程和处理器节点的工作流程图。图3是读取完成器的start方法的工作流程图。图4是自适应分配内存的流程示意图。图5是写出完成器的写出方法的流程示意图。图6是写出完成器的队列写出数据的流程示意图。图7是写出完成器的重置状态的流程示意图。图8是stack结构的数据结构图。图9是本专利技术第二实施例提供的基于异步IO模型的网络编程框架方法的流程示意图。具体实施方式为使本专利技术实施方式的目的、技术方案和优点更加清楚,下面将结合本专利技术实施方式中的附图,对本专利技术实施方式中的技术方案进行清楚、完整地描述,显然,所描述的实施方式是本专利技术一部分实施方式,而不是全部的实施方式。基于本专利技术中的实施方式,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施方式,都属于本专利技术保护的范围。因此,以下对在附图中提供的本专利技术的实施方式的详细描述并非旨在限制要求保护的本专利技术的范围,而是仅仅表示本专利技术的选定实施方式。基于本专利技术中的实施方式,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施方式,都属于本专利技术保护的范围。请参阅图1,本专利技术第一实施例提供了一种基于异步IO模型的网络编程框架系统,包括:通道层10,用于接收待处理的原始数据。管道层20,用于从所述通道层10读取所述原始数据,并通过保存的多个处理器节点对所述原始数据进行操作;其中,所述多个处理器节点通过前向指针和后向指针首尾相连以形成责任链形式的链式处理模型,且每个处理器节点绑定有一个工作者线程,使得所述处理器节点的方法执行处于其绑定的工作者线程中。在本实施例中,在异步IO(AIO)的API中,通道层10是对Socket套接字的抽象,但是通道本身是双向的,可以同时进行读和写。对于读取而言,可能存在读取、解码、转化、逻辑处理。对于写出而言,则可能存在处理、转化、编码、写出形成的一个责任链形式的链式处理模型。在本实施例中,管道层20是用来存放处理器节点的。对于外部API而言,只需要往管道层20中添加处理器节点,也就是WriteProcessor(写处理器)或者ReadProcessor(读处理器)。管道层20会生成包裹处理器节点的处理器上下文,也就是ProcessorContext。管道层20主要有如下两个作用:1、为处理器节点生成处理器上下文,处理器上下文则为处理器节点提供了一个单线程运行环境。2、提供默认的首尾两个处理器,方便于开发者集中关注在事务上。处理器上下文首先来说的是处理器上下文。具体地,处理器上下文提供如下作用:(1)、通过前向和后向指针,形成处理器上下文链条,支撑处理器节点形成责任链模式运作。其中,每一次新增一个处理器上下文的时候,将自身的前向指向链条中最后一个,而最后一个上下文将自己的后向指向该新增的上下文。(2)、每一个处理器上下文都会绑定一个工作者线程,确保处理器节点实例方法只会运行在该工作者线程上。在本实施例中,在通道层10上读取到原始数据后,首先需要考虑的是将数据解码,并且解码得到一个业务上可以完整解释的一个业务包,然后业务包经过转换、计算、逻辑处理,完成业务应用并且可能需要生成应答数据。从单一职责的角度考虑,数据的读取、解码、转换、计算步骤,每一个步骤都应该使用单独的实现去完成对应的功能。而下游的输入就是上游的输出,也就是责任链模式。但只是简单的责任链模式还不够。Java的API设计,在内核完成数据读取后,就会调用回调方法传入读取的数据进行处理,因此这个时候该线程是被占据的,在回调方法返回之前,该线程就无法用于其他地方。如果回调方法中有执行的比较慢的业务操作部分,比如涉及到IO操作。那么线程被占用的时间就会比较长。如果这种情况较多,将会导致线程整体消耗在数据读写上的时间变少,带来效率的下降。为解决这个问题,现有技术一般将读取、解码、转化这种消耗CPU的操作应该是直接利用初始AIO的线程池中来完成。而业务方法处理则可以视情况,放入到额外的线程池中进行处理,即将不同类型职责的线程分开。但是这样会带来一个难题,在责任链中的不同处理器节点,可能运行在不同的线程中,这将会导致并发处理上的困难,也就带来了实际编码上的困难。因此,对于责任链上的每一个单独的处理器节点,需要让这个节点运行在一个单独的线程中。这样,对于节点上处理器代码的开发,就简化为一个单线程的环境了。而如果责任链上的每一个点的运行线程一致的,则责任链的整体运行本身又是串行化的,可以取得最大的程序效能(减少了不必本文档来自技高网...

【技术保护点】
1.一种基于异步IO模型的网络编程框架系统,其特征在于,包括:/n通道层,用于接收待处理的原始数据;/n管道层,用于从所述通道层读取所述原始数据,并通过保存的多个处理器节点对所述原始数据进行操作;其中,所述多个处理器节点通过前向指针和后向指针首尾相连以形成责任链形式的链式处理模型,且每个处理器节点绑定有一个工作者线程,使得所述处理器节点的方法执行处于其绑定的工作者线程中。/n

【技术特征摘要】
1.一种基于异步IO模型的网络编程框架系统,其特征在于,包括:
通道层,用于接收待处理的原始数据;
管道层,用于从所述通道层读取所述原始数据,并通过保存的多个处理器节点对所述原始数据进行操作;其中,所述多个处理器节点通过前向指针和后向指针首尾相连以形成责任链形式的链式处理模型,且每个处理器节点绑定有一个工作者线程,使得所述处理器节点的方法执行处于其绑定的工作者线程中。


2.根据权利要求1所述的基于异步IO模型的网络编程框架系统,其特征在于,
所述通道层提供的通道为读写双向;则对管道层:
在读取时,将其视为源头是对通道层的原始数据的读取,尽头是处理器节点的一个责任链的链式处理模型;
在写出时,将其视为存在处理、转化、编码、写出形成的一个责任链形式的链式处理模型。


3.根据权利要求1所述的基于异步IO模型的网络编程框架系统,其特征在于,每个处理器节点均处于一个处理器上下文的包裹之中,则对于每个处理器节点:
判断调用方法的线程是否与处理器上下文绑定的工作者线程;
若是,则直接执行对应的方法内容;
若不是,则将这个调用包装为一个可运行对象,并将所述可运行对象投递到工作者线程的队列中,等待被处理。


4.根据权利要求1所述的基于异步IO模型的网络编程框架系统,其特征在于,还包括:
自适应IoBuffer模块,用于作为贯穿网络编程框架系统的数据承载容器以及连通网络编程框架系统的API与JavaAIO中的API;其中,所述自适应IoBuffer模块具有读取标记以及写入标记,并根据两个标记的切换实现读写的状态翻转;
分配器,用于完成对IoBuffer的申请。


5.根据权利要求4所述的基于异步IO模型的网络编程框架系统,其特征在于,还包括:
读取完成器,用于在通道层上启动监听以及在监听到通道层读取到数据后执行对应的处理逻辑;
其中,启动监听的过程具体为:
根据初始配置大小,从分配器申请IoBuffer实例;
将申请的IoBuffer实例设置到ReadEntry的对象属性,并使用IoBuffer实例创建可写ByteBuffer,设置到ReadEntry属性;其中,ReadEntry类用于存储当前正在使用的IoBuffer和其生成出来的ByteBuffer;
使用所述ByteBuffer进行读取API调用,并将ReadEntry作为附件传入;
其中,执行对应的处理逻辑的过程具体为:
判断当前读取的数据的长度是否为-1;
若是,则将ReadEntry中的IoBuffer执行free调用来释放空间,并执行通道关闭方法;
若否,则判断当前读取的数据的长度是否大于0;
若大于,则IoBuffer中的写入标记增加本次读取的长度,并将IoBuffer实例传递到管道层上,以触发管道层的读取方法;
若不大于,则将IoBuffer释放;
根据自适应算法判断本次需要的IoBuffer的容量大小,并调用分配器分配该大小的IoBuffer;
将所述IoBuffer设置到ReadEntry中,并使用所述IoBuffer创建可写ByteBuffer实例,作为通道层读取的容器载体,将ReadEntry作为附件传入,执行通道读取。


6.根据权利要求5所述的基于异步IO...

【专利技术属性】
技术研发人员:林斌施建安庄一波赵友平孙志伟
申请(专利权)人:厦门市易联众易惠科技有限公司
类型:发明
国别省市:福建;35

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1