请求处理方法、服务器及计算机可读存储介质与流程

文档序号:15636334发布日期:2018-10-12 21:31阅读:124来源:国知局

本发明涉及计算机领域,尤其涉及一种请求处理方法、服务器及计算机可读存储介质。



背景技术:

服务器server的性能决定着服务的质量,主要体现在服务的延时和吞吐,如何利用有限的计算机硬件资源攫取更高的服务性能成为server设计者追求的目标。一般的系统都提供了完整的一套网络编程接口和并发编程机制,供开发者使用,如何合理有效地使用这些接口和机制,构建一套完整通用的高效的server模型,对server开发者有积极的指导意义,对server的使用者有更快的响应,更高的性能。

thrift(facebook的核心技术框架之一)的tnonblockingserver是thrift所有server中可用性和伸缩性最好的。tnonblockingserver的设计全部基于事件回调机制,包括连接监听,创建客户端连接,处理客户端请求等,所有调用都是非阻塞的,但是它并不是不需要等待,在处理线程处理某个连接上的某一个请求时,此连接不再读取下一个调用请求,直到处理线程完成本次处理,并将结果发送给客户端为止,也就是说一个连接在接收请求、处理请求、发送响应这三步中是同步的,虽然处理请求是在一个线程池里完成的,但是接收和发送线程还需要等待。

可见,现有的server模型存在的连接需要等待,进而影响响应速度的问题。



技术实现要素:

鉴于上述问题,提出了本发明实施例以便提供一种解决上述问题的请求处理方法、服务器及计算机可读存储介质。

依据本发明实施例的一个方面,提供一种请求处理方法,应用于服务器侧,包括:

通过创建的多个接收线程、多个读请求线程、多个任务处理线程,并行的对客户端发送的连接请求依次进行监听、读取和处理,并通过创建的多个发送线程并行的将处理后的消息发送给所述客户端;

其中,监听到的连接请求存入供所述多个读请求线程进行信息读取的连接队列;存入的连接队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,读请求线程的个数),mod为取余;

处理后得到的消息存入供所述多个发送线程进行信息读取的发送队列;存入的发送队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,发送线程的个数)。

可选地,所述读请求线程的个数与所述发送线程的个数相同;

和/或,所述多个读请求线程与多个连接队列一一对应;所述多个发送线程与多个发送多列一一对应。

可选地,所述通过创建的多个接收线程、多个读请求线程、多个任务处理线程,并行的对客户端发送的连接请求依次进行监听、读取和处理,包括:

通过所述多个接收线程并行的监听客户端的连接请求,并将监听到的所述连接请求存入所述连接队列;

通过所述多个读请求线程并行的在所述连接队列中读取连接请求,并将读取的连接请求封装后存入请求队列;

通过所述多个任务处理线程并行的在所述请求队列中读取连接请求后进行请求处理,并将请求处理后得到的消息存入所述发送队列。

可选地,所述请求队列为一个或多个;

当请求队列为多个时,存入的请求队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,任务处理线程的个数)。

可选地,所述通过创建的多个发送线程并行的将处理后的消息发送给所述客户端,具体包括:

通过所述多个发送线程并行的在所述发送队列中读取处理后的消息,并将所述消息写入连接写缓冲区;

通过所述多个发送线程将所述连接写缓冲区中消息发送给所述客户端。

可选地,所述方法还包括:

通过所述多个读请求线程实时的检测所述连接写缓冲区是否已满,并在检测结果为是时,通知所述多个发送线程停止对所述连接写缓冲区的写入操作。

依据本发明实施例的另一个方面,提供一种服务器,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如下方法步骤:

通过创建的多个接收线程、多个读请求线程、多个任务处理线程,并行的对客户端发送的连接请求依次进行监听、读取和处理,并通过创建的多个发送线程并行的将处理后的消息发送给所述客户端;

其中,监听到的连接请求存入供所述多个读请求线程进行信息读取的连接队列;存入的连接队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,读请求线程的个数),mod为取余;

处理后得到的消息存入供所述多个发送线程进行信息读取的发送队列;存入的发送队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,发送线程的个数)。

可选地,所述读请求线程的个数与所述发送线程的个数相同;

和/或,所述多个读请求线程与多个连接队列一一对应;所述多个发送线程与多个发送多列一一对应。

可选地,所述处理器在执行通过创建的多个接收线程、多个读请求线程、多个任务处理线程,并行的对客户端发送的连接请求依次进行监听、读取和处理时,具体包括:

通过所述多个接收线程并行的监听客户端的连接请求,并将监听到的所述连接请求存入所述连接队列;

通过所述多个读请求线程并行的在所述连接队列中读取连接请求,并将读取的连接请求封装后存入请求队列;

通过所述多个任务处理线程并行的在所述请求队列中读取连接请求后进行请求处理,并将请求处理后得到的消息存入所述发送队列。

可选地,所述请求队列为一个或多个;当请求队列为多个时,存入的请求队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,任务处理线程的个数)。

可选地,所述处理器在执行通过创建的多个发送线程并行的将处理后的消息发送给所述客户端时,具体包括:

通过所述多个发送线程并行的在所述发送队列中读取处理后的消息,并将所述消息写入连接写缓冲区;

通过所述多个发送线程将所述连接写缓冲区中消息发送给所述客户端。

可选地,所述计算机程序被所述处理器执行时,还包括:

通过所述多个读请求线程实时的检测所述连接写缓冲区是否已满,并在检测结果为是时,通知所述多个发送线程停止对所述连接写缓冲区的写入操作。

依据本发明实施例的第三个方面,提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,该程序被处理器执行时实现如下方法步骤:

通过创建的多个接收线程、多个读请求线程、多个任务处理线程,并行的对客户端发送的连接请求依次进行监听、读取和处理,并通过创建的多个发送线程并行的将处理后的消息发送给所述客户端;

其中,监听到的连接请求存入供所述多个读请求线程进行信息读取的连接队列;存入的连接队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,读请求线程的个数),mod为取余;

处理后得到的消息存入供所述多个发送线程进行信息读取的发送队列;存入的发送队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,发送线程的个数)。

本发明实施例提供的方法、服务器及存储介质,将服务器处理的不同阶段进行细分,针对每个阶段通过不同的线程进行并行处理,线程间互不影响、读请求线程和发送线程只处理属于自己的连接和响应,线程间无需做不必要的等待,无需队列加锁,能很大程度提高服务器的吞吐,防止不必要的等待,从而提高服务器的响应时间和吞吐能力,作为服务器设计的普适模型,有很好的指导意义。

上述说明仅是本发明实施例技术方案的概述,为了能够更清楚了解本发明实施例的技术手段,而可依照说明书的内容予以实施,并且为了让本发明实施例的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明实施例的具体实施方式。

附图说明

通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明实施例的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:

图1为本发明第一实施例提供的一种请求处理方法的流程图;

图2为本发明第二实施例提供的一种请求处理方法的流程图;

图3为本发明第三实施例提供的一种请求处理方法的流程图;

图4为本发明第四实施例中server架构的工作模式示意图;

图5为本发明第五实施例提供的一种服务器的结构框图。

具体实施方式

下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。

在本发明第一实施中提供一种请求处理方法,应用于服务器,如图1所示,所述方法包括如下步骤:

步骤s101,通过创建的多个接收线程、多个读请求线程、多个任务处理线程,并行的对客户端发送的连接请求依次进行监听、读取和处理;

步骤s102,通过创建的多个发送线程并行的将处理后的消息发送给所述客户端。

本发明实施例中,将服务器的各个处理阶段细分为请求接收阶段、读请求阶段、请求处理阶段以及发送响应阶段,针对每个阶段使用不同的多个并行线程去处理,相邻的阶段相互联系,但互不影响,以此达到全异步、无等待、无浪费,进而提高了连接的响应效率。

具体的,本发明实施例中,通过创建的多个接收线程、多个读请求线程、多个任务处理线程,并行的对客户端发送的连接请求依次进行监听、读取和处理,具体包括:

通过所述多个接收线程并行的监听客户端的连接请求,并将监听到的所述连接请求存入所述连接队列;

通过所述多个读请求线程并行的在所述连接队列中读取连接请求,并将读取的连接请求封装后存入请求队列;

通过所述多个任务处理线程并行的在所述请求队列中读取连接请求后进行请求处理,并将请求处理后得到的消息存入所述发送队列。

本发明实施例中,连接队列、发送队列为多个。具体的,将监听到的连接请求存入的连接队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,读请求线程的个数),其中,mod为取余;

将请求处理后得到的消息存入的发送队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,发送线程的个数)。

本发明实施例中,读请求线程的个数与发送线程的个数相同。并且,多个读请求线程与多个连接队列一一对应;多个发送线程与多个发送多列一一对应。

本发明实施例,通过连接请求的来源套接字描述符的值与线程个数取余的方式,确定信息存储的队列,实现了队列不加锁。

总之,本实施例通过将服务器处理的各个环节细分,读请求线程和发送线程只处理属于自己的连接和响应,无需加锁,能很大程度提高服务器的吞吐,防止不必要的等待,最大化利用计算资源,从而提高服务器的响应时间和吞吐能力,作为服务器设计的普适模型,有很好的指导意义。

在本发明第二实施例中,提供一种请求处理方法,应用于服务器,如图2所示,所述方法包括如下步骤:

