CN1277196C - 一种实现计算机***应用服务器的方法 - Google Patents
一种实现计算机***应用服务器的方法 Download PDFInfo
- Publication number
- CN1277196C CN1277196C CN 200410046278 CN200410046278A CN1277196C CN 1277196 C CN1277196 C CN 1277196C CN 200410046278 CN200410046278 CN 200410046278 CN 200410046278 A CN200410046278 A CN 200410046278A CN 1277196 C CN1277196 C CN 1277196C
- Authority
- CN
- China
- Prior art keywords
- thread
- computer system
- pool
- receiving
- data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Computer And Data Communications (AREA)
- Information Transfer Between Computers (AREA)
Abstract
本发明提出了一种计算机领域的实现在计算机***中实现应用服务器的方法,结合使用计算机***JAVA平台中的异步I/O和计算机***线程池技术,构造计算机***线程池,并将应用服务器中的线程分为链路管理线程、接收线程、以及业务线程;将每个业务逻辑处理流程划分成多个业务段,每段都由“接收”——“处理”——“发送”组成;除需要长期存在的总控线程和定时器线程外,其它的所有线程均在计算机***线程池中申请,每接收完一次数据、或每处理完一个业务段,该线程归还到计算机***的线程池中,该链路或业务逻辑处理流程通过一个记载有状态值的数据区保存在内存中。本发明能够充分利用各种I/O模式的长处,在最大程度提高CPU占用率的基础上,增强实用性和代码的可维护,降低***复杂度。
Description
技术领域
本发明涉及计算机领域,尤其涉及一种实现计算机***应用服务器的方法。
背景技术
计算机已经日益成为生产和生活领域中不可或缺的工具,也在深刻的改变着人们的生活和工作方法。在计算机应用领域中,应用服务器技术随着人们对于网络***的需求而迅速发展,一般情况下,应用服务器有着强大的客户机请求处理能力,服务器在合理时间之内处理大量客户机请求的能力取决于服务器使用I/O(输入/输出)流的效率。同时为成百上千个客户机提供服务的服务器必须能够并发地使用I/O服务,随着计算机***Java平台的发展,在Java语言开发工具包JDK1.4中,已经开始支持异步(即非阻塞)I/O调用的功能,从而使得应用服务器有了更大处理能力的可能。
目前应用Java平台的应用服务器,由于较普遍地采用同步(阻塞)I/O机制,其线程与客户机之比几乎是一比一的关系,因而易于受到大量线程开销的影响,加上许多线程在一个耗时处理流程中很可能大部分时间都处于挂起状态,其结果是既导致了性能问题又缺乏可伸缩性。为了解决这个问题,Java平台在其最新发展中支持了异步I/O,包括新的通道(Channel)类和选择器(Selector)类,通道是客户机和服务器之间的一种通信方式,选择器则从不同客户机捕获各种事件并将它们分派到相应的事件处理工具。
多线程技术主要解决处理器单元内多个线程执行的问题,它不仅均衡了客户机的等待响应时间,简化了逻辑处理流程,而且可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力,并且非常适合服务器向多CPU的升级。但如果对多线程应用不当,会增加对单个任务的处理时间。例如,在一台服务器完成一项任务的时间为T=T1+T2+T3,其中T1是创建线程的时间,T2是在线程中执行任务的时间(包括线程间同步所需时间),T3是线程销毁的时间。可以看出,T1、T3是多线程自身带来的开销,在程序中频繁地创建或销毁线程,将导致T1和T3在T中占有相当多比例,这显然是更加突出了线程的弱点(T1、T3),而不是其并发性的优点。
正是在这一背景下产生了计算机***线程池技术,计算机***线程池技术着眼于如何缩短或调整T1、T3时间,从而提高服务器程序性能。它把T1、T3分别安排在服务器程序的启动和结束时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,将不会发生T1、T3的开销,同时它还能够显著减少创建的线程数目。
可以看出,当在单个任务一个流程中需要在多个套接字(SOCKET)接口(比如由一个TCP连接4元组构成的一个套接字接口)上等待数据时,为了减少并发线程的数量、提高CPU的利用率,通常采用异步I/O模式通过单线程来实现。当单个任务逻辑简单,但其中包含耗时操作时,同步I/O加计算机***线程池是一个最佳选择。
然而,当一个大流量服务器对外有多个接口,而如果所处理的每个任务都被I/O操作分割为许多段,各个段内又包含耗时操作(比如加解密、数据库操作、XML解析封装等),在所有段都顺序完成后,才从入口处返回结果给客户端。在这种情况下如果仍然采用同步I/O加计算机***线程池,势必会在接口处挂起很多线程,不能归还到池中,从而导致效率低下的缺点;如果仅采用异步I/O,则又无法解决主要由耗时操作引起的排队问题。目前普遍的解决方法是,底层采用异步I/O方式,在耗时操作段内则开启一定数目的工作线程或进程来处理。这样将在较大程度上对***性能有所改进,但仍存在诸多问题:首先,线程的数目是一个经验值,在不同的环境下最佳取值是不易获得的,尤其是如果在多个段内使用线程,这些线程数目之间的协调更为困难(即实用性差),且实现时多使用配置文件的方式来修改,修改后可能需要重起***;其次,从底层读写数据,在大流量时也是一个不容忽视的耗时耗CPU的***拷贝操作,而如果放置到线程中(尤其对于多CPU的***),则将很大程度的提升***的性能;最后,***设计时不仅要考虑不同接口,还需要将一段业务流程从“耗时”、“不耗时”这两个角度进行细分,从而使得***的层次性和代码复杂度、可维护性以及可二次开发性都较差。
发明内容
本发明的目的是克服现有技术存在的无法实现CPU占用率、代码可维护度、以及实用性(如是否需要获取经验值等)的有效结合的缺点,以期提出一种能够充分利用各种I/O模式的长处,在最大程度提高CPU占用率的基础上,增强实用性和代码的可维护,降低***复杂度的方法。
本发明的核心思想是:通过结合使用计算机***JAVA平台中的异步I/O和计算机***线程池技术,构造一种应用服务器实现方法,将线程分为链路管理线程、接收线程、以及业务线程三种,其中后两种使用的线程资源均来自计算机***线程池;将任务以I/O操作为分界划分为多个段,每个段均在上述线程中运行;同时在处理简单的一次性发送任务时,又采用同步I/O的方式。
本发明所述的实现在计算机***中实现应用服务器的方法,其特征在于,包括以下步骤:
(1)构造计算机***线程池,设置计算机***线程池的最多和最少线程数、以及线程数达到最大值后的等待策略,具体在某一时刻需要使用到的线程数由计算机***线程池自动调节;
所述等待策略包括在调用线程中立即执行、丢弃、调用线程挂起直到线程池中出现空闲线程后再执行等。
(2)将应用服务器中的线程分为链路管理线程、接收线程、以及业务线程;
(a)链路管理线程通过维护一个异步I/O主循环,接收外部连接请求;当链路管理线程接收到某个链路上有数据到来的事件时,从计算机***线程池中调出一个空闲线程,通过传递给该线程的Runnable(java的线程基类)实例,使该空闲线程进入工作状态,在该链路上进行接收处理,从而转变为接收线程;
(b)接收线程负责从传输层(SOCKET接口)读取数据,并将传输层数据分割或重组,最终将传输层数据转换成应用层的报文(如HTTP报文);当收集到一或多个完整的应用层报文后,接收线程从计算机***线程池中调一或多个空闲线程进行业务处理,并将接收线程自身归还到计算机***线程池中;
(c)业务线程负责处理一个业务段,包括具体业务逻辑处理,以及从SOCKET接口发送数据等。
一个SOCKET接口在某一时刻只能对应最多1个接收线程,或没有对应接受线程(接口上没有接收数据时)。每个业务线程负责处理一个业务段。
(3)将每个业务逻辑处理流程划分成多个业务段,每段都由“接收”——“处理”——“发送”组成;
“接收”在接收线程中进行,“处理”和“发送”则在业务线程中完成,不需要考虑段中是否有耗时模块;所述一个业务逻辑处理流程等同于一个任务,比如一个定位逻辑流程包括解析、鉴权、短信、定位、计费、告警等处理;
(4)除需要长期存在的总控线程和定时器线程外,其它的所有线程(如接收线程、和业务线程)均在计算机***线程池中申请,每接收完一次数据(接收线程)、或每处理完一个业务段(业务线程),该线程归还到计算机***线程池中,该链路或业务逻辑处理流程通过一个记载有状态值的数据区(包含如TCP链路或业务逻辑处理的当前状态信息)保存在内存中;
(5)处理简单的发送任务(如HTTP短连接,一次交互后立即关闭)时,采用同步I/O的方式。
本发明所述方法通过结合使用计算机***JAVA平台中的异步I/O和计算机***线程池技术,与现有的技术相比,在应用服务器中,既不会在各SOCKET接口上存在挂起的线程,也不需要对各流程中耗时模块作特殊考虑;同时因为计算机***线程池可以达到自动调节的效果,不需要硬性地配置各模块线程的数目;由于包括I/O操作都放在多线程中进行,对于***向多CPU的升级,提供了最大性能提升空间。
附图说明
图1是JAVA平台应用服务器整体架构示意图。
图2是服务器中各线程关系示意图。
图3是本发明所述方法流程图。
图4是作为本发明实施例的完整任务中任务段、链路、状态关系图。
图5是作为本发明实施例的接收线程解析调用过程示意图。
具体实施方式
下面将结合附图,举例说明在结合异步I/O和计算机***线程池设计大流量应用服务器的一个实施方式。
***的整体构架如图1所示,图中的异步I/O模块占用链路管理线程,主要进行SOCKET接口创建、监听、以及开启接收线程等操作;计算机***线程池主要维护一个空闲线程和接收、业务线程之间的转换工作,并能够根据***的繁忙程度动态调整计算机***线程池中的线程数;图中在处理简单的发送任务(如HTTP短连接,一次交互后立即关闭)时,还采用了同步I/O的方式。
服务器中各种线程之间的关系如图2所示,计算机***线程池中的空闲线程和接收线程、业务线程之间是相互转化的。链路管理、定时器后台线程则占用固定的线程资源。
具体的实施方式首先需要进行初始化准备工作,主要完成三个任务:
1)创建一个计算机***线程池,配置好计算机***线程池的最多和最少线程数、以及线程数达到最大值后的等待策略。
2)设计一个链路管理线程和接收线程的接口,设计一个接收线程与业务处理线程的接口,两个接口均继承JAVA的Runnable接口。接收线程主要实现数据读取、解码、以及业务数据包的组装。
3)将各业务流程根据“接收”、“处理”、“发送”,分割成不同的段,如图3所示,图中的一个逻辑处理流程被划分为3个工作段,并使用状态机为每段分配一个状态值。图4是为说明一个完整业务逻辑流程中业务段、链路、状态、及线程之间的关系图的示意图,业务逻辑流程从链路1接收到请求开始,直到从链路1返回结果信息结束。不同业务流程使用不同内存业务数据区,数据区索引由业务而定。
接收线程在调用一或多个业务线程后,立即退出。即将线程归还到计算机***线程池中,将链路信息以及低层的应用协议信息保存在内存中的链路数据区中。如果一次读操作解析出多个业务数据包,即从计算机***线程池启用多个业务线程处理(如图5);如果没有读全一个业务数据包,在链路数据区中保存该段数据,退还本线程,等待下次读操作。
当接收到一个数据包时,引发以下事件:
1)链路管理线程根据事件号的不同进行分别处理:处理步骤如下:
a)如果是接入建链请求,则接受该请求,并为新建的套接字接口(简称链路)分配一个链路数据区。
b)如果是链路上的数据包,则从计算机***线程池中取出一个空闲线程作为接收线程,并在其中进行读取、解析、重组操作。链路管理线程则进入新的循环中。为了简化流程,同时也可以提高效率,在链路管理线程中还需要作以下控制:任一时刻任一链路上只能占用一个接收线程。
c)如果读到一或多个完整的应用协议包,在启动一或多个业务线程后,本接收线程被归还到池中。
d)如果不是一个完整的应用协议包,接收线程不启动业务线程,在将读取进度状态保存到链路数据区后,本接收线程被归还到池中。
2)业务处理线程根据当前流程的状态,进行本段业务处理,不管其中是否有耗时操作,因为是在独立的线程中,故不需要做任何考虑。当本段处理完成后,业务线程需要执行以下几步:
a)业务处理根据要发送的目的地的IP地址加端口号找到一条(或新建一条)链路并在本线程中完成(即保证发送完全成功),发送操作,如果发送不成功,需要在本线程中尝试重发操作。
b)保存流程新的状态到数据区,归还本线程到池中。
3)发送时经常可能遇到链路上仅一次发送、不需等待响应的操作,这时采用同步I/O能达到很大的简化作用。
本发明所述方法既不会在各SOCKET接口上存在挂起的线程,也不需要对各流程中耗时模块作特殊考虑;同时因为计算机***线程池可以达到自动调节的效果,不需要硬性地配置各模块线程的数目;由于包括I/O操作都放在多线程中进行,对于***向多CPU的升级,提供了最大性能提升空间。
以上所述的实施例只是本发明方法在java平台上的一个实现性描述,而本发明方法所提出的服务器构架思想则不仅限于java平台。在不脱离本发明的实质和范围的情况下,所有的变化和修改都在本发明的范围之内。
Claims (7)
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)中,“接收”在接收线程中进行,“处理”和“发送”则在业务线程中完成;所述一个业务逻辑处理流程等同于一个任务。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200410046278 CN1277196C (zh) | 2004-06-09 | 2004-06-09 | 一种实现计算机***应用服务器的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200410046278 CN1277196C (zh) | 2004-06-09 | 2004-06-09 | 一种实现计算机***应用服务器的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1584842A CN1584842A (zh) | 2005-02-23 |
CN1277196C true CN1277196C (zh) | 2006-09-27 |
Family
ID=34601975
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 200410046278 Expired - Fee Related CN1277196C (zh) | 2004-06-09 | 2004-06-09 | 一种实现计算机***应用服务器的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1277196C (zh) |
Families Citing this family (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100450105C (zh) * | 2005-09-13 | 2009-01-07 | 中兴通讯股份有限公司 | 一种基于java消息服务的同步消息接口实现方法 |
CN100430898C (zh) * | 2006-12-20 | 2008-11-05 | 金魁 | 一种多线程管理的应用*** |
CN101141474B (zh) * | 2007-09-27 | 2010-06-16 | 中兴通讯股份有限公司 | 一种基于超文本传输协议的通讯***及方法 |
CN101882089B (zh) * | 2009-05-07 | 2013-05-08 | 中兴通讯股份有限公司 | 一种采用多线程处理业务会话应用的方法及装置 |
CN102323894B (zh) * | 2011-09-08 | 2013-07-10 | 上海普元信息技术股份有限公司 | 企业分布式应用间实现非阻塞方式相互调用的***及方法 |
CN104932932B (zh) * | 2014-03-20 | 2019-08-23 | 腾讯科技(深圳)有限公司 | 一种业务异步处理方法、装置和*** |
CN104717096B (zh) * | 2015-03-31 | 2018-10-09 | 新华三技术有限公司 | 一种事件处理方法和装置 |
CN106325977B (zh) * | 2015-06-19 | 2020-05-01 | 北京京东尚科信息技术有限公司 | 基于线程池执行任务的方法和*** |
CN105187519B (zh) * | 2015-08-26 | 2019-01-08 | 福建星网锐捷通讯股份有限公司 | 一种基于AIO的socket传输*** |
CN106897299B (zh) * | 2015-12-17 | 2020-03-10 | 阿里巴巴集团控股有限公司 | 一种数据库访问方法及装置 |
CN108255515B (zh) * | 2018-01-17 | 2021-02-02 | 广州汇智通信技术有限公司 | 一种实现定时器服务的方法和装置 |
CN110851246A (zh) * | 2019-09-30 | 2020-02-28 | 天阳宏业科技股份有限公司 | 一种批量任务处理方法、装置、***及存储介质 |
CN111651279A (zh) * | 2020-02-20 | 2020-09-11 | ***股份有限公司 | 一种处理业务流程的方法及其处理*** |
-
2004
- 2004-06-09 CN CN 200410046278 patent/CN1277196C/zh not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
CN1584842A (zh) | 2005-02-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1277196C (zh) | 一种实现计算机***应用服务器的方法 | |
CN1230737C (zh) | 一种设备数据轮询调度方法 | |
CN106850829B (zh) | 一种基于非阻塞通信的微服务***设计方法 | |
US20040003085A1 (en) | Active application socket management | |
US20060026169A1 (en) | Communication method with reduced response time in a distributed data processing system | |
CN102323894B (zh) | 企业分布式应用间实现非阻塞方式相互调用的***及方法 | |
CN103092682A (zh) | 异步网络应用程序处理方法 | |
CN1601478A (zh) | 用于在被争夺的互斥锁上被动态限定的自旋线程的方法与*** | |
CN1746844A (zh) | 一种跨操作***平台的机群***监控和管理方法 | |
CN101464810A (zh) | 服务程序处理方法及服务器 | |
CN1658145A (zh) | 可升级打印假脱机*** | |
CN105357273A (zh) | 异步通信模式下socket通信与进程管理通用平台及方法 | |
CN1752896A (zh) | 操作***协作下的嵌入式设备电源管理方法及*** | |
CN1512370A (zh) | 基于构件的用户自定义事件机制 | |
JP2014520316A (ja) | トラフィック制御方法およびトラフィック制御装置 | |
CN1933454A (zh) | 一种基于java消息服务的同步消息接口实现方法 | |
CN1328877C (zh) | 共享线程实现和调度方法 | |
CN101051302A (zh) | 用于在计算***上加载程序的方法和*** | |
CN109828842A (zh) | 一种基于dpdk技术开发的高性能数据采集引擎方法 | |
CN1567835A (zh) | 智能网中的分布式集群业务管理***及业务管理方法 | |
CN1852167A (zh) | 一种cpe参数属性处理方法 | |
CN1588411A (zh) | 一种流程定制管理平台 | |
CN112416414A (zh) | 一种基于状态机的微服务架构容器化轻量级工作流*** | |
JP2003202997A (ja) | マルチスレッド型サーバ受信方法 | |
CN1901724A (zh) | 一种移动通讯***软件版本升级的调度方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20060927 Termination date: 20190609 |