著录项信息
专利名称 | 一种实现计算机系统应用服务器的方法 |
申请号 | CN200410046278.9 | 申请日期 | 2004-06-09 |
法律状态 | 权利终止 | 申报国家 | 中国 |
公开/公告日 | 2005-02-23 | 公开/公告号 | CN1584842 |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F9/46 | IPC分类号 | G;0;6;F;9;/;4;6查看分类表>
|
申请人 | 中兴通讯股份有限公司 | 申请人地址 | 广东省深圳市南山区高新技术产业园科技南路中兴通讯大厦法律部
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 中兴通讯股份有限公司 | 当前权利人 | 中兴通讯股份有限公司 |
发明人 | 张长丰,强宇红,郑扬 |
代理机构 | 暂无 | 代理人 | 暂无 |
摘要
本发明提出了一种计算机领域的实现在计算机系统中实现应用服务器的方法,结合使用计算机系统JAVA平台中的异步I/O和计算机系统线程池技术,构造计算机系统线程池,并将应用服务器中的线程分为链路管理线程、接收线程、以及业务线程,将每个业务逻辑处理流程划分成多个业务段,每段都由“接收”——“处理”——“发送”组成,除需要长期存在的总控线程和定时器线程外,其它的所有线程均在计算机系统线程池中申请,每接收完一次数据、或每处理完一个业务段,该线程归还到计算机系统的线程池中,该链路或业务逻辑处理流程通过一个记载有状态值的数据区保存在内存中。本发明能够充分利用各种I/O模式的长处,在最大程度提高CPU占用率的基础上,增强实用性和代码的可维护,降低系统复杂度。
1、一种在计算机系统中实现应用服务器的方法,其特征在于,包括以下 步骤:
(1)构造计算机系统线程池,设置计算机系统线程池的最多和最少线 程数、以及线程数达到最大值后的等待策略,具体在某一时刻需要使用到的 线程数由计算机系统线程池自动调节;
(2)将应用服务器中的线程分为链路管理线程、接收线程、以及业务 线程;
(3)将每个业务逻辑处理流程划分成多个业务段,每段都由“接收”、 “处理”、“发送”组成;
(4)设置占用固定线程资源的总控线程和定时器线程;不占用固定线 程资源的线程从计算机系统线程池中申请得到,在每接收完一次数据、或每 处理完一个业务段,该线程归还到计算机系统的线程池中,而线程数据通过 一个记载有状态值的数据区保存在内存中;
(5)计算机系统处理采用HTTP短连接的发送任务时,采用同步I/O 的方式。
2、如权利要求1所述的在计算机系统中实现应用服务器的方法,其特 征在于,步骤(1)中所述等待策略包括在调用线程中立即执行、丢弃、调 用线程挂起直到线程池中出现空闲线程后再执行。
3、如权利要求1所述的在计算机系统中实现应用服务器的方法,其特 征在于,步骤(2)中所述三个线程具体包括:
(a)链路管理线程通过维护一个异步I/O主循环,接收外部连接请求; 当链路管理线程接收到某个链路上有数据到来的事件时,从计算机系统线程 池中调出一个空闲线程,通过传递给该空闲线程的一个继承自Runnable类 的类实例,使空闲线程进入工作状态,在该链路上进行接收处理,从而转变 为接收线程;
(b)接收线程负责从传输层SOCKET接口读取数据,并将传输层数据 分割或重组,最终将传输层数据转换成应用层的报文;当收集到一或多个完 整的应用层报文后,接收线程从计算机系统线程池中调一或多个空闲线程进 行业务处理,并将接收线程自身归还到线程池中;
(c)业务线程负责处理一个业务段,包括具体业务逻辑处理,以及从 SOCKET接口发送数据。
4、如权利要求3所述的在计算机系统中实现应用服务器的方法,其特 征在于,一个SOCKET接口在某一时刻只能对应最多1个接收线程,在接 口上没有接收数据时,则没有对应接收线程。
5、如权利要求3所述的实现在计算机系统中实现应用服务器的方法, 其特征在于,每个业务线程负责处理一个业务段。
6、如权利要求3所述的在计算机系统中实现应用服务器的方法,其特 征在于,步骤(b)中所述应用层报文为HTTP报文。
7、如权利要求1或3所述的在计算机系统中实现应用服务器的方法, 其特征在于,步骤(3)中,“接收”在接收线程中进行,“处理”和“发 送”则在业务线程中完成;所述一个业务逻辑处理流程等同于一个任务。
技术领域\n本发明涉及计算机领域,尤其涉及一种实现计算机系统应用服务器的方 法。\n背景技术\n计算机已经日益成为生产和生活领域中不可或缺的工具,也在深刻的改 变着人们的生活和工作方法。在计算机应用领域中,应用服务器技术随着人 们对于网络系统的需求而迅速发展,一般情况下,应用服务器有着强大的客 户机请求处理能力,服务器在合理时间之内处理大量客户机请求的能力取决 于服务器使用I/O(输入/输出)流的效率。同时为成百上千个客户机提供 服务的服务器必须能够并发地使用I/O服务,随着计算机系统Java平台 的发展,在Java语言开发工具包JDK1.4中,已经开始支持异步(即非阻塞) I/O调用的功能,从而使得应用服务器有了更大处理能力的可能。\n目前应用Java平台的应用服务器,由于较普遍地采用同步(阻塞)I/O 机制,其线程与客户机之比几乎是一比一的关系,因而易于受到大量线程开 销的影响,加上许多线程在一个耗时处理流程中很可能大部分时间都处于挂 起状态,其结果是既导致了性能问题又缺乏可伸缩性。为了解决这个问题, Java平台在其最新发展中支持了异步I/O,包括新的通道(Channel)类和 选择器(Selector)类,通道是客户机和服务器之间的一种通信方式,选择 器则从不同客户机捕获各种事件并将它们分派到相应的事件处理工具。\n多线程技术主要解决处理器单元内多个线程执行的问题,它不仅均衡了 客户机的等待响应时间,简化了逻辑处理流程,而且可以显著减少处理器单 元的闲置时间,增加处理器单元的吞吐能力,并且非常适合服务器向多CPU 的升级。但如果对多线程应用不当,会增加对单个任务的处理时间。例如, 在一台服务器完成一项任务的时间为T=T1+T2+T3,其中T1是创建线程 的时间,T2是在线程中执行任务的时间(包括线程间同步所需时间),T3 是线程销毁的时间。可以看出,T1、T3是多线程自身带来的开销,在程序 中频繁地创建或销毁线程,将导致T1和T3在T中占有相当多比例,这显然 是更加突出了线程的弱点(T1、T3),而不是其并发性的优点。\n正是在这一背景下产生了计算机系统线程池技术,计算机系统线程池技 术着眼于如何缩短或调整T1、T3时间,从而提高服务器程序性能。它把T1、 T3分别安排在服务器程序的启动和结束时间段或者一些空闲的时间段,这 样在服务器程序处理客户请求时,将不会发生T1、T3的开销,同时它还能 够显著减少创建的线程数目。\n可以看出,当在单个任务一个流程中需要在多个套接字(SOCKET)接口 (比如由一个TCP连接4元组构成的一个套接字接口)上等待数据时,为了 减少并发线程的数量、提高CPU的利用率,通常采用异步I/O模式通过单线 程来实现。当单个任务逻辑简单,但其中包含耗时操作时,同步I/O加计算 机系统线程池是一个最佳选择。\n然而,当一个大流量服务器对外有多个接口,而如果所处理的每个任务 都被I/O操作分割为许多段,各个段内又包含耗时操作(比如加解密、数据 库操作、XML解析封装等),在所有段都顺序完成后,才从入口处返回结果 给客户端。在这种情况下如果仍然采用同步I/O加计算机系统线程池,势必 会在接口处挂起很多线程,不能归还到池中,从而导致效率低下的缺点;如 果仅采用异步I/O,则又无法解决主要由耗时操作引起的排队问题。目前普 遍的解决方法是,底层采用异步I/O方式,在耗时操作段内则开启一定数目 的工作线程或进程来处理。这样将在较大程度上对系统性能有所改进,但仍 存在诸多问题:首先,线程的数目是一个经验值,在不同的环境下最佳取值 是不易获得的,尤其是如果在多个段内使用线程,这些线程数目之间的协调 更为困难(即实用性差),且实现时多使用配置文件的方式来修改,修改后 可能需要重起系统;其次,从底层读写数据,在大流量时也是一个不容忽视 的耗时耗CPU的系统拷贝操作,而如果放置到线程中(尤其对于多CPU的系 统),则将很大程度的提升系统的性能;最后,系统设计时不仅要考虑不同 接口,还需要将一段业务流程从“耗时”、“不耗时”这两个角度进行细分, 从而使得系统的层次性和代码复杂度、可维护性以及可二次开发性都较差。\n发明内容\n本发明的目的是克服现有技术存在的无法实现CPU占用率、代码可维护 度、以及实用性(如是否需要获取经验值等)的有效结合的缺点,以期提出 一种能够充分利用各种I/O模式的长处,在最大程度提高CPU占用率的基础 上,增强实用性和代码的可维护,降低系统复杂度的方法。\n本发明的核心思想是:通过结合使用计算机系统JAVA平台中的异步I/O 和计算机系统线程池技术,构造一种应用服务器实现方法,将线程分为链路 管理线程、接收线程、以及业务线程三种,其中后两种使用的线程资源均来 自计算机系统线程池;将任务以I/O操作为分界划分为多个段,每个段均在 上述线程中运行;同时在处理简单的一次性发送任务时,又采用同步I/O的 方式。\n本发明所述的实现在计算机系统中实现应用服务器的方法,其特征在 于,包括以下步骤:\n(1)构造计算机系统线程池,设置计算机系统线程池的最多和最少线 程数、以及线程数达到最大值后的等待策略,具体在某一时刻需要使用到的 线程数由计算机系统线程池自动调节;\n所述等待策略包括在调用线程中立即执行、丢弃、调用线程挂起直到线 程池中出现空闲线程后再执行等。\n(2)将应用服务器中的线程分为链路管理线程、接收线程、以及业务 线程;\n(a)链路管理线程通过维护一个异步I/O主循环,接收外部连接请求; 当链路管理线程接收到某个链路上有数据到来的事件时,从计算机系统线程 池中调出一个空闲线程,通过传递给该线程的Runnable(java的线程基类) 实例,使该空闲线程进入工作状态,在该链路上进行接收处理,从而转变为 接收线程;\n(b)接收线程负责从传输层(SOCKET接口)读取数据,并将传输层数 据分割或重组,最终将传输层数据转换成应用层的报文(如HTTP报文); 当收集到一或多个完整的应用层报文后,接收线程从计算机系统线程池中调 一或多个空闲线程进行业务处理,并将接收线程自身归还到计算机系统线程 池中;\n(c)业务线程负责处理一个业务段,包括具体业务逻辑处理,以及从 SOCKET接口发送数据等。\n一个SOCKET接口在某一时刻只能对应最多1个接收线程,或没有对应 接受线程(接口上没有接收数据时)。每个业务线程负责处理一个业务段。\n(3)将每个业务逻辑处理流程划分成多个业务段,每段都由“接收”—— “处理”——“发送”组成;\n“接收”在接收线程中进行,“处理”和“发送”则在业务线程中完成, 不需要考虑段中是否有耗时模块;所述一个业务逻辑处理流程等同于一个任 务,比如一个定位逻辑流程包括解析、鉴权、短信、定位、计费、告警等处 理;\n(4)除需要长期存在的总控线程和定时器线程外,其它的所有线程(如 接收线程、和业务线程)均在计算机系统线程池中申请,每接收完一次数据 (接收线程)、或每处理完一个业务段(业务线程),该线程归还到计算机 系统线程池中,该链路或业务逻辑处理流程通过一个记载有状态值的数据区 (包含如TCP链路或业务逻辑处理的当前状态信息)保存在内存中;\n(5)处理简单的发送任务(如HTTP短连接,一次交互后立即关闭) 时,采用同步I/O的方式。\n本发明所述方法通过结合使用计算机系统JAVA平台中的异步I/O和计 算机系统线程池技术,与现有的技术相比,在应用服务器中,既不会在各 SOCKET接口上存在挂起的线程,也不需要对各流程中耗时模块作特殊考虑; 同时因为计算机系统线程池可以达到自动调节的效果,不需要硬性地配置各 模块线程的数目;由于包括I/O操作都放在多线程中进行,对于系统向多 CPU的升级,提供了最大性能提升空间。\n附图说明\n图1是JAVA平台应用服务器整体架构示意图。\n图2是服务器中各线程关系示意图。\n图3是本发明所述方法流程图。\n图4是作为本发明实施例的完整任务中任务段、链路、状态关系图。\n图5是作为本发明实施例的接收线程解析调用过程示意图。\n具体实施方式\n下面将结合附图,举例说明在结合异步I/O和计算机系统线程池设计大 流量应用服务器的一个实施方式。\n系统的整体构架如图1所示,图中的异步I/O模块占用链路管理线程, 主要进行SOCKET接口创建、监听、以及开启接收线程等操作;计算机系统 线程池主要维护一个空闲线程和接收、业务线程之间的转换工作,并能够根 据系统的繁忙程度动态调整计算机系统线程池中的线程数;图中在处理简单 的发送任务(如HTTP短连接,一次交互后立即关闭)时,还采用了同步 I/O的方式。\n服务器中各种线程之间的关系如图2所示,计算机系统线程池中的空闲 线程和接收线程、业务线程之间是相互转化的。链路管理、定时器后台线程 则占用固定的线程资源。\n具体的实施方式首先需要进行初始化准备工作,主要完成三个任务:\n1)创建一个计算机系统线程池,配置好计算机系统线程池的最多和最 少线程数、以及线程数达到最大值后的等待策略。\n2)设计一个链路管理线程和接收线程的接口,设计一个接收线程与业 务处理线程的接口,两个接口均继承JAVA的Runnable接口。接收线 程主要实现数据读取、解码、以及业务数据包的组装。\n3)将各业务流程根据“接收”、“处理”、“发送”,分割成不同的 段,如图3所示,图中的一个逻辑处理流程被划分为3个工作段,并 使用状态机为每段分配一个状态值。图4是为说明一个完整业务逻辑 流程中业务段、链路、状态、及线程之间的关系图的示意图,业务逻 辑流程从链路1接收到请求开始,直到从链路1返回结果信息结束。 不同业务流程使用不同内存业务数据区,数据区索引由业务而定。\n接收线程在调用一或多个业务线程后,立即退出。即将线程归还到计 算机系统线程池中,将链路信息以及低层的应用协议信息保存在内存中的链 路数据区中。如果一次读操作解析出多个业务数据包,即从计算机系统线程 池启用多个业务线程处理(如图5);如果没有读全一个业务数据包,在链 路数据区中保存该段数据,退还本线程,等待下次读操作。\n当接收到一个数据包时,引发以下事件:\n1)链路管理线程根据事件号的不同进行分别处理:处理步骤如下:\na)如果是接入建链请求,则接受该请求,并为新建的套接字接口(简 称链路)分配一个链路数据区。\nb)如果是链路上的数据包,则从计算机系统线程池中取出一个空闲 线程作为接收线程,并在其中进行读取、解析、重组操作。链路 管理线程则进入新的循环中。为了简化流程,同时也可以提高效 率,在链路管理线程中还需要作以下控制:任一时刻任一链路上 只能占用一个接收线程。\nc)如果读到一或多个完整的应用协议包,在启动一或多个业务线程 后,本接收线程被归还到池中。\nd)如果不是一个完整的应用协议包,接收线程不启动业务线程,在 将读取进度状态保存到链路数据区后,本接收线程被归还到池中。\n2)业务处理线程根据当前流程的状态,进行本段业务处理,不管其中是 否有耗时操作,因为是在独立的线程中,故不需要做任何考虑。当本 段处理完成后,业务线程需要执行以下几步:\na)业务处理根据要发送的目的地的IP地址加端口号找到一条(或新 建一条)链路并在本线程中完成(即保证发送完全成功),发送 操作,如果发送不成功,需要在本线程中尝试重发操作。\nb)保存流程新的状态到数据区,归还本线程到池中。\n3)发送时经常可能遇到链路上仅一次发送、不需等待响应的操作,这时 采用同步I/O能达到很大的简化作用。\n本发明所述方法既不会在各SOCKET接口上存在挂起的线程,也不需要 对各流程中耗时模块作特殊考虑;同时因为计算机系统线程池可以达到自动 调节的效果,不需要硬性地配置各模块线程的数目;由于包括I/O操作都放 在多线程中进行,对于系统向多CPU的升级,提供了最大性能提升空间。\n以上所述的实施例只是本发明方法在java平台上的一个实现性描述, 而本发明方法所提出的服务器构架思想则不仅限于java平台。在不脱离本 发明的实质和范围的情况下,所有的变化和修改都在本发明的范围之内。
法律信息
- 2020-06-02
未缴年费专利权终止
IPC(主分类): G06F 9/46
专利号: ZL 200410046278.9
申请日: 2004.06.09
授权公告日: 2006.09.27
- 2006-09-27
- 2005-04-27
- 2005-02-23
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有引用任何外部专利数据! |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |