一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种使用异步非阻塞模式处理多客户端接入的方法及装置与流程

2021-10-27 21:13:00 来源:中国专利 TAG:阻塞 接入 客户端 装置 模式


1.本发明涉及通信技术领域,具体涉及一种使用异步非阻塞模式处理多客户端接入的方法及装置。


背景技术:

2.网络技术的飞速发展,对网络的可靠性提出了更高的要求,为了提高用户使用软件的体验,和软件交互过程中不卡顿,请求能得到及时响应,软件的设计需要考虑大量用户同时接入服务器时依然拥有高性能和稳定性,通信框架的设计就显得尤为重要。在软件运行初期,业务量较小,用户数量也较小,使用传统的bio通信方式能够应付当前需求,但是一旦业务量和用户数量增长较快,传统的bio方式已经无法满足用户需求,此时的服务器就会出现拥塞,用户无法连接,服务器cpu满负荷,系统崩溃重启,用户登录将一直等待,直到超时。这样的场面对用户和服务器提供商来说都是灾难性的。
3.aio(异步非阻塞i/o)提供了一套通用的、开发语言无关的、协议无关的、高性能的通信方式,可以很好的满足多用户同时接入的需求。传统的bio接入方式为一个请求一个线程,每当一个用户接入时,服务端(这里指单机服务器)就开启一个线程为该用户服务,当用户数量增加到百级以上时,服务端就无法及时处理请求,原因是一台服务器所能开启的最大线程数为1000个。此时解决方式有两种:第一种是添加服务器,将若干台服务器组成集群,前端采用负载均衡方式,将请求平均的分派到每台服务器上;第二种是从软件入手,改为高性能的aio通信框架,最大化单台服务器的处理能力,同时根据未来可能的用户量合理的添加一定数量的服务器。很显然第一种解决方式需要更多的硬件资源,更多的硬件资源意味着更高的成本。第二种解决方式虽然也会增加硬件资源,但是总体成本肯定会远低于第一种的成本。
4.aio通信框架的根本思想是:aio,即异步非阻塞i/o,指在服务器软件内部,方法调用是异步的,不需要立即返回处理结果,线程运行是非阻塞的,cpu能够一直处理准备就绪的线程任务,不会让线程阻塞在等待任务就绪的地方。
5.aio通信框架的实现包括:多路复用技术,高效的线程模型设计。
6.上述多路复用技术是指多个用户请求对应一个或者少量几个的处理线程,而不是传统的一对一的方式,如果设计得当,一个处理请求线程完全能够满足多用户的同时接入。该技术会在高效的线程模型设计中体现。
7.高效的线程模型设计是指编码阶段的具体方案,具体实现为:开启两个工作组:main工作组和sub工作组,main工作组包含一个主线程和一个线程池,主线程的工作是绑定ip和监听端口,收集用户的accept请求,将请求放入请求队列中,线程池的工作是从请求队列中获取用户的accept请求,并进行认证、握手、登录处理,然后与客户端建立连接,生成channel,将channel放入selector中,同时处理任务队列中的任务。sub工作组包含一个主线程和一个线程池,主线程的工作是轮询selector中的channel,将准备就绪的channel放入就绪队列中,线程池的工作是从就绪队列中获取channel,处理channel中的read和write
事件,并处理任务队列中的任务和定时任务。


技术实现要素:

8.针对现有技术的不足,本发明公开了一种使用异步非阻塞模式处理多客户端接入的方法及装置,用于解决上述存在的问题。
9.本发明通过以下技术方案予以实现:
10.第一方面,本发明公开了一种使用异步非阻塞模式处理多客户端接入的方法,包括以下步骤:
11.s1初始化main工作组并开启主线程m,绑定监听ip 端口后,开启main工作组线程池mpool并开始轮询;
12.s2初始化请求队列rq及selector多路复用选择器;开启sub工作组主线程s并开始轮询selector,开启sub工作组线程池spool,初始化就绪队列wq;
13.s3线程m监听到有客户端accept请求后,将accpet请求放入rq中,mpool轮询rq,当rq有请求数据时,获取请求数据,将请求以负载均衡的方式分派到mpool中的每个线程;
14.s4处理accept请求,进行身份验证、握手、登录操作,生成对应的channel,并注册到selector中;
15.s5线程s轮询selector中的channel,并将channel放入wq中,spool轮询wq,wq中有请求数据时,获取请求数据,将请求以负载均衡的方式分派到spool中的每个线程;
16.s6业务层代码根据查询参数去数据库查找对应的网元相关业务信息并封装成对象返回给线程s;
17.s7线程s收到业务层返回的结果,将结果封装到channel中并返回,客户端收到来自服务端的响应,解析完成后正确显示。
18.更进一步的,所述main工作组和sub工作组均包含一个主线程和一个线程池。
19.更进一步的,所述main工作组主线程用于绑定ip和监听端口,收集用户的accept请求,将请求放入请求队列中;
20.所述main工作组线程池用于从请求队列中获取用户的accept请求,并进行认证、握手、登录处理,然后与客户端建立连接,生成channel,将channel放入selector中,同时处理任务队列中的任务。
21.更进一步的,所述sub工作组主线程用于轮询selector中的channel,将准备就绪的channel放入就绪队列中;
22.所述sub工作组线程池用于从就绪队列中获取channel,处理channel中的read和write事件,并处理任务队列中的任务和定时任务。
23.更进一步的,所述main工作组和sub工作组构成线程模型,用于实现使用一个处理请求线程满足多用户的同时接入。
24.第二方面,本发明公开一种使用异步非阻塞模式处理多客户端接入的装置,所述装置用于提供硬件载体以实现第一方面所述的使用异步非阻塞模式处理多客户端接入的方法,包括:主用工作组主用线程及线程池模块、辅助工作组工作线程及线程池模块、多路服务器selector和负载均衡模块。
25.更进一步的,所述主用工作组主用线程模块,用于监听来自客户端的连接请求,并
将请求放入请求队列中;
26.所述主用工作组线程池模块,用于读取请求队列中的请求数据,并处理请求,生成channel注册到selector。
27.更进一步的,所述辅助工作组工作线程模块,用于轮询selector中就绪的channel,将channel放入工作队列中;
28.所述辅助工作组线程池模块,用于读取工作队列中的channel数据,并进行业务处理。
29.更进一步的,所述多路服务器selector,用于维护channel集合。
30.更进一步的,所述负载均衡模块,用于将客户端的流量平均的分派给需要执行任务的线程池里的线程。
31.本发明的有益效果为:
32.本发明通过更改网络管理系统的通信方式,采用异步非阻塞模式处理多个客户端请求,一个处理请求线程完全能够满足多用户的同时接入,让用户能够正常的登录服务器并能够正常交互,不会出现卡顿,长时间无响应的糟糕的用户体验,具有很强的市场应用前景。
附图说明
33.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
34.图1是一种使用异步非阻塞模式处理多客户端接入的方法原理步骤图;
35.图2是本发明实施例aio框架模型图。
具体实施方式
36.为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
37.实施例1
38.本实施例公开如图1所示的一种使用异步非阻塞模式处理多客户端接入的方法,包括以下步骤:
39.s1初始化main工作组并开启主线程m,绑定监听ip 端口后,开启main工作组线程池mpool并开始轮询;
40.s2初始化请求队列rq及selector多路复用选择器;开启sub工作组主线程s并开始轮询selector,开启sub工作组线程池spool,初始化就绪队列wq;
41.s3线程m监听到有客户端accept请求后,将accpet请求放入rq中,mpool轮询rq,当rq有请求数据时,获取请求数据,将请求以负载均衡的方式分派到mpool中的每个线程;
42.s4处理accept请求,进行身份验证、握手、登录操作,生成对应的channel,并注册
到selector中;
43.s5线程s轮询selector中的channel,并将channel放入wq中,spool轮询wq,wq中有请求数据时,获取请求数据,将请求以负载均衡的方式分派到spool中的每个线程;
44.s6业务层代码根据查询参数去数据库查找对应的网元相关业务信息并封装成对象返回给线程s;其中,网元相关业务信息包括端口、配置、查询、同步数据、同步告警和性能查询等信息。
45.s7线程s收到业务层返回的结果,将结果封装到channel中并返回,客户端收到来自服务端的响应,解析完成后正确显示。
46.本实施例main工作组和sub工作组均包含一个主线程和一个线程池。
47.本实施例main工作组主线程用于绑定ip和监听端口,收集用户的accept请求,将请求放入请求队列中;
48.本实施例main工作组线程池用于从请求队列中获取用户的accept请求,并进行认证、握手、登录处理,然后与客户端建立连接,生成channel,将channel放入selector中,同时处理任务队列中的任务。
49.本实施例sub工作组主线程用于轮询selector中的channel,将准备就绪的channel放入就绪队列中;
50.本实施例sub工作组线程池用于从就绪队列中获取channel,处理channel中的read和write事件,并处理任务队列中的任务和定时任务。
51.本实施例main工作组和sub工作组构成线程模型,用于实现使用一个处理请求线程满足多用户的同时接入。
52.实施例2
53.本实施例公开一种使用异步非阻塞方式处理多客户端接入的方法,具体为,服务端使用异步非阻塞模式处理多客户端接入的整体方案设计,包括多路复用的技术,高效的线程模型设计。
54.本实施例多路复用技术包括:
55.服务端将客户端的accept请求进行认证处理,包括身份认证、握手、登录操作;
56.待上述操作完毕且认证通过,服务端根据accept请求生成对应的channel,并注册到多路复用器selector中;
57.selector内部对channel不断轮询,将就绪的channel放入对应的集合中;
58.服务端其他模块会轮询selector的集合,将就绪的channel取出,进行业务处理。
59.本实施例高效的线程模型设计包括:
60.主用工作组的线程初始化;主用工作组的线程池初始化;主用工作组的多路复用器selector初始化;主用工作组的线程定时轮询accept事件;主用工作组的线程池处理accept事件;主用工作组的线程池处理认证、握手、登录、建立连接;主用工作组的线程池生成channel;channel注册到selector;主用工作组的线程池处理任务队列中的任务;
61.辅助工作组的线程初始化;辅助工作组的线程池初始化;辅助工作组的线程轮询selector;辅助工作组的线程池处理read和write事件;辅助工作组的线程池处理任务队列中的任务。
62.实施例3
63.本实施例公开一种处理多客户端接入的方法,流程如下所述:
64.服务端初始化main工作组:开启main工作组主线程m,绑定监听ip 端口;
65.开启main工作组线程池mpool并开始轮询;初始化请求队列rq;初始化selector多路复用选择器;
66.服务端初始化sub工作组:开启sub工作组主线程s并开始轮询selector;开启sub工作组线程池spool;初始化就绪队列wq;
67.线程m监听到有客户端accept请求后,将accpet请求放入rq中;
68.mpool轮询rq,当rq有请求数据时,获取请求数据,将请求以负载均衡的方式分派到mpool中的每个线程,如图1流程101;
69.mpool中的线程处理accept请求,进行身份验证、握手、登录操作;
70.mpool中的线程处理完accept请求后,生成对应的channel,并注册到selector中;
71.线程s轮询selector中的channel,当此channel是就绪状态时,将此channel放入wq中;
72.spool轮询wq,wq中有请求数据时,获取请求数据,将请求以负载均衡的方式分派到spool中的每个线程;
73.spool中的线程根据请求调用具体的业务逻辑处理方法,生成结果并返回。
74.如图2所示本实施例包括main工作组和sub工作组,main工作组包含一个主线程和一个线程池,主线程的工作是绑定ip和监听端口,收集用户的accept请求,将请求放入请求队列中,线程池的工作是从请求队列中获取用户的accept请求,并进行认证、握手、登录处理,然后与客户端建立连接,生成channel,将channel放入selector中,同时处理任务队列中的任务。
75.本实施例sub工作组包含一个主线程和一个线程池,主线程的工作是轮询selector中的channel,将准备就绪的channel放入就绪队列中,线程池的工作是从就绪队列中获取channel,处理channel中的read和write事件,并处理任务队列中的任务和定时任务。
76.实施例4
77.本实施例以网络管理系统为例,单机服务器,10000个客户端同时接入,启动服务器,说明如何实施。
78.本实施例以ipran网络管理系统为例,系统部署在单机服务器上,启动服务器。
79.此时,有10000个客户端同时登录,main工作组的m线程收到10000个accept请求,依次给每个请求分配一个唯一id,并将这些请求放入请求队列rq中。
80.当轮询rq的main工作组的线程池检测到rq有数据时,负载均衡模块会根据请求的id号按照一定的算法算出每个请求对应由哪个线程负责处理。
81.本实施例假设main工作组的线程池启动了20个线程,则每个线程处理500个请求。
82.本实施例以其中一个线程为例,说明如何处理accept请求:
83.该线程收到请求后,获取该请求的数据,根据用户名user1和密码user1去数据库查找对应的用户,若找到该用户,则返回true,继续下一步操作;若没有找到该用户,则返回false,线程会返回一个用户不存在的错误码给登录的客户端。
84.找到对应的用户则表示登录成功,线程会记录该用户的登录信息,返回登录成功
的信息给客户端,然后根据该连接生成对应的channel,并将该channel注册到selector上。
85.selector会一直轮询注册的channel集合。
86.如果用户user1登录成功后,要进行读取设备端口信息的操作,客户端会发出一个查询请求query1,query1中封装了要查询的设备的网元id等讯息。
87.服务端selector轮询到来自用户user1的channel有read事件,而且状态为就绪,selector会将该channel放入对应的集合中。
88.sub工作组的s线程会一直轮询selector。
89.此时线程s轮询到selector的集合中有准备就绪的channel,将该channel放入工作队列wq中。
90.sub工作组的线程池模块轮询到wq中有channel,负载均衡模块会将该channel分派给其中一个线程去处理。
91.该线程拿到该channel后,读取channel中的请求,发现是read事件,具体为query1查询操作,会调用对应的业务层代码去完成请求。
92.业务层代码根据查询参数去数据库查找对应的网元端口信息并封装成对象返回给该线程。
93.该线程收到业务层返回的结果,将结果封装到channel中并返回。
94.客户端收到来自服务端的响应,解析完成后正确显示。
95.实施例5
96.本实施例公开一种使用异步非阻塞方式处理多客户端接入的装置,包括:
97.主用工作组主用线程模块,用于监听来自客户端的连接请求,并将请求放入请求队列中;
98.主用工作组线程池模块,用于读取请求队列中的请求数据,并处理请求,生成channel注册到selector;
99.多路服务器selector,用于维护channel集合;
100.辅助工作组工作线程模块,用于轮询selector中就绪的channel,将channel放入工作队列中;
101.辅助工作组线程池模块,用于读取工作队列中的channel数据,并进行业务处理。
102.负载均衡模块,用于把来自客户端的流量平均的分派给需要执行任务的线程池里的线程。
103.综上,本发明通过更改网络管理系统的通信方式,采用异步非阻塞模式处理多个客户端请求,一个处理请求线程完全能够满足多用户的同时接入,让用户能够正常的登录服务器并能够正常交互,不会出现卡顿,长时间无响应的糟糕的用户体验,具有很强的市场应用前景。
104.以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献

  • 日榜
  • 周榜
  • 月榜