步骤s201,通过所述多个接收线程并行的监听客户端的连接请求,并将监听到的所述连接请求存入所述连接队列;其中,存入的连接队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,读请求线程的个数);

步骤s202,通过所述多个读请求线程并行的在所述连接队列中读取连接请求,并将读取的连接请求封装后存入请求队列;其中,存入的请求队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,任务处理线程的个数);

步骤s203,通过所述多个任务处理线程并行的在所述请求队列中读取连接请求后进行请求处理,并将请求处理后得到的消息存入所述发送队列;其中,存入的发送队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,发送线程的个数);

步骤s204,通过创建的多个发送线程并行的将处理后的消息发送给所述客户端。

本实施例相对于第一实施例,区别在于请求队列也为多个,避免了采用一个请求队列,任务处理线程要互斥的从请求队列中取请求,影响处理效率的问题。所以,进一步的提高了连接响应效率。

在本发明第三实施例中,提供一种请求处理方法,应用于服务器,如图3所示,所述方法包括如下步骤:

步骤s301,通过所述多个接收线程并行的监听客户端的连接请求,并将监听到的所述连接请求存入所述连接队列;其中,存入的连接队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,读请求线程的个数);

步骤s302,通过所述多个读请求线程并行的在所述连接队列中读取连接请求,并将读取的连接请求封装后存入请求队列;其中,存入的请求队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,任务处理线程的个数);

步骤s303,通过所述多个任务处理线程并行的在所述请求队列中读取连接请求后进行请求处理,并将请求处理后得到的消息存入所述发送队列;其中,存入的发送队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,发送线程的个数);

步骤s304,通过所述多个发送线程并行的在所述发送队列中读取处理后的消息,并将所述消息写入连接写缓冲区;

步骤s305,通过所述多个发送线程将所述连接写缓冲区中消息发送给所述客户端。

本发明实施例中,多个读请求线程还实时的检测连接写缓冲区是否已满,并在检测结果为是时,通知多个发送线程停止对连接写缓冲区的写入操作。

本发明实施例相对于第二实施例,实现了缓冲区满时收读请求线程与发送线程互相通信,避免了缓冲区溢,为正常的处理请求提供了重要支持。

在本发明的第四实施例中,提供一种请求处理方法,应用于服务器,本实施例通过一个具体的应用示例,对本发明的实施过程进行更详尽的阐述,用以更好的支持第一、第二、第三实施例的实施过程。需要指出的是,本实施例纰漏的技术细节,用于解释本发明,但不用于唯一限定本发明。

本发明实施例的所述请求处理方法,核心思想在于:将server的各个处理阶段细分,每个阶段使用不同的线程组去处理,线程组内线程的数量可以依据计算量大小分配线程资源,各个阶段互不影响,但是相互联系,以此达到server架构的全异步,无等待,无浪费。

如图4所示,为server架构的工作模式示意图,具体的,本实施例中,server分为请求接收阶段,读请求阶段,请求处理阶段,发送响应阶段。

server在各个阶段创建一定数量的并行线程,具体的:接收阶段包括并行的多个接收线程、请求阶段包括并行的多个读请求线程、请求处理阶段包括并行的多个任务处理线程、发送响应阶段包括并行的多个发送线程。其中,读请求线程的个数和发送线程的个数相等。

同时,server内还维护多个队列,分别为连接队列、请求队列和发送队列;其中,连接队列和发送队列为多个,请求队列可以为一个也可以为多个。

本实施例中,每个读请求线程唯一对应一个连接队列、每个发送线程唯一对应一个发送队列。

需要指出的是,图4中示出的是请求队列为一个的情况,并且图4中未将“连接队列”、“发送队列”示出,图中虽然将接收线程和读请求线程做了直连,但是并不说明二者直接通信,二者之间还设有连接队列,存入的连接队列的队列序号为:fdmodn,其中,fd表示连接请求的来源套接字描述符的值,n表示读请求线程。同理,任务处理线程和发送线程间也设有发送队列。

下面对本发明实施例提供的请求处理方法的实施过程进行阐述,具体的:

本实施例中,server根据需要创建一定数量的接收线程,负责监听来自客户端的请求。客户端有请求后,接收线程创建描述客户端的连接的结构体,存入连接队列,连接队列有多个,每个连接存放的队列序号=mod(连接请求的来源套接字描述符的值,读请求的线程个数),这样做的目的是不需要对连接队列加锁。

本发明实施例中,读请求线程都有自己独有的连接队列,读请求线程读取自己的连接队列中所有的连接中的所有请求,将请求封装成包,存入请求队列,作为任务处理的输入。具体的,当请求队列列为一个时,直接存入请求队列;当请求队列为多个时,读请求线程将请求存入请求队列的时,存入的请求队列的队列序号=mod(连接请求的来源套接字描述符的值,任务处理线程的个数),目的也是不需要对请求队列加锁。

