专利名称:一种实现单机支持高并发处理方法及系统的制作方法
技术领域:
本发明涉及一种网络数据传输,尤其涉及单机支持高并发访问的处理方法及系统。
背景技术:
并发是指网站在同一时间访问的人数,人数越多,瞬间带宽要求更高,也就是要求服务器瞬间处理的流量越大,当并发数超过一定量(例如百万级)后称为高并发,网站如果要在短时间内响应高并发的请求,需要对服务器的处理能力提出更高要求。目前已有的高并发解决方案,多采用分布式的集群部署方式。这种方式要求前端布置一个服务器,后端布置多台服务器,前端的一个服务器用于负载均衡,将并发转发给后端的服务器,后端的服务器进行业务处理。这种分布式的系统架构虽然对高并发处理具有一定的效果,但其系统设计及部署都比较复杂,并且整体成本较高。而单机(即单服务器)环境下支持的并发数小,当单机系统需要支持更多用户时,只能通过部署更多软硬件来扩容,造成资源浪费,成本增加。
发明内容
本发明要解决的主要技术问题是,提供一种实现单机支持高并发处理方法及系统,不需要分布式的集群部署,而是采用单机系统来支持多用户的高并发处理,使单机系统实现支持更多用户。根据本发明的第一方面,提供一种实现单机支持高并发处理方法,包括由同一服务器执行的主线程工作步骤和工作线程工作步骤,所述主线程工作步骤包括:主线程监听事件;当主线程监听到事件后,判断事件类型;按照事件类型对该事件进行响应和处理,当事件类型为客户端新连接事件时,接收新的套接字并对新的套接字进行处理;当事件类型为传输请求事件时,接收传输请求指令,根据传输请求指令生成请求消息添加到接收消息队列等待工作线程的读取;当事件类型为输出事件时,将处于发送状态的数据进行发送处理;所述工作线程工作步骤包括:读取接收消息队列中的请求消息;获取请求消息的响应数据并将响应数据处置为发送状态,以供主线程进行发送处理。根据本发明的第二方面,提供一种实现单机支持高并发处理系统,包括:接收消息队列,其用于接收消息;主线程,其用于监听事件,当监听到事件后,判断事件类型,按照事件类型对该事件进行响应和处理,当事件类型为客户端新连接事件时,接收新的套接字并对新的套接字进行处理;当事件类型为传输请求事件时,接收传输请求指令,并根据指令生成请求消息添加到接收消息队列;当事件类型为输出事件时,将处于发送状态的数据进行发送处理;工作线程,其用于读取接收消息队列中的请求消息,获取请求消息的响应数据并将响应数据处置为发送状态,以供主线程进行发送处理;所述接收消息队列、主线程和工作线程位于同一服务器上。根据本发明的第三方面,提供一种实现单机支持高并发状态下对传输请求事件的处理方法,包括:主线程检测到一个传输请求事件时,读取指令头及指令体数据,根据请求的指令头及指令体生成一个请求消息,将请求消息添加到接收消息队列;工作线程从接收消息队列中取出一条请求消息,根据请求消息创建响应消息头,然后调用业务处理函数对请求消息进行处理,生成响应数据,将响应数据关联到数据发送指针上,并触发输出事件;主线程检测到输出事件后,从数据发送指针上取出关联的响应数据,并将响应数据发送出去。本发明通过主要包括主线程、接收消息队列和工作线程的高并发处理系统架构,对不同类型事件进行不同处理,使单机系统实现了支持更多用户的并发访问,不需要分布式的集群部署,架构简单,整体成本较低。
图1为本发明一种实施例中高并发处理系统的架构图;图2为本发明一种实施例中主线程工作流程图;图3为本发明一种实施例中工作线程工作流程图;图4为本发明一种实施例中对传输请求事件的处理流程图;图5为本发明一种实施例中实现单机支持高并发处理的主流程图;图6为本发明一种具体实例中主线程工作流程图;图7为本发明一种具体实例中工作线程工作流程图。
具体实施例方式下面通过具体实施方式
结合附图对本发明作进一步详细说明。本申请通过在单机(即同一台服务器)系统上设计高并发处理系统,通过对不同类型事件的不同处理,对多用户(例如百万级用户)的并发请求做出响应和处理。请参考图1,实现单机支持高并发处理系统的架构如图1所示,包括位于同一服务器I上主线程10、接收消息队列20和工作线程30,其中主线程10用于创建工作线程30、监听事件,当监听到事件后,判断事件类型,按照事件类型对该事件进行响应和处理,当事件类型为客户端新连接事件时,接收新的套接字并对新的套接字进行处理;当事件类型为传输请求事件时,接收传输请求指令,根据传输请求指令生成请求消息添加到接收消息队列;当事件类型为输出事件时,将处于发送状态的数据进行发送处理。接收消息队列20用于接收主线程10发送来的消息,将消息进行先入先出处理或按照预先设定的优先级缓存和输出。工作线程30用于读取接收消息队列中的请求消息,调用函数处理后得到请求消息的响应数据并将响应数据处置为发送状态,以供主线程10进行发送处理。
在一具体实例中,主线程10包括监听模块11、输入处理模块12和输出处理模块
13。监听模块11用于监听服务器系统底层触发的事件,读取底层在事件中设置的标识,根据标识判断事件类型,当事件类型为客户端新连接事件或已连接客户的传输请求事件时,作为输入事件发信息给输入处理模块12,并通知输入处理模块12事件的类型。输入处理模块12根据事件类型进行接收和处理。当事件类型为客户端新连接事件时,输入处理模块12循环接收新的套接字,如果接收失败,则结束内部循环,如果接收成功,将新的套接字加入服务器系统的I/O模型队列中,当接收到数据读取完毕标识时,则结束事件处理。当事件类型为传输请求事件时,输入处理模块12接收传输请求指令的指令头及指令体,验证合法后,组成一个请求消息,添加到接收消息队列中。在接收指令时,输入处理模块12根据指令头中描述的长度信息动态分配指令体缓存空间,接收指令体数据,并将接收到的指令体数据放入指令体缓存空间,判断指令的接收状态,如果整个指令接收成功,则将指令体缓存空间中的指令体数据放入消息队列;如果接收到数据读取完毕标识,则结束事件处理;如果接收失败则结束事件的处理。当事件类型为输出事件时,监听模块11发信息给输出处理模块13,输出处理模块13从数据发送指针上读取处于发送状态的数据,将该数据打包发送,在发送数据后判断数据发送状态,当判断数据发送成功后,将I/O模型队列中与接收该数据的客户端的套接字中的输出事件修改为传输请求事件,以便接收来自于该客户端的下一传输请求事件,提高响应速度。当输出处理模块13判断数据发送失败后,结束事件处理。在另一实施例中,请参考图1,实现单机支持高并发处理系统还包括与接收消息队列20、主线程10和工作线程30位于同一服务器I上的会话管理器40,会话管理器40用于对客户端信息进行添加、更新或删除,所述客户端信息由主线程写入或删除。当事件类型为客户端新连接事件且输入处理模块12接收该客户端的套接字成功后,输入处理模块12将客户端信息写入会话管理器40。客户端信息包括客户端登录网站信息、心跳信息和连接时长中的至少一种。当事件类型为来自于已在会话管理器40中建立客户端信息的客户端的传输请求事件时,如果输入处理模块12接收该客户端的传输请求指令不成功,则将I/O模型队列中该客户端的套接字删除,并将会话管理器40中该客户端的客户端信息删除。当事件类型为输出事件时,如果输出处理模块13判断数据发送失败后,将I/O模型队列中与接收该数据的客户端的套接字删除,并删除会话管理器中该客户端信息。如果输入处理模块12接收传输请求指令不成功或输出处理模块13发送数据不成功,说明套接字有误,所以将I/o模型队列中该客户端的套接字和会话管理器40中该客户端的客户端信息删除,以便再次触发关于该客户端的事件时作为客户端新连接事件,在I/O模型队列中和会话管理器40中记录该客户端的新的套接字,使服务器系统应用层可以和传输层通过新的套接字接口。这样可避免由于通过旧的、无效的或错误的套接字接收或发送数据而导致的连接时间过长的问题,从而可提高对并发访问的响应速度。因此,在输入处理模块12接收传输请求指令不成功或输出处理模块13发送数据不成功时,也可以将I/o模型队列中该客户端的套接字和会话管理器40中该客户端的客户端信息中的套接字删除,而保留会话管理器40中该客户端的客户端信息中的其他信息,例如保留客户端通信的IP地址、使用的传输层协议(TCP或UDP)、客户端使用的端口号和心跳信息。当下次该客户端发出新连接事件时,根据客户端通信的IP地址将该客户端的新的套接字更新到该客户端信息中。
在另一具体实例中,删除客户端信息的方式还可以按套接字删除,也可以按超时时间删除。在会话管理器40写入客户端信息后,在一具体实例中,工作线程30从接收消息队列20中读取一请求消息,根据该请求消息动态分配响应数据缓存空间,读取会话管理器40中与传输请求事件对应的客户端信息,将响应数据存入响应数据缓存空间,将响应数据缓存空间关联到数据发送指针上,并触发输出事件。客户端信息可提供给上层应用程序(即业务处理函数)。建立会话管理器的另一效果是可将其中记录有信息的客户端和服务器保持长连接,例如在客户端信息中保存有心跳信息,心跳是维持长连接的基本要素。长连接使客户端有请求产生时,可随时处理,不需重新建立连接,节省了处理时间,提高了任务处理效率。基于上述架构,在单机支持高并发处理时包括主线程工作步骤和工作线程工作步骤,其中主线程工作步骤如图2所示,包括以下步骤:步骤S21,主线程监听事件。在一实施例中,首先创建监听套接字,将监听套接字绑定所述服务器的IP地址和端口,在主线程监听事件过程中监听来自于被绑定的服务器的IP地址和端口的事件。步骤S22,当主线程监听到事件后,判断事件类型。可根据所述服务器底层对事件设置的标识判断事件类型。步骤S23,按照事件类型对该事件进行响应和处理,当事件类型为客户端新连接事件时,则执行步骤S24,接收新的套接字并对新的套接字进行处理。当事件类型为传输请求事件时,执行步骤S25,接收传输请求指令,根据传输请求指令生成请求消息添加到接收消息队列等待工作线程的读取。当事件类型为输出事件时,执行步骤S26,将处于发送状态的数据进行发送处理。在步骤S24中,主线程的一种处理方案为:主线程循环接收新的套接字,如果接收失败,则结束内部循环,如果接收成功,则记录客户端信息,当接收到数据读取完毕标识时,则结束事件处理。将新的套接字加入服务器系统的I/o模型队列中,并将与该新的套接字对应的客户端信息添加到会话管理器中。新的套接字接收成功后,将新的套接字设置为非阻塞状态,当系统从非阻塞的套接字上接收消息时,如果该套接字上没有消息,会立即返回,不再长时间等待,从而提高处理速度。在步骤S25中,主线程的一种处理方案为:主线程接收传输请求指令的指令头,根据指令头中描述的长度信息动态分配指令体缓存空间,接收指令体数据,并将接收到的指令体数据放入指令体缓存空间,判断指令的接收状态,如果整个指令接收成功,则根据指令头及指令体缓存空间中的指令体数据生成请求消息,并将请求消息添加到接收消息队列,如果接收到数据读取完毕标识,则结束事件处理。在步骤S26中,主线程的一种处理方案为:主线程将处于发送状态的数据进行打包发送,在发送数据后判断数据发送状态,当判断数据发送成功后,将I/o模型队列中与接收该数据的客户端的套接字中的输出事件修改为传输请求事件,当输出处理模块13判断数据发送失败后,结束事件处理。其中工作线程工作步骤如图3所示,包括以下步骤:步骤S31,读取接收消息队列中的请求消息。
步骤S32,调用业务处理函数对请求消息进行处理,生成响应数据。在一种具体实例中,根据请求消息创建响应消息头,响应消息头包含服务类型,序号,服务状态,及响应指令体大小等信息,客户端接收到响应头后,就能知道服务处理的状态。工作线程根据请求消息动态分配响应数据缓存空间,调用上层应用设置的回调函数处理业务逻辑,生成响应数据,将响应数据存入响应数据缓存空间。步骤S33,获取请求消息的响应数据并将响应数据处置为发送状态,以供主线程进行发送处理。将响应数据缓存空间关联到数据发送指针上,并触发输出事件。基于上述高并发处理系统的架构,实现单机支持高并发状态下对传输请求事件的处理流程如图4所示,包括以下步骤:步骤S41,主线程检测到一个传输请求事件时,读取请求的指令头及指令体数据,根据指令头及指令体数据生成一个请求消息。步骤S42,主线程将请求消息添加到接收消息队列。步骤S43,工作线程从接收消息队列中取出一条请求消息。步骤S44,工作线程根据请求消息创建响应消息头,然后调用业务处理函数处理业务逻辑,生成响应数据,将响应数据关联到数据发送指针上,并触发输出事件。步骤S45,主线程检测到输出事件后,从数据发送指针上取出关联的响应数据,并将响应数据发送出去。以系统内核为epoll机制(一种网络IO模型,IO事件通知机制)为例,步骤S41是通过这个系统内核的EPOLL机制来检测的,步骤S44将响应数据关联到内核EPOLL的一个指针上,并触发输出事件,然后在步骤S45中,主线程通过系统内核的EPOLL机制检测到输出事件,从内核的指针上取出该响应数据。下面以高并发处理系统基于印oil作为I/O模型为例进行进一步说明。高并发服务器中提升性能的关键是10、CPU和内存,所以高并发的服务器需要最大限度的利用CPU,减少内存申请,复制。其中网络IO模型也是影响系统性能的关键因素。本实施例选择Iinux平台下的epoll作为IO模型,内存分配使用tcmalloc (google的一个开源内存管理库)以提高分配效率及降低频繁内存分配带来的CPU损耗。服务器采用多线程的模型,有一个主线程负责网络10的输入及输出,有多个工作线程负责业务逻辑的处理。工作线程之间没有互相制约的关系,独立执行同样的工作。本实施例的服务器是请求响应式的,也就是对应每一个请求都会产生一个响应消息,无论服务处理是成功还是失败。而且请求总是由客户端发起的,当然一个服务器也可以是另外一个服务器的客户端。本实施例的通讯协议可以是采用二进制格式,以减少内存拷贝及提高打包,解包效率。请求及响应指令都分为指令头,及指令体两部分。指令头是必须的,并且所有服务的指令头都相同,请求及响应的指令头均相同,但具体的参数会不一样,指令体是可选的,指令体一般存储服务请求的额外参数。相比较文本格式,采用二进制的指令头及指令体,指令的解析将十分简单,从socket句柄(服务器与客户端之间的数据通道)读取数据时,直接将结构体指令作为参数,读取指定长度,成功后,就可以直接使用结构体了,这样就避免了内存的二次复制。系统架构包括主线程、接收消息队列、工作线程和会话管理器。
主线程是最核心的模块之一,其主要功能包括:工作线程的创建,业务端口输入/输出的监听,接收新的连接,socket (即套接字)数据的接收与发送及客户信息的管理维护
坐寸ο主线程通过epoll来管理主监听socket及所有客户端socket, epoll网络IO模型通常有ET/LT两种触发模式,本实施例采用效率相对较高的ET模式。当监听到EP0LLIN事件(即传输请求事件)时需要循环读取缓冲区的数据(或接收所有已准备好的连接),直到接收到EAGAIN(EAGAIN是一个信号,表示该套接字上已经没有事件了 )为止,接收到EAGAIN表示本次事件的数据已读取完毕。当有新的客户端连接到服务端口时,主线程将新的客户端socket添加到epoll的监控列表中,并通过会话管理器添加客户端信息到客户端列表中。而当检测到客户端连接失败时(如读取时返回0,或者心跳失败),主线程会从客户端列表中删除客户端信息。客户端如有需求稍晚会再次发送请求。当有客户端socket可读时(即有传输请求产生),主线程会读取请求指令头及指令体,并在做一些合法性验证后将请求消息压入接收消息队列。当有客户端socket可写时(即有请求处理结果产生),主线程会取出epoll_event中与事件相关联的数据,并发送出去。接收消息队列是一个阻塞的同步队列,同步指消息队列是线程安全的,能够保证当有多个线程同步访问队列时,不会导致混乱。阻塞是指,当从队列中取数据时,如果队列中此时没有数据,会一直阻塞,只到有数据被添加到队列中时,才会返回。本实施例设计了线程同步,使其可支持多线程并行运作并具有阻塞及通知机制。工作线程负责从接收消息队列中取出数据,并调用用户设置的回调函数处理业务请求。响应数据直接关联到epoll_event的data, ptr指针上,然后使用epoll_ctl控制信号触发EP0LL_0UT事件(即输出事件),然后由主线程发送响应数据。会话管理器提供对客户信息的添加,更新,删除等操作。可以按描述符删除,也可以按超时时间删除。本实施例中,一旦建立连接,会话管理器会将服务器与各客户端之间的连接保持为长连接,这样在客户端有请求产生时,可随时处理,不需重新建立连接,节省了处理时间,提高了任务处理效率。如图5所示为一种实施例中实现单机支持高并发处理的主流程图,包括以下步骤:步骤S51,启动单机支持高并发处理进程。步骤S52,初始化会话管理器。步骤S53,创建监听套接字,并绑定服务器IP,端口,开始监听事件。步骤S54,创建并启动工作线程。步骤S55,创建印oil套接字,并注册监听套接字到EPOLL队列中。步骤S56,使用循环体epoll_wait检测epoll事件。当检测到新事件时,执行步骤S57。步骤S57,循环处理印011事件。一种具体实例中,epoll事件处理流程如图6所示,包括以下步骤:步骤S611,判断是否是监听套接字,如果是监听套接字的事件,表示事件是未曾建立过连接的新客户端的新连接事件,则执行步骤S612,否则执行步骤S621。步骤S612,循环使用系统函数accept接收该新的客户端的连接,接收对应于该新客户端的套接字。步骤S613,判断接收是否成功,如果接收失败,即接收到EAGAIN信号,则表示套接字中无数据可读,则结束内部循环,回到步骤S56重新执行。如果接收成功,则执行步骤S614。步骤S614,设置对应于该新客户端的套接字为非阻塞的,并将套接字加入EPOLL队列。步骤S615,通过会话管理器,添加客户端信息。然后回到步骤S612。步骤S621,判断是否是EP0LLIN事件,即已知客户端的输入事件,即传输请求事件,如果是,则执行步骤S622,否则执行步骤S631。步骤S622,循环接收传输请求事件。首先接收指令头,并验证指令头的合法性;根据指令头中的length长度,动态分配指令体缓存空间,用于缓存传输请求事件的指令体数据;再接收指令体数据,将指令体数据缓存到指令体缓存空间中。步骤S623,判断指令体接收状态。如果接收成功,则执行步骤S624根据请求的指令头和指令体生成消息,压入接收消息队列。如果接收失败,则执行步骤S64,从EPOLL队列中删除描述符,然后关闭描述符,删除客户端信息。然后跳到步骤S56处理下一 EPOLL事件。步骤S625,判断是否接收到EAGAIN信号,如果是,则结束内部循环,回到步骤S56重新处理下一 EPOLL事件。否则转向步骤S622,重新接收下一条请求。步骤S631,判断是否是EP0LL0UT事件(即输出事件,服务器有任务处理结果产生),如果是,则执行步骤S632。步骤S632,从印oil event中取出暂存在缓存空间中的关联的响应数据。根据客户端信息中记录的该客户端的套接字的发送指令头,如果发送成功,接着发送指令体,并释放数据的缓存空间。步骤S633,判断发送状态。如果响应数据发送成功,则执行步骤S634。如果发送失败,则执行步骤S64,从EPOLL队列中删除该客户端的套接字,然后关闭该客户端的套接字,删除客户端信息。步骤S634,将该客户端套接字的EP0LL0UT事件修改成EP0LLIN事件,结束事件处理,返回步骤S56重新处理下一 EPOLL事件。当然,本领域技术人员应该理解,基于本申请的发明构思,某些步骤执行的先后顺序可以调整,例如可先执行步骤S631,后执行步骤S621。一种具体实例中,工作线程的处理流程图如图7所示,包括以下步骤:步骤S71,从接收消息队列中取出一条请求数据ReqData。步骤S72,动态分配响应数据的缓存空间,并根据缓存空间来进行初始化。步骤S73,调用业务处理函数,对请求数据进行处理。步骤S74,释放请求数据ReqData的空间。步骤S75,将响应数据关联到Epoll的event上,并使用epoll_ctl将套接字的事件改为EP0LL0UT,触发EP0LL0UT事件,由主线程来发送数据。然后回到步骤S71,继续处理下一条消息数据。本实施例采用单进程、多线程模型,其中的网络接收及发送都在同一线程中完成,业务处理在独立的工作线程中完成。同时工作线程是预先创建好的,线程数也是固定的。这种设计带来的好处是避免线程过多导致的上下文切换开销。并使系统足够简洁。请求响应式的服务模式,即请求总是由客户端发起的,并且服务器总是有一个返回。这种设计的好处同样是使系统处理流程更简洁,效率更高,以支持更高的并发量。基于二进制的协议设计,使数据打包与解包的处理效率更高。以上内容是结合具体的实施方式对本发明所作的进一步详细说明,不能认定本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干简单推演或替换,都应当视为属于本发明的保护范围。
权利要求
1.一种实现单机支持高并发处理方法,其特征在于包括,由同一服务器执行的主线程工作步骤和工作线程工作步骤,所述主线程工作步骤包括: 主线程监听事件; 当主线程监听到事件后,判断事件类型; 按照事件类型对该事件进行响应和处理,当事件类型为客户端新连接事件时,接收新的套接字并对新的套接字进行处理;当事件类型为传输请求事件时,接收传输请求指令,根据传输请求指令生成请求消息添加到接收消息队列等待工作线程的读取;当事件类型为输出事件时,将处于发送状态的数据进行发送处理; 所述工作线程工作步骤包括: 读取接收消息队列中的请求消息; 获取请求消息的响应数据并将响应数据处置为发送状态,以供主线程进行发送处理。
2.如权利要求1所述的方法,其特征在于,所述主线程监听事件之前还包括:创建监听套接字,将监听套接字绑定所述服务器的IP地址和端口,在主线程监听事件过程中监听来自于被绑定的服务器的IP地址和端口的事件,所述主线程监听到事件后,根据所述服务器底层对事件设置的标识判断事件类型。
3.如权利要求1或2所述的方法,其特征在于,当事件类型为客户端新连接事件时,所述接收新的套接字并对新的套接字进行处理步骤包括: 循环接收新的套接字,如果接收失败,则结束内部循环,如果接收成功,则记录客户端信息,当接收到数据读取完毕标识时,则结束事件处理。
4.如权利要求3所述的方法,其特征在于,新的套接字接收成功后,将新的套接字设置为非阻塞状态,所述记录客户端信息包括:将新的套接字加入服务器系统的I/O模型队列中,并将与该新的套接字对应的客户端信息添加到会话管理器中。
5.如权利要求1或2所述的方法,其特征在于,当事件类型为传输请求事件时,所述接收传输请求指令,并将指令体中的请求消息添加到接收消息队列步骤包括: 接收传输请求指令的指令头; 根据指令头中描述的长度信息动态分配指令体缓存空间; 接收指令体数据,并将接收到的指令体数据放入指令体缓存空间; 判断指令的接收状态,如果整个指令接收成功,则根据请求的指令头及指令体生成一个请求消息,将请求消息添加到接收消息队列;如果接收到数据读取完毕标识,则结束事件处理;如果接收失败,则删除I/o模型队列中与发送传输请求指令的客户端对应的套接字,删除会话管理器中该客户端信息。
6.如权利要求1或2所述的方法,其特征在于,当事件类型为输出事件时,将处于发送状态的数据进行发送处理步骤包括: 当判断数据发送成功后,将I/o模型队列中与接收该数据的客户端的套接字中的输出事件修改为传输请求事件; 当判断数据发送失败后,将I/o模型队列中与接收该数据的客户端的套接字删除,并删除会话管理器中该客户端信息。
7.如权利要求1或2所述的方法,其特征在于,获取请求消息的响应数据并将响应数据处置为发送状态包括:根据请求消息动态分配响应数据缓存空间; 调用业务处理函数对请求消息进行处理; 将响应数据存入响应数据缓存空间; 将响应数据缓存空间关联到数据发送指针上,并触发输出事件。
8.一种实现单机支持高并发处理系统,其特征在于包括: 接收消息队列,其用于接收消息; 主线程,其用于监听事件,当监听到事件后,判断事件类型,按照事件类型对该事件进行响应和处理,当事件类型为客户端新连接事件时,接收新的套接字并对新的套接字进行处理;当事件类型为传输请求事件时,接收传输请求指令,并根据指令生成请求消息添加到接收消息队列;当事件类型为输出事件时,将处于发送状态的数据进行发送处理; 工作线程,其用于读取接收消息队列中的请求消息,获取请求消息的响应数据并将响应数据处置为发送状态,以供主线程进行发送处理; 所述接收消息队列、主线程和工作线程位于同一服务器上。
9.如权利要求8所述的高并发处理系统,其特征在于,所述高并发处理系统基于epoll作为I/O模型创建,所述主线程绑定所述服务器的IP地址和端口,其监听的事件为该IP地址和端口的事件。
10.如权利要求8或9所述的高并发处理系统,其特征在于,还包括与接收消息队列、主线程和工作线程位于同一服务器上的会话管理器,所述会话管理器用于对客户端信息进行添加、更新或删除,所述客户端信息由主线程写入或删除。
11.如权利要求1 0所述的高并发处理系统,其特征在于,所述客户端信息包括客户端登录网站信息、心跳信息和连接时长中的至少一种;所述会话管理器将其中记录有信息的客户端和服务器保持长连接。
12.如权利要求8或9所述的高并发处理系统,其特征在于,当主线程判断事件类型为客户端新连接事件时,主线程循环接收新的套接字,如果接收失败,则结束内部循环,如果接收成功,将新的套接字加入服务器系统的I/O模型队列中,并将与该新的套接字对应的客户端信息添加到会话管理器中,当接收到数据读取完毕标识时,则结束事件处理;当主线程判断事件类型为传输请求事件时,主线程接收传输请求指令的指令头,根据指令头中描述的长度信息动态分配指令体缓存空间,接收指令体数据,并将接收到的指令体数据放入指令体缓存空间,判断指令的接收状态,如果整个指令接收成功,则根据指令头及指令体数据生成一个请求消息并将该请求消息添加到接收消息队列;如果接收到数据读取完毕标识,则结束事件处理;如果接收失败,则删除I/o模型队列中与发送传输请求指令的客户端对应的套接字,删除会话管理器中该客户端信息;当主线程判断事件类型为输出事件时,主线程在发送数据后判断数据发送状态,当判断数据发送成功后,将I/o模型队列中与接收该数据的客户端的套接字中的输出事件修改为传输请求事件,当判断数据发送失败后,将I/o模型队列中与接收该数据的客户端的套接字删除,并删除会话管理器中该客户端信息。
13.如权利要求8或9所述的高并发处理系统,其特征在于,所述工作线程从接收消息队列中读取一请求消息,根据该请求消息动态分配响应数据缓存空间,调用业务处理函数对请求消息进行处理生成响应数据,将响应数据存入响应数据缓存空间,将响应数据缓存空间关联到数据发送指针上,并触发输出事件。
14.一种实现单机支持高并发状态下对传输请求事件的处理方法,其特征在于包括: 主线程检测到一个传输请求事件时,读取指令头及指令体数据,根据请求的指令头及指令体生成一个请求消息,将请求消息添加到接收消息队列; 工作线程从接收消息队列中取出一条请求消息,根据请求消息创建响应消息头,然后调用业务处理函数对请求消息进行处理,生成响应数据,将响应数据关联到数据发送指针上,并触发输出事件; 主线程检测到输出事件后, 从数据发送指针上取出关联的响应数据,并将响应数据发送出去。
全文摘要
本发明公开了一种实现单机支持高并发处理方法及系统,包括位于同一服务器上的接收消息队列、主线程和工作线程,主线程监听到事件后,判断事件类型,当事件类型为客户端新连接事件时,接收新的套接字并对新的套接字进行处理;当事件类型为传输请求事件时,接收传输请求指令,并根据指令生成请求消息添加到接收消息队列;当事件类型为输出事件时,将处于发送状态的数据进行发送处理;工作线程读取接收消息队列中的请求消息,获取请求消息的响应数据并将响应数据处置为发送状态。本发明使单机系统实现了支持更多用户的并发访问,不需要分布式的集群部署,架构简单,整体成本较低。
文档编号G06F9/46GK103164256SQ201110405659
公开日2013年6月19日 申请日期2011年12月8日 优先权日2011年12月8日
发明者刘小杰, 伍正勇 申请人:深圳市快播科技有限公司