CN103577257A - 一种rest服务方法、装置及系统 - Google Patents
一种rest服务方法、装置及系统 Download PDFInfo
- Publication number
- CN103577257A CN103577257A CN201210276257.0A CN201210276257A CN103577257A CN 103577257 A CN103577257 A CN 103577257A CN 201210276257 A CN201210276257 A CN 201210276257A CN 103577257 A CN103577257 A CN 103577257A
- Authority
- CN
- China
- Prior art keywords
- thread
- request msg
- unit
- data
- thread pool
- 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.)
- Pending
Links
Images
Landscapes
- Telephonic Communication Services (AREA)
Abstract
本发明提供了一种REST服务方法、装置及系统,所述方法包括接收客户端发送的I/O请求数据;判断预设的线程池中的线程是否均处于非空闲状态,如果是,将所述I/O请求数据置入所述I/O等待集合中;其中,所述线程池中至少包括一个线程;在所述线程池中出现处于空闲状态的线程时,获取所述I/O等待集合中的一个I/O请求数据作为当前I/O请求数据;依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程对所述当前I/O请求数据进行处理;释放所述当前启动线程至所述线程池。
Description
技术领域
本申请涉及软件服务技术领域,特别涉及一种REST服务方法、装置及系统。
背景技术
REpresentational State Transfer服务(REST服务)是一种架构原则,其将web服务视为资源,由客户端通过开放API服务技术对该web资源进行调用,即客户端发出I/O请求数据,建立HTTP连接,连接到服务器的REST通讯接口上,由此服务器根据该I/O请求数据启动一个线程对I/O请求数据进行处理,即读取与该I/O请求数据相对应的资源数据,调用与I/O请求数据相对应的服务利用读取的资源数据执行具体的业务逻辑,写入服务执行结果即资源数据的处理结果,此时,释放线程。
但上述REST服务中,每个I/O请求都需要建立一个线程对该I/O请求进行处理,处理完成以后再释放该线程,因此在处理高并发的REST服务时,对高并发的每一个I/O请求都创建一个线程进行处理,造成系统资源的浪费,降低了系统资源的使用率,尤其是在I/O请求较多时,会引起系统资源严重不足,甚至系统瘫痪。
发明内容
本申请所要解决的技术问题是提供一种REST服务方法、装置及系统,用以解决现有技术中在处理高并发的REST服务请求时,对高并发的每一个I/O连接都创建一个线程进行处理,造成系统资源的浪费,降低了系统资源的使用率,尤其是在I/O连接请求较多时,会引起系统资源严重不足,甚至系统瘫痪的技术问题。
为解决上述技术问题,本申请提供了一种REST服务方法,包括:
接收客户端发送的I/O请求数据;
判断预设的线程池中的线程是否均处于非空闲状态,如果是,将所述I/O请求数据置入所述I/O等待集合中;
其中,所述线程池中至少包括一个线程;
在所述线程池中出现处于空闲状态的线程时,获取所述I/O等待集合中的一个I/O请求数据作为当前I/O请求数据;
依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程对所述当前I/O请求数据进行处理;
释放所述当前启动线程至所述线程池。
上述方法,优选地,所述方法还包括:
若所述线程池中存在处于空闲状态的线程,依据预设的第二启动规则,启动所述线程池中一个处于空闲状态的线程,将所述I/O请求数据作为当前I/O请求数据进行处理;
释放所述当前启动线程至所述线程池。
上述方法,优选地,所述依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程,对所述当前I/O请求数据进行处理包括:
依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程,读取与所述当前I/O请求数据相对应的资源数据;
调用与所述当前I/O请求数据相对应的服务,并对所述资源数据执行所述调用的服务;
将所述资源数据的执行结果进行写入。
上述方法,优选地,在所述接收客户端发送的I/O请求数据之后,在所述判断预设的线程池中的线程是否均处于非空闲状态之前,所述方法还包括:
读取与所述I/O请求数据相对应的资源数据置入数据缓存集合中;
所述依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程,对所述当前I/O请求数据进行处理包括:
依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程;
调用与所述当前I/O请求数据相对应的服务;
对所述数据缓存集合中与所述当前I/O请求数据相对应的资源数据执行所述调用的服务;
将所述资源数据的执行结果置入所述数据缓存集合中;
在所述释放所述当前启动线程至所述线程池之后,所述方法还包括:
将所述数据缓存集合中与所述当前I/O请求数据相对应的资源数据的执行结果进行写入。
上述方法,优选地,在所述接收客户端发送的I/O请求数据之后,在判断预设的线程池中的线程是否均处于非空闲状态之前,所述方法还包括:
查询预设的I/O等待集合中是否非空;
如果是,将所述I/O请求数据置入所述I/O等待集合中,并在所述线程池中出现处于空闲状态的线程时,获取所述I/O等待集合中的一个I/O请求数据作为当前I/O请求数据;
否则,判断预设的线程池中的线程是否均处于非空闲状态。
上述方法,优选地,所述I/O等待集合的数据结构为队列的数据结构;
所述将所述I/O请求数据置入所述I/O等待集合中包括:
将所述I/O请求数据置入数据结构为队列数据结构的I/O等待集合中。
本申请还提供了一种REST服务装置,包括数据接收单元、第一逻辑判断单元、数据置入单元、数据获取单元、第一线程启动单元和线程释放单元,其中:
所述数据接收单元接收客户端发送的I/O请求数据,所述第一逻辑判断单元判断预设的线程池中的线程是否均处于非空闲状态,如果是,触发所述数据置入单元将所述I/O请求数据置入所述I/O等待集合中;
其中,所述线程池中至少包括一个线程;
所述数据获取单元在所述线程池中出现处于空闲状态的线程时,获取所述I/O等待集合中的一个I/O请求数据作为当前I/O请求数据,由所述第一线程启动单元依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程对所述当前I/O请求数据进行处理,触发所述线程释放单元释放所述当前启动线程至所述线程池。
上述装置,优选地,还包括第二线程启动单元;
所述第一逻辑判断单元在判断出所述线程池中存在处于空闲状态的线程时,触发所述第二线程启动单元,依据预设的第二启动规则,启动所述线程池中一个处于空闲状态的线程,将所述I/O请求数据作为当前I/O请求数据进行处理,触发所述线程释放单元释放所述当前启动线程至所述线程池。
上述装置,优选地,所述第一线程启动单元包括数据读取子单元、服务调用子单元和数据写入子单元,其中:
所述数据读取子单元依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程,读取与所述当前I/O请求数据相对应的资源数据,触发所述服务调用子单元调用与所述当前I/O请求相对应的服务,并对所述资源数据执行所述调用的服务;
所述数据写入子单元将所述资源数据的执行结果进行写入。
上述装置,优选地,还包括数据缓存单元和数据写入单元;
所述数据缓存单元在所述数据接收单元接收客户端发送的I/O请求数据之后,在所述第一逻辑判断单元判断预设的线程池中的线程是否均处于非空闲状态之前,读取与所述I/O请求数据相对应的资源数据置入数据缓存集合中;
所述数据写入单元在所述线程释放单元释放所述当前线程至所述线程池后,将所述数据缓存集合中与所述当前I/O请求数据相对应的资源数据的执行结果进行写入;
其中,所述第一线程启动单元包括线程启动子单元、服务调用子单元、数据缓存子单元,其中:
所述线程启动子单元依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程,触发所述服务调用子单元调用与所述当前I/O请求数据相对应的服务,并对所述数据缓存集合中与所述当前I/O请求数据相对应的资源数据执行所述调用的服务;
所述数据缓存子单元将所述资源数据的执行结果置入所述数据缓存集合中,触发所述线程释放单元释放所述当前启动线程至所述线程池。
上述装置,优选地,还包括第二逻辑判断单元;
所述第二逻辑判断单元在所述第一逻辑判断单元判断预设的线程池中的线程是否均处于非空闲状态之前,查询预设的I/O等待集合中是否存在历史I/O请求数据,如果是,触发所述数据置入单元,否则,触发所述第一逻辑判断单元。
上述装置,优选地,所述I/O等待集合的数据结构为队列的数据结构。
本申请还提供了一种REST服务系统,包括上述任意一项所述的REST服务装置。
由上述方案可知,本申请提供的一种REST服务方法、装置及系统,通过预设含有多个线程的线程池,并在客户端发送I/O请求数据之后,判断若线程池中没有空闲线程存在,则将将该I/O请求数据置入预设的I/O等待集合中进行等待,在线程池中出现空闲线程时,调用空闲线程对I/O等待集合中的I/O请求数据进行处理,之后,释放当前启动线程至线程池中等待下一次启动,由此避免了现有技术中对高并发的每个I/O请求数据都需要启动一个线程对其进行处理,由此造成系统资源的浪费,降低系统资源的使用率,尤其是在I/O连接请求较多时,会引起系统资源严重不足,甚至系统瘫痪的技术问题。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请提供的一种REST服务方法实施例一的流程图;
图2为本申请提供的一种REST服务方法实施例一中REST资源服务的整体架构图;
图3为本申请提供的一种REST服务方法实施例二的流程图;
图4为本申请提供的一种REST服务方法实施例三的部分流程图;
图5为本申请提供的一种REST服务方法实施例三实现REST资源服务的时序图;
图6为本申请提供的一种REST服务方法实施例四的流程图;
图7为本申请提供的一种REST服务方法实施例五的流程图;
图8为本申请提供的一种REST服务装置实施例一的结构示意图;
图9为本申请提供的一种REST服务装置实施例二的结构示意图;
图10为本申请提供的一种REST服务装置实施例三的结构示意图;
图11为本申请提供的一种REST服务装置实施例三的另一种结构示意图;
图12为本申请提供的一种REST服务装置实施例四的结构示意图;
图13为本申请提供的一种REST服务装置实施例四的另一结构示意图;
图14为本申请提供的一种REST服务装置实施例五的结构示意图;
图15为本申请提供的一种REST服务系统实施例的架构图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
参考图1,其示出了本申请提供的一种REST服务方法实施例一的流程图,所述方法可以包括以下步骤:
步骤101:接收客户端发送的I/O请求数据。
参考图2,其示出了REST资源服务的整体架构图,其中:
Service Tier(服务层):提高被调用服务所能实现的功能,执行被调用服务的具体业务逻辑。
Service Hub:(服务入口):调用服务和返回服务执行结果(资源数据的执行结果)均经过该组件转发至具体的服务。
Base Service(基础服务):所有服务均可调用该基础服务,例如:存储,日志,权限等。
Extract Service:(高级服务):用户根据其需要自行开发的服务,该服务以上传JAR包的形式提供。
Resource Tier(资源层):将服务转化为REST的资源,提供服务的导航。
Resource Hub:(资源导航):完成资源到服务的导航,同时提供资源的元数据描述。
View Tier(展现层):完成REST的通讯。
REST Servlet(REST通讯接口):REST服务的通讯接口,该接口支持HTTP链接,即NIO Connector(高性能I/O连接),例如:GET、PUT、POST、DELETE及HEAD等。
META Servlet(元数据通讯接口):客户端可以据此获得服务的元数据。
Comet Servlet(长连接的通讯接口):该接口支持HTTP的长连接。
Ping Servlet(心跳通讯接口):集群心跳通讯接口。
其中,在客户端依据其所需要的资源数据信息,发送与该需求相对应的I/O请求数据之后,所述接收客户端发送的I/O请求数据具体为:
REST资源服务器接收客户端发送的I/O请求数据,并根据该I/O请求数据建立HTTP链接,即通过该HTTP链接连接到REST服务器端的REST通讯接口。
步骤102:判断预设的线程池中的线程是否均处于非空闲状态,如果是,执行步骤103;
其中,所述线程池中至少包括一个线程。
步骤103:将所述I/O请求数据置入所述I/O等待集合中。
需要说明的是,所述线程池中的线程初始为空闲状态,在出现I/O请求数据时,则启动处于空闲状态的线程中的一个线程对该I/O请求数据进行处理,在所述线程池中的线程均被I/O请求数据启动,而没有线程处于空闲状态时,所述I/O请求数据需要进行等待,即将所述I/O请求数据置入所述I/O等待集合中。
步骤104:在所述线程池中出现处于空闲状态的线程时,获取所述I/O等待集合中的一个I/O请求数据作为当前I/O请求数据。
其中,优选地,每个线程都有一个线程监测器对其状态进行监测。在将所述I/O请求数据置入所述I/O等待集合中后,所述线程池中的线程监测器对其各自线程进行实时监测,当发现所述线程池中出现线程处于空闲状态时,表明此时可以对I/O请求数据进行处理,即可获取所述I/O等待集合中的一个I/O请求数据作为当前I/O请求数据,并将所述I/O等待集合中已经被获取的I/O请求数据进行删除。
步骤105:依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程对所述当前I/O请求数据进行处理。
优选地,所述第一启动规则具体为:
若所述线程池中只有一个线程处于空闲状态,则启动该处于空闲状态的线程;
若所述线程池中有两个或两个以上的线程同时由非空闲状态转变为空闲状态时,则随机启动所述处于空闲状态的线程中的一个线程。
其中,当启动所述线程池中一个处于空闲状态的线程后,由该当前启动线程对所述当前I/O请求数据进行处理。
优选地,所述方法还包括:
在所述当前启动线程对所述当前I/O请求数据处理完成后,将所述I/O等待集合中的当前I/O请求数据进行删除。
步骤106:释放所述当前启动线程至所述线程池。
需要说明的是,在所述当前启动线程结束对所述当前I/O请求数据的处理之后,断开HTTP连接,并将所述当前启动线程释放至所述线程池中,用以对下一个客户端实时发送的I/O请求数据或所述I/O等待集合中的I/O请求数据进行处理。
由上述方案可知,本申请提供的一种REST服务方法实施例一,通过预设含有多个线程的线程池,并在客户端发送I/O请求数据之后,判断若线程池中没有空闲线程存在,则将将该I/O请求数据置入预设的I/O等待集合中进行等待,并在线程池中出现由非空闲状态转换为空闲状态的线程时,调用该空闲线程对I/O等待集合中的I/O请求数据进行处理,之后,释放当前启动线程至线程池中等待下一次启动,即将对I/O请求数据进行处理的线程置入线程池中,通过数目有限的线程的线程池来服务于相对数目较多的I/O请求数据,超出线程池中线程数目大小的I/O请求数据需要进行等待,在线程池中出现空闲线程时,对I/O请求数据进行处理,由此避免了现有技术中对高并发的每个I/O请求数据都创建启动一个线程来对其进行处理,导致系统资源的浪费,降低系统资源的使用率,尤其是在I/O连接请求较多时,会引起系统资源严重不足,甚至系统瘫痪的技术问题。
优选地,所述I/O等待集合的数据结构为队列的数据结构;
所述步骤103包括:
将所述I/O请求数据置入数据结构为队列数据结构的I/O等待集合中。
需要说明的是,在将所述I/O请求数据置入所述I/O等待集合中时,若所述I/O等待集合中已经含有其他的I/O请求数据时,将当前待置入的I/O请求数据置入已经置入的I/O请求数据之后。
在进行I/O等待集合中的数据获取时,按照先进先出的原则,获取所述I/O等待集合中最先被置入的I/O请求数据,并将该最先被置入的I/O请求数据进行删除。
参考图3,其示出了本申请提供的一种REST服务方法实施例二的流程图,其中,所述方法还包括步骤:
步骤S301:若所述线程池中存在处于空闲状态的线程,依据预设的第二启动规则,启动所述线程池中一个处于空闲状态的线程,将所述I/O请求数据作为当前I/O请求数据进行处理。
优选地,所述第二启动规则具体为:
若所述线程池中只有一个线程处于空闲状态,则启动该处于空闲状态的线程;
若所述线程池中有两个或两个以上的线程均处于空闲状态时,则随机启动所述处于空闲状态的线程中的一个线程,或依据所述处于空闲状态的线程由非空闲状态转换成空闲状态的时间顺序选取待启动线程,并启动该待启动线程。
步骤S302:释放所述当前启动线程至所述线程池。
需要说明的是,在所述当前启动线程结束对所述当前I/O请求数据的处理之后,断开HTTP连接,并将所述当前启动线程释放至所述线程池中,用以对下一个客户端实时发送的I/O请求数据或所述I/O等待集合中的I/O请求数据进行处理。
由上述方案可知,本申请提供的一种REST服务方法实施例二,将对I/O请求数据进行处理的线程置入线程池中,通过数目有限的线程的线程池来服务于相对数目较多的I/O请求数据,超出线程池中线程数目大小的I/O请求数据需要进行等待。在线程池中存在空闲线程时,即可启动线程池中的一个空闲线程对I/O请求数据进行处理,并在线程池中的线程均处于非空闲状态时,将该I/O请求数据置入I/O等待集合进行等待,在线程池中出现由非空闲状态转换为空闲状态的线程时,启动该线程对I/O等待集合中的I/O请求数据进行处理,由此避免了现有技术中对高并发的每个I/O请求数据都创建启动一个线程来对其进行处理,导致系统资源的浪费,降低系统资源的使用率,尤其是在I/O连接请求较多时,会引起系统资源严重不足,甚至系统瘫痪的技术问题。
基于本申请方法实施例一,优选地,参考图4,其示出了本申请提供的一种REST服务方法实施例三的部分流程图,所述步骤105具体可以包括以下步骤:
步骤401:依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程,读取与所述当前I/O请求数据相对应的资源数据。
其中,所述第一启动规则的具体内容请参考本申请方法实施例一。
具体地,在客户端发送I/O请求数据,并通过该HTTP链接连接到REST服务器端的REST通讯接口之后,REST通讯接口将客户端发送的文本格式的I/O请求数据进行反序列化为JAVA对象,并通过如图2所示的整体架构中的资源导航,读取与所述当前I/O请求数据即当前JAVA对象相对应的资源数据。
步骤402:调用与所述当前I/O请求数据相对应的服务,并对所述资源数据执行所述调用的服务。
其中,在获取与所述当前I/O请求数据相对应的资源数据之后,通过服务导航,查询并调用与所述当前I/O请求数据相对应的服务,并对所述资源数据执行所述调用的服务,具体为:所述调用的服务对所述资源数据执行其具体的业务逻辑。
步骤403:将所述资源数据的执行结果进行写入。
其中,所述资源数据的执行结果即为所述服务的执行结果,在所述服务执行完成后,其结果被获取,并作为所述资源数据的执行结果进行写入,即将所述资源数据的执行结果返回至客户端,具体为,将JAVA对象格式的资源数据的执行结果序列化为文本格式的资源数据的执行结果,并将所述资源数据的执行结果通过HTTP链接返回至客户端。
参考图5,其示出了本申请方法实施例三在实现REST服务过程的时序图,其中:
步骤501:客户端通过HTTP链接连接到REST通讯接口;
步骤502:REST通讯接口将客户端发送的文本格式的I/O请求数据反序列化为JAVA对象;
步骤503:依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程,当前启动线程通过资源导航查询到与该JAVA对象相对应的资源数据;
步骤504:当前启动线程将对资源数据的操作转换为对与当前I/O请求数据相对应的服务的调用;
步骤505:当前启动线程通过服务导航(服务入口)查询到与当前I/O请求数据相对应的服务;
步骤506:当前启动线程调用查询到的服务;
步骤507:当前启动线程触发被调用的服务执行其具体的业务逻辑;
步骤508:被调用服务的执行结果返回至服务导航;
步骤509:资源数据的执行结果返回至资源导航;
步骤510:当前启动线程将JAVA对象格式的资源数据的执行结果序列化为文本格式;
步骤511:当前启动线程将文本格式的资源数据的执行结果返回至客户端,释放当前启动线程至线程池中。
参考图6,其示出了本申请提供的一种REST服务方法实施例四的流程图,所述方法可以包括以下步骤:
步骤601:接收客户端发送的I/O请求数据。
其中,所述步骤601与本申请方法实施例一中所述步骤101中所述一致,在此不再详细阐述。
步骤602:读取与所述I/O请求数据相对应的资源数据置入数据缓存集合中。
其中,在建立与I/O请求数据相对应的HTTP链接之后,本申请方法实施例四采用在线程启动之前,将与该I/O请求数据相对应的资源数据进行读取,避免在启动线程之后,等待数据读取,导致系统资源浪费的弊端。
步骤603:判断预设的线程池中的线程是否均处于非空闲状态,如果是,执行所述步骤604。
步骤604:将所述I/O请求数据置入所述I/O等待集合中。
其中,所述线程池中至少包括一个线程。
步骤605:在所述线程池中出现处于空闲状态的线程时,获取所述I/O等待集合中的一个I/O请求数据作为当前I/O请求数据。
其中,所述步骤603至所述步骤605与本申请方法实施例一中所述步骤102至所述步骤104中所述一致,在此不再详细阐述。
步骤606:依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程,对所述当前I/O请求数据进行处理。
优选地,所述第一启动规则具体为:
若所述线程池中只有一个线程处于空闲状态,则启动该处于空闲状态的线程;
若所述线程池中有两个或两个以上的线程同时由非空闲状态转变为空闲状态时,则随机启动所述处于空闲状态的线程中的一个线程。
其中,所述步骤606具体包括:
调用与所述当前I/O请求数据相对应的服务;
对所述数据缓存集合中与所述当前I/O请求数据相对应的资源数据执行所述调用的服务;
将所述资源数据的执行结果置入所述数据缓存集合中。
步骤607:释放所述当前启动线程至所述线程池;
步骤608:将所述数据缓存集合中与所述当前I/O请求数据相对应的资源数据的执行结果进行写入。
优选地,本申请方法实施例四为提高线程的利用率,为线程设置有数据缓存集合和事件分离器,该事件分离器监测客户端是否发送I/O请求数据,在客户端发送I/O请求数据之后,该事件分离器被触发,读取与所述I/O请求数据相对应的资源数据置入数据缓存集合中。
由上述方案可知,本申请提供的一种REST服务方法实施例四,通过在线程启动之前,读取与待处理的I/O请求数据相对应的资源数据置入数据缓存集合中,线程启动后,对数据缓存集合中的资源数据进行处理,避免了线程需要等待I/O读取数据,导致CPU资源浪费的情况,同时,在线程对资源数据处理完成后,首先将资源数据的执行结果置入数据缓存集合中,释放线程,再将数据缓存集合中的资源数据的执行结果进行写入,避免了线程需要等待I/O写入数据,导致CPU资源浪费的技术问题。
优选地,本申请还提供了一种REST服务方法实施例五,基于本申请方法实施例一,在所述步骤101之后,在所述步骤102之前,所述方法可以包括以下步骤:
步骤S701:查询预设的I/O等待集合中是否非空,如果是,直接执行所述步骤103,否则,执行所述步骤102。
需要说明的是,本申请方法实施例五在判断线程池中是否含有非空闲线程前,首先判断I/O等待集合中是否非空,若所述I/O等待集合非空,则说明I/O等待集合中的数据并未被处理完成,即线程池中没有空闲线程,此时,直接将所述I/O请求数据置入所述I/O等待集合中;若所述I/O等待集合为空,则说明I/O等待集合中的数据已经被处理完成,此时,线程池中可能有线程处于空闲状态,此时再判断所述线程池中的线程是否均处于非空闲状态,并继续执行后续步骤。由于CPU对线程的判断时间要高于对某一存储位置是否为空的判断时间,由此本申请方法实施例五在实现高并发REST服务时,提高了服务效率。
参考图8,其示出了本申请提供的一种REST服务装置实施例一的结构示意图,所述装置包括数据接收单元801、第一逻辑判断单元802、数据置入单元803、数据获取单元804、第一线程启动单元805和线程释放单元806,其中:
所述数据接收单元801接收客户端发送的I/O请求数据,所述第一逻辑判断单元802判断预设的线程池中的线程是否均处于非空闲状态,如果是,触发所述数据置入单元803将所述I/O请求数据置入所述I/O等待集合中;
其中,所述线程池中至少包括一个线程;
所述数据获取单元804在所述线程池中出现处于空闲状态的线程时,获取所述I/O等待集合中的一个I/O请求数据作为当前I/O请求数据,由所述第一线程启动单元805依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程对所述当前I/O请求数据进行处理,触发所述线程释放单元806释放所述当前启动线程至所述线程池。
由上述方案可知,本申请提供的一种REST服务装置实施例一,通过预设含有多个线程的线程池,并在客户端发送I/O请求数据之后,判断若线程池中没有空闲线程存在,则将将该I/O请求数据置入预设的I/O等待集合中进行等待,并在线程池中出现由非空闲状态转换为空闲状态的线程时,调用该空闲线程对I/O等待集合中的I/O请求数据进行处理,之后,释放当前启动线程至线程池中等待下一次启动,即将对I/O请求数据进行处理的线程置入线程池中,通过数目有限的线程的线程池来服务于相对数目较多的I/O请求数据,超出线程池中线程数目大小的I/O请求数据需要进行等待,在线程池中出现空闲线程时,对I/O请求数据进行处理,由此避免了现有技术中对高并发的每个I/O请求数据都创建启动一个线程来对其进行处理,导致系统资源的浪费,降低系统资源的使用率,尤其是在I/O连接请求较多时,会引起系统资源严重不足,甚至系统瘫痪的技术问题。
其中,优选地,所述I/O等待集合的数据结构为队列的数据结构。
参考图9,其示出了本申请提供的一种REST服务装置实施例二的结构示意图,所述装置还包括第二线程启动单元807;
所述第一逻辑判断单元802在判断出所述线程池中存在处于空闲状态的线程时,触发所述第二线程启动单元807,依据预设的第二启动规则,启动所述线程池中一个处于空闲状态的线程,将所述I/O请求数据作为当前I/O请求数据进行处理,触发所述线程释放单元806释放所述当前启动线程至所述线程池。
由上述方案可知,本申请提供的一种REST服务装置实施例二,将对I/O请求数据进行处理的线程置入线程池中,通过数目有限的线程的线程池来服务于相对数目较多的I/O请求数据,超出线程池中线程数目大小的I/O请求数据需要进行等待。在线程池中存在空闲线程时,即可启动线程池中的一个空闲线程对I/O请求数据进行处理,并在线程池中的线程均处于非空闲状态时,将该I/O请求数据置入I/O等待集合进行等待,在线程池中出现由非空闲状态转换为空闲状态的线程时,启动该线程对I/O等待集合中的I/O请求数据进行处理,由此避免了现有技术中对高并发的每个I/O请求数据都创建启动一个线程来对其进行处理,导致系统资源的浪费,降低系统资源的使用率,尤其是在I/O连接请求较多时,会引起系统资源严重不足,甚至系统瘫痪的技术问题。
优选地,基于如图8所示的REST服务装置,参考图10,其示出了本申请提供的一种REST服务装置实施例三的结构示意图,其中,所述第一线程启动单元805包括数据读取子单元851、服务调用子单元852和数据写入子单元853,其中:
所述数据读取子单元851依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程,读取与所述当前I/O请求数据相对应的资源数据,触发所述服务调用子单元852调用与所述当前I/O请求相对应的服务,并对所述资源数据执行所述调用的服务;
所述数据写入子单元853将所述资源数据的执行结果进行写入。
需要说明的是,本申请装置实施例三的发明思想同样适用于本申请装置实施例二,即参考图11,其示出了本申请装置实施例三的另一种,基于如图9所示的REST服务装置的结构示意图。
参考图12,其示出了本申请提供的一种REST服务装置实施例四的结构示意图,所述装置还包括数据缓存单元808和数据写入单元809;
所述数据缓存单元808在所述数据接收单元801接收客户端发送的I/O请求数据之后,在所述第一逻辑判断单元802判断预设的线程池中的线程是否均处于非空闲状态之前,读取与所述I/O请求数据相对应的资源数据置入数据缓存集合中;
所述数据写入单元809在所述线程释放单元806释放所述当前线程至所述线程池后,将所述数据缓存集合中与所述当前I/O请求数据相对应的资源数据的执行结果进行写入;
其中,参考图13,其示出了本申请装置实施例四的另一结构示意图,其中,所述第一线程启动单元805包括线程启动子单元8511、服务调用子单元8522、数据缓存子单元8533,其中:
所述线程启动子单元8511依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程,触发所述服务调用子单元8522调用与所述当前I/O请求数据相对应的服务,并对所述数据缓存集合中与所述当前I/O请求数据相对应的资源数据执行所述调用的服务;
所述数据缓存子单元8533将所述资源数据的执行结果置入所述数据缓存集合中,触发所述线程释放单元806释放所述当前启动线程至所述线程池。
优选地,本申请装置实施例四为提高线程的利用率,为线程设置有数据缓存集合和事件分离器,该事件分离器监测客户端是否发送I/O请求数据,在客户端发送I/O请求数据之后,该事件分离器被触发,读取与所述I/O请求数据相对应的资源数据置入数据缓存集合中。
由上述方案可知,本申请提供的一种REST服务装置实施例四,通过在线程启动之前,读取与待处理的I/O请求数据相对应的资源数据置入数据缓存集合中,线程启动后,对数据缓存集合中的资源数据进行处理,避免了线程需要等待I/O读取数据,导致CPU资源浪费的情况,同时,在线程对资源数据处理完成后,首先将资源数据的执行结果置入数据缓存集合中,释放线程,再将数据缓存集合中的资源数据的执行结果进行写入,避免了线程需要等待I/O写入数据,导致CPU资源浪费的技术问题。
优选地,参考图14,其示出了本申请提供的一种REST服务装置实施例五的结构示意图,所述装置还包括第二逻辑判断单元810;
所述第二逻辑判断单元810在所述第一逻辑判断单元802判断预设的线程池中的线程是否均处于非空闲状态之前,查询预设的I/O等待集合中是否存在历史I/O请求数据,如果是,触发所述数据置入单元803,否则,触发所述第一逻辑判断单元802。
需要说明的是,本申请装置实施例五在判断线程池中是否含有非空闲线程前,首先判断I/O等待集合中是否非空,若所述I/O等待集合非空,则说明I/O等待集合中的数据并未被处理完成,即线程池中没有空闲线程,此时,直接将所述I/O请求数据置入所述I/O等待集合中;若所述I/O等待集合为空,则说明I/O等待集合中的数据已经被处理完成,此时,线程池中可能有线程处于空闲状态,此时再判断所述线程池中的线程是否均处于非空闲状态,并继续执行后续步骤。由于CPU对线程的判断时间要高于对某一存储位置是否为空的判断时间,由此本申请装置实施例五在实现高并发REST服务时,提高了服务效率。
参考图15,其示出了本申请提供的一种REST服务系统实施例的架构图,所述REST服务系统包括REST服务装置,所述REST服务装置的功能请参阅本申请文件装置实施例的具体说明,对此不再加以阐述。
本申请系统实施例引用于JAVA语言操作平台,以下为对其逻辑架构图进行进一步介绍:
1、REST Servlet:REST通讯接口
(1)、NIO Connector:高性能IO连接,其具体实现请参阅本申请装置实施例中的具体介绍。
(2)、SerialFilter:文本和JAVA对象的转换过滤器
2、Resource Hub:资源导航
(1)、资源过滤器:根据URL,HTTP方法,参数类型三者确定资源数据。
(2)、资源容器:负责整个资源数据的生命周期(创建-》运行-》停止-》销毁)。
3、Service Hub:服务入口
(1)、Service Filter:服务过滤器,通过资源数据来确定使用哪个服务的哪个方法。
4、Service:具体服务。
5、ThreadPool:线程池,所有的线程被维护在这个池中,以减少线程创建销毁的开销提高性能。
例如:本申请系统实施例在接受到客户端发送的I/O请求数据如用户ID(字符串)之后,先获取与该用户ID相对应的资源数据置入数据缓存集合中,再判断线程池中的线程是否均处于非空闲状态,如果是,将该I/O请求数据置入I/O等待集合中,等待线程池中有线程转换为空闲状态时,启动处于空闲状态的线程对数据缓存集合中与该用户ID相对应的资源数据进行处理,即通过资源导航调用与该用户ID相对应的服务,对该资源数据执行该服务的具体业务逻辑,释放启动线程后,再将该资源数据的执行结果进行写入。
若判断线程池中的线程并非均处于非空闲状态,则启动所述线程池中处于非空闲状态的一个线程对该用户ID进行后续处理。
优选地,为提高对高并发的REST服务的效率,本申请通过设置集群式的REST服务实现高并发REST服务。其中,集群中包括多个服务器,每个服务器上集成有至少一个REST服务系统,客户端通过心跳向服务器发出轮询信息,服务器接收到轮询信息后返回信息至客户端,若客户端没有接收到服务器的返回信息,则表明该服务器出现问题,无法正常工作。其中,所述服务器的返回信息中包括服务器的负载指数信息,客户端根据该负载指数信息选择当前负载最小的服务器即REST服务系统执行其所需要的功能,由此提高对高并发的REST服务的处理速度,获取更好的服务性能。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
最后,还需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
为了描述的方便,描述以上系统时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
以上对本申请所提供的一种REST服务方法、装置及系统进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
Claims (13)
1.一种REST服务方法,其特征在于,包括:
接收客户端发送的I/O请求数据;
判断预设的线程池中的线程是否均处于非空闲状态,如果是,将所述I/O请求数据置入所述I/O等待集合中;
其中,所述线程池中至少包括一个线程;
在所述线程池中出现处于空闲状态的线程时,获取所述I/O等待集合中的一个I/O请求数据作为当前I/O请求数据;
依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程对所述当前I/O请求数据进行处理;
释放所述当前启动线程至所述线程池。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
若所述线程池中存在处于空闲状态的线程,依据预设的第二启动规则,启动所述线程池中一个处于空闲状态的线程,将所述I/O请求数据作为当前I/O请求数据进行处理;
释放所述当前启动线程至所述线程池。
3.根据权利要求1所述的方法,其特征在于,所述依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程,对所述当前I/O请求数据进行处理包括:
依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程,读取与所述当前I/O请求数据相对应的资源数据;
调用与所述当前I/O请求数据相对应的服务,并对所述资源数据执行所述调用的服务;
将所述资源数据的执行结果进行写入。
4.根据权利要求1所述的方法,其特征在于,在所述接收客户端发送的I/O请求数据之后,在所述判断预设的线程池中的线程是否均处于非空闲状态之前,所述方法还包括:
读取与所述I/O请求数据相对应的资源数据置入数据缓存集合中;
所述依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程,对所述当前I/O请求数据进行处理包括:
依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程;
调用与所述当前I/O请求数据相对应的服务;
对所述数据缓存集合中与所述当前I/O请求数据相对应的资源数据执行所述调用的服务;
将所述资源数据的执行结果置入所述数据缓存集合中;
在所述释放所述当前启动线程至所述线程池之后,所述方法还包括:
将所述数据缓存集合中与所述当前I/O请求数据相对应的资源数据的执行结果进行写入。
5.根据权利要求1所述的方法,其特征在于,在所述接收客户端发送的I/O请求数据之后,在判断预设的线程池中的线程是否均处于非空闲状态之前,所述方法还包括:
查询预设的I/O等待集合中是否非空;
如果是,将所述I/O请求数据置入所述I/O等待集合中,并在所述线程池中出现处于空闲状态的线程时,获取所述I/O等待集合中的一个I/O请求数据作为当前I/O请求数据;
否则,判断预设的线程池中的线程是否均处于非空闲状态。
6.根据权利要求1所述的方法,其特征在于,所述I/O等待集合的数据结构为队列的数据结构;
所述将所述I/O请求数据置入所述I/O等待集合中包括:
将所述I/O请求数据置入数据结构为队列数据结构的I/O等待集合中。
7.一种REST服务装置,其特征在于,包括数据接收单元、第一逻辑判断单元、数据置入单元、数据获取单元、第一线程启动单元和线程释放单元,其中:
所述数据接收单元接收客户端发送的I/O请求数据,所述第一逻辑判断单元判断预设的线程池中的线程是否均处于非空闲状态,如果是,触发所述数据置入单元将所述I/O请求数据置入所述I/O等待集合中;
其中,所述线程池中至少包括一个线程;
所述数据获取单元在所述线程池中出现处于空闲状态的线程时,获取所述I/O等待集合中的一个I/O请求数据作为当前I/O请求数据,由所述第一线程启动单元依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程对所述当前I/O请求数据进行处理,触发所述线程释放单元释放所述当前启动线程至所述线程池。
8.根据权利要求7所述的装置,其特征在于,还包括第二线程启动单元;
所述第一逻辑判断单元在判断出所述线程池中存在处于空闲状态的线程时,触发所述第二线程启动单元,依据预设的第二启动规则,启动所述线程池中一个处于空闲状态的线程,将所述I/O请求数据作为当前I/O请求数据进行处理,触发所述线程释放单元释放所述当前启动线程至所述线程池。
9.根据权利要求7所述的装置,其特征在于,所述第一线程启动单元包括数据读取子单元、服务调用子单元和数据写入子单元,其中:
所述数据读取子单元依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程,读取与所述当前I/O请求数据相对应的资源数据,触发所述服务调用子单元调用与所述当前I/O请求相对应的服务,并对所述资源数据执行所述调用的服务;
所述数据写入子单元将所述资源数据的执行结果进行写入。
10.根据权利要求7所述的装置,其特征在于,还包括数据缓存单元和数据写入单元;
所述数据缓存单元在所述数据接收单元接收客户端发送的I/O请求数据之后,在所述第一逻辑判断单元判断预设的线程池中的线程是否均处于非空闲状态之前,读取与所述I/O请求数据相对应的资源数据置入数据缓存集合中;
所述数据写入单元在所述线程释放单元释放所述当前线程至所述线程池后,将所述数据缓存集合中与所述当前I/O请求数据相对应的资源数据的执行结果进行写入;
其中,所述第一线程启动单元包括线程启动子单元、服务调用子单元、数据缓存子单元,其中:
所述线程启动子单元依据预设的第一启动规则,启动所述线程池中一个处于空闲状态的线程,触发所述服务调用子单元调用与所述当前I/O请求数据相对应的服务,并对所述数据缓存集合中与所述当前I/O请求数据相对应的资源数据执行所述调用的服务;
所述数据缓存子单元将所述资源数据的执行结果置入所述数据缓存集合中,触发所述线程释放单元释放所述当前启动线程至所述线程池。
11.根据权利要求7所述的装置,其特征在于,还包括第二逻辑判断单元;
所述第二逻辑判断单元在所述第一逻辑判断单元判断预设的线程池中的线程是否均处于非空闲状态之前,查询预设的I/O等待集合中是否存在历史I/O请求数据,如果是,触发所述数据置入单元,否则,触发所述第一逻辑判断单元。
12.根据权利要求7所述的装置,其特征在于,所述I/O等待集合的数据结构为队列的数据结构。
13.一种REST服务系统,其特征在于,包括如上述权利要求7至12中任意一项所述的REST服务装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210276257.0A CN103577257A (zh) | 2012-08-03 | 2012-08-03 | 一种rest服务方法、装置及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210276257.0A CN103577257A (zh) | 2012-08-03 | 2012-08-03 | 一种rest服务方法、装置及系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN103577257A true CN103577257A (zh) | 2014-02-12 |
Family
ID=50049100
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210276257.0A Pending CN103577257A (zh) | 2012-08-03 | 2012-08-03 | 一种rest服务方法、装置及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103577257A (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105373420A (zh) * | 2014-08-28 | 2016-03-02 | 北京奇虎科技有限公司 | 数据传输方法及装置 |
CN106817411A (zh) * | 2016-12-28 | 2017-06-09 | 华为技术有限公司 | 业务访问请求的处理方法和相关设备 |
CN108459825A (zh) * | 2018-01-30 | 2018-08-28 | 深圳神州数码云科数据技术有限公司 | 一种存储系统服务质量控制方法和装置 |
CN108762913A (zh) * | 2018-03-23 | 2018-11-06 | 阿里巴巴集团控股有限公司 | 服务处理方法及装置 |
CN109032783A (zh) * | 2018-08-01 | 2018-12-18 | 杭州朗和科技有限公司 | 信息交互方法、介质、装置和计算设备 |
CN109298950A (zh) * | 2018-08-15 | 2019-02-01 | 深圳壹账通智能科技有限公司 | 企业服务总线系统、数据处理方法、终端及存储介质 |
CN110134578A (zh) * | 2019-05-23 | 2019-08-16 | 浙江齐治科技股份有限公司 | 一种数据处理方法及装置 |
-
2012
- 2012-08-03 CN CN201210276257.0A patent/CN103577257A/zh active Pending
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105373420A (zh) * | 2014-08-28 | 2016-03-02 | 北京奇虎科技有限公司 | 数据传输方法及装置 |
CN105373420B (zh) * | 2014-08-28 | 2019-12-06 | 北京奇虎科技有限公司 | 数据传输方法及装置 |
CN106817411A (zh) * | 2016-12-28 | 2017-06-09 | 华为技术有限公司 | 业务访问请求的处理方法和相关设备 |
WO2018121625A1 (zh) * | 2016-12-28 | 2018-07-05 | 华为技术有限公司 | 业务访问请求的处理方法和相关设备 |
CN106817411B (zh) * | 2016-12-28 | 2020-06-02 | 华为技术有限公司 | 业务访问请求的处理方法和相关设备 |
CN108459825A (zh) * | 2018-01-30 | 2018-08-28 | 深圳神州数码云科数据技术有限公司 | 一种存储系统服务质量控制方法和装置 |
CN108459825B (zh) * | 2018-01-30 | 2020-12-29 | 深圳神州数码云科数据技术有限公司 | 一种存储系统服务质量控制方法和装置 |
CN108762913A (zh) * | 2018-03-23 | 2018-11-06 | 阿里巴巴集团控股有限公司 | 服务处理方法及装置 |
CN109032783A (zh) * | 2018-08-01 | 2018-12-18 | 杭州朗和科技有限公司 | 信息交互方法、介质、装置和计算设备 |
CN109032783B (zh) * | 2018-08-01 | 2021-06-29 | 杭州朗和科技有限公司 | 信息交互方法、介质、装置和计算设备 |
CN109298950A (zh) * | 2018-08-15 | 2019-02-01 | 深圳壹账通智能科技有限公司 | 企业服务总线系统、数据处理方法、终端及存储介质 |
CN110134578A (zh) * | 2019-05-23 | 2019-08-16 | 浙江齐治科技股份有限公司 | 一种数据处理方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103577257A (zh) | 一种rest服务方法、装置及系统 | |
CN100375093C (zh) | 多线程元数据的处理方法 | |
CN101266554B (zh) | 一种嵌入式终端的多媒体应用处理方法以及装置 | |
CN109309631A (zh) | 一种基于通用网络文件系统写入数据的方法及装置 | |
CN110134534B (zh) | 基于nio针对大数据分布式系统进行消息处理优化的系统及方法 | |
CN104050029A (zh) | 一种任务调度系统 | |
CN102567111A (zh) | 一种异步过程调用的方法、系统和终端设备 | |
CN104092719A (zh) | 文件传输方法、装置及分布式集群文件系统 | |
CN108055311B (zh) | Http异步请求方法、装置、服务器、终端和存储介质 | |
US9836516B2 (en) | Parallel scanners for log based replication | |
CN108055304B (zh) | 远程数据的同步方法、装置、服务器、设备和存储介质 | |
CN110413822B (zh) | 离线图像结构化分析方法、装置、系统和存储介质 | |
CN101661392B (zh) | 在移动终端上运行专用界面工具的方法、装置及设备 | |
CN104899274A (zh) | 一种内存数据库高效远程访问方法 | |
CN104144202A (zh) | Hadoop分布式文件系统的访问方法、系统和装置 | |
CN106803841B (zh) | 消息队列数据的读取方法、装置及分布式数据存储系统 | |
CN106155842B (zh) | 一种数据迁移方法及装置 | |
CN111290842A (zh) | 一种任务执行方法和装置 | |
CN108874798B (zh) | 一种大数据排序方法和系统 | |
WO2011114477A1 (ja) | 階層型マルチコアプロセッサ、マルチコアプロセッサシステム、および制御プログラム | |
CN109302435A (zh) | 消息发布方法、装置、系统、服务器及计算机可读存储介质 | |
CN111190731A (zh) | 基于权重的集群任务调度系统 | |
CN109088907B (zh) | 文件传递方法及其设备 | |
CN109669941A (zh) | 数据异步持久化方法、装置及计算机可读存储介质 | |
CN103399949B (zh) | 一种数据库存储块状态控制方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20140212 |