本发明实施例中,当请求队列为一个时,任务处理线程互斥的从请求队列中取请求,当请求队列为多个时,每一个任务处理线程对应一个请求队列,任务处理线程从自己的请求队列中取请求,不需要互斥访问队列。

本发明实施例中,各任务处理线程并的发处理请求,请求处理完,将处理结果封包,按照这个请求的来源套接字描述符,存入对应的发送队列。存入的发送队列的队列序号=mod(连接请求的来源套接字描述符的值,发送线程的个数),目的也是不需要对发送队列加锁。

本发明实施例中,每一个发送线程对应一个发送队列,发送线程从各自的发送队列中取处理结果,并将处理结果发送给客户端。

本发明实施例中,发送线程从发送队列中取到处理结果后,将其存入连接写缓冲区,读请求线程检测到连接写缓冲区是否已满,并根据检测结果通知发送线程是否可以写缓冲区。

综上可知,本发明实施例中,连接不需要等待请求处理,一直读取客户端请求,任务处理完后不需要关心将响应发送给客户端,有单独的发送线程发送;读请求线程和发送线程不需要对连接队列和发送队列互斥访问,每个线程都有对应的队列;每一个任务处理线程可以有对应的请求队列,不同的任务处理线程并行处理请求。

所以,本发明实施例通过将server处理的各个环节细分,收发线程只处理属于自己的连接和响应,无需加锁,能很大程度提高server的吞吐,防止不必要的等待,最大化利用计算资源,从而提高server的响应时间和吞吐能力,作为server设计的普适模型,有很好的指导意义。

在本发明的第五实施例中,提供一种服务器,如图5所示,包括:存储器510、处理器520及存储在所述存储器510上并可在所述处理器520上运行的计算机程序,所述计算机程序被所述处理器520执行时实现如下方法步骤:

步骤1,通过创建的多个接收线程、多个读请求线程、多个任务处理线程,并行的对客户端发送的连接请求依次进行监听、读取和处理;

步骤2,通过创建的多个发送线程并行的将处理后的消息发送给所述客户端;

其中,监听到的连接请求存入供所述多个读请求线程进行信息读取的连接队列;存入的连接队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,读请求线程的个数),mod为取余;

处理后得到的消息存入供所述多个发送线程进行信息读取的发送队列;存入的发送队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,发送线程的个数)。

本发明实施例中,读请求线程的个数与所述发送线程的个数相同;并且多个读请求线程与多个连接队列一一对应;多个发送线程与多个发送多列一一对应。

可选地,本发明实施例中,处理器520在执行通过创建的多个接收线程、多个读请求线程、多个任务处理线程,并行的对客户端发送的连接请求依次进行监听、读取和处理时,具体包括:

通过所述多个接收线程并行的监听客户端的连接请求,并将监听到的所述连接请求存入所述连接队列;

通过所述多个读请求线程并行的在所述连接队列中读取连接请求,并将读取的连接请求封装后存入请求队列;

通过所述多个任务处理线程并行的在所述请求队列中读取连接请求后进行请求处理,并将请求处理后得到的消息存入所述发送队列。

其中,当请求队列为多个时,存入的请求队列的队列序号为:mod(所述连接请求的来源套接字描述符的值,任务处理线程的个数)。

可选地,本发明实施例中,处理器520在执行通过创建的多个发送线程并行的将处理后的消息发送给所述客户端时,具体包括:

通过所述多个发送线程并行的在所述发送队列中读取处理后的消息,并将所述消息写入连接写缓冲区;

通过所述多个发送线程将所述连接写缓冲区中消息发送给所述客户端。

可选地,本发明实施例中,计算机程序被所述处理器执行时,还包括:

通过所述多个读请求线程实时的检测所述连接写缓冲区是否已满,并在检测结果为是时,通知所述多个发送线程停止对所述连接写缓冲区的写入操作。

针对本发明实施例的具体实施过程可参见第一至第四实施例,本实施例再次不再赘述。

总之,本实施例提供的服务器,将服务器处理的不同阶段进行细分,针对每个阶段通过不同的线程进行并行处理,线程间互不影响、读请求线程和发送线程只处理属于自己的连接和响应,线程间无需做不必要的等待,无需队列加锁,能很大程度提高服务器的吞吐,防止不必要的等待,从而提高服务器的响应时间和吞吐能力,作为服务器设计的普适模型,有很好的指导意义。

在本发明的第六实施例中,提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,该程序被处理器执行时实现如第一、第二、第三或者第四实施例所述的请求处理方法的步骤。

由于第一至第四实施例已经对请求处理的详细过程进行了阐述,本实施例在此不再赘述。

在本申请所提供的实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本发明的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

另外,在本发明各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。

总之,以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1