第36卷 第04期2018年 4月数字技术与应用Digital Technology &ApplicationVol.36 No.4April 2018期2018年第 04 应用研究DOI:10.19695/j.cnki.cn12-1369.2018.04.43基于协程的高并发架构研究刘健1 黄才胜2(1.钱包生活(平潭)科技有限公司上海分公司,上海 200234;2.蔚锐智能科技(上海)有限公司,上海 200000)摘要:本文运用goroutine的简便特点研发了webgo架构,通过对比webgo架构和beego架构可以看出融入协程思想的高并发架构更有优势。关键词:计算机;软件;协程;高并发结构中图分类号:TP311.52文献标识码:A文章编号:1007-9416(2018)04-0085-02随着我国网络建设的不断发展,软件研发产业也进入了发展的快车道,越来越多的网页以及应用软件应运而生,如何提高网络的效率和便捷性日益成为人们关注的焦点。相比于传统网络来说,如今网民对网络的要求更高,使用频率也更高,为了满足广大网民对计算机系统的高要求,软件工程师们加大了对计算机高并发架构的研发力度。虽然物理结构上的改变能够高并发,但是这种改变需要大量的服务器,运行成本将大幅度增加,另外,由于线程的数量有限,因此,本文利用协程的思想进行多线程的程序设计。综上所述,进程的堆栈都不共享,调度是由操作系统来完成的;线程只是共享堆,但不共享栈,调度仍是由操作系统来完成的;协程也只是共享堆,但不共享找,调度是由编程人员来完成的。2 REST简介最初提出的REST(Representational State Transfer)只定义了部分编程的规范与准则,当设计符合这些规范与准则时,就将这些设计称为RESTful设计[5]。这种以资源为核心的编程方式给编程留下了通用接口,且能够在高效使用HTTP协议时简化web的编程框架。Google提出的golang语言仅仅支持的是底层REST。对于REST来说,资源是最重要最宝贵的,这些资源能够利用URI定位到服务器上,其中URI能够在http的前部信息里通过特定的字段来展现资源。REST中涉及到的表现层是通过json格式的数据来展现资源的,通常web涉及采用的是json多的前后端交互。在访问网站时,数据会在浏览器和服务器之间进行不断的交互,但http协议是无状态的,只是明确了访问规范。在进行状态保存时,在服务器端进行的编程会发挥作用,因此,仍旧要通过http来访问服务器端。总之,RESTful的特点可以概括为三点:(1)资源用URI来表示;(2)在资源表现层进行数据交换;(3)客户端通过http来操作服务器资源。由于REST减少了交互延迟,精简了框架设计,降低了系统冗余度,能够大量扩展,因此,REST不仅使客户端与服务器端的交流变得更为简便,而且使系统能够进一步得到扩展。本文所研究的高并发架构可以通过对REST的稍加改造来达到golang的REST标准。本文只实现了3个层次,在实际应用中,可以根据实际需要来选择要实现的规范。1 协程1.1 协程定义所谓协程,其实是一套简便程序组件,协程比传统的线程使用起来更为简单轻巧[1]。进程与线程是操作系统中的两种结构,通过交叉结合使用进程与线程可以让计算机的操作系统出于多种运行模式下。对于单核CPU来说,每次仅调用单个进程或线程。调度内核能够使进程与线程交替获得CPU资源,从而把使用者所提交的作业化整为零。协程与进程、线程有着明显的不同:协程提出于编译器层面,而进程、线程提出于操作系统层面;协程是通过提议一种语言来做编译器的标准,再由编译器的制造者实现这种机制,而进程、线程是通过操作系统来进行分配与调度的;协程是通过引入相关代码使代码段可以分段运行,重启处由yield关键字决定,而进程、线程是通过保存、恢复等中段的形式来完成的,其本质仍旧是利用CPU时间片[2]。1.2 协程编程函数在软件程序进行调用的过程与递归思想很相似,要等到被调用者给出数据时调用者才能开始调用,例如,函数A若想调用函数B,那么只有在函数B执行完毕并将结果返回以后,函数A方能开始执行。所以,系统内部是通过栈完成调用函数,即函数执行就是线程执行[3]。调用函数时要有输入与输出,是按顺序运行,但是协程调用不需要像程序调用那样等待结果,可直接运行下去,当收到协程反馈回的结果后,再继续对上诉结果进行处理。若需用多核来进行多协程编程,那么就要用多进程与多线程结合的形式,这是由于协程仍然占用单个CPU核[4]。3 webgo框架的设计与实现本文所设计的webgo框架能够迅速构建golang语言应用的HTTP框架,能够迅速开发各种web应用,该框架是一个融合了golang特性的RestFul框架。3.1 路由模块HTTP的请求通过路由组件发送给相应函数进行处理,路由相当于框架中的事件处理器,用户请求路径(path)与查询串信息HTTP请求方法(method)均包含在事件中,路由器的作用其实是将用户请收稿日期:2018-03-06作者简介:刘健(1983—),男,安徽安庆人,本科,毕业于安徽大学,现就职于钱包生活(平潭)科技有限公司上海分公司。85第 36 卷 数字技术与应用 www.szjsyyy.com求信息传到了一个处理函数。路由的设置思路主要是路由信息的添加与要执行函数的转发:路由信息的添加是用http.Handle与http.HandleFunc等函数实现的,均在底层调用DefaultServeMux函数,该函数能够将路由信息储藏于map信息中;要执行函数的转发是通过监听端口Go将接收到的tcp连接交由Handler进行处理。虽然当前的Web应用路由均是基于http默认路由器来实现的,但有三点限制:(1)参数无法自行设定;(2)对REST模式无法完美支持且不能限制访问;(3)路由规则多,程序编写复杂。为了克服上诉限制,设计了一种考虑存储路由与转发路由的REST方式路由。本文设计的高并发架构含有controllerInfo和controllerRegistor两个数据类型。逻辑的处理封装方面。4.1 webgo和beego的路由对比本文是通过map在webgo框架的底层存储路由的,虽然beego里树状结构的存储空间较少,但是其比map更为高效。beego框架的优势能够在具有许多路由的时候体现出来,这使得高并发且少量路由时的webgo更占优势。4.2 webgo和beego的业务逻辑处理对比程序段中的Ctx字段存储了大量上下文中所包含的信息,例如,含有各种数据的清单表格、客户端输入的各类参数以及URI等。这些字段存储在beego的map中。当有多个路由的时候,存储上下文中的信息变得更为简单。然而当并发量异常巨大时,存储起来的上下文中的信息将占用大量的空间,因此,本文所设计的基于协程的高并发架构webgo将会去掉存储模块。3.2 业务逻辑模块本文在现有REST准则规范的基础上设计了新型MVC格式的框架,在本文中将其命名为controller,这提高了web应用开发效率,相比于以前基于Action的MVC框架更为简单高效。MVC式的架构模式十分普遍,M是指模型(Model),V是指视图(View),C是指控制器(Controller)。MVC式的架构模式实质是利用了分层思想,即分开业务逻辑与展示,模型表示的是服务器端的数据结构,视图表示的是前端表现层(网页、模板等),控制器是实现业务逻辑的。对于前面http里的handler来说,handler其实是一个控制器。MVC式的架构模式核心是控制器,这是展示与加工数据的来源,而且一个正常系统可以没有模型和视图,但不能没有控制器。本文设计的高并发架构包含struct和interface两个类型。5 结语beego作为golang的web框架,它主要针对的是那些量级很高的研发项目,倾向于开发API,但是本文所研发设计的webgo框架主要针对的是那些量级很低且高并发的快速研发项目。当处于项目研发的前期阶段时,要在尽可能匹配考虑项目应用环境的前提下选择适合的框架,只有应用了合适的框架才能在提高效率的同时大幅度压缩研发周期。通过分析测试以及对比的结果可以发现,本文提出的基于协程的高并发架构大大改善了原有的性能指标:(1)服务器端的负载量级从百万级提高至千万级;(2)成倍扩大单位时间内需要建立的连接数量(qbs),最终能够比处于同样应用环境的多线程高10倍;(3)相同并发量的运行时间减少约68%,当并发量在1000万的时候,基于协程的高并发架构运行时间从3.7s缩减到2.2s;(4)内存消耗下降了约140%,当并发量在1000万的时候,基于协程的高并发架构消耗内存从240M缩减到100M。参考文献[1]李中跃.一种低成本的C语言协程实现[J].辽宁省交通高等专科学校学报,2012,(4):23-26.[2]石刚,王生原,董渊,等.同步数据流语言可信编译器的构造[J].软件学报,2014,(2):341-356.[3]谌卫军.C程序设计课程中的堆与栈[J].计算机教育,2015(5):98-102.[4]邹昌伟,王林.面向嵌入式的协程与脚本化机制[J].计算机应用,2014,(5):1408-1412.[5]章武媚.基于RESTfulWeb技术的资源管理系统设计与实现[J].计算机应用与软件,2014,(5):23-28.3.3 日志模块在程序设计人员编写程序的过程中,日志的正确使用是十分重要的,这是因为调试信息是记录在日志中的。webgo的日志模块是在seelog的基础上开发的,它是依据level的类型来输出各种类型的日志,这样做能够使开发程序和部署程序变得更为简单,实用性更强。通常在开发程序时设置一个较低的level值,在部署程序的时候再将原本较低的level值调高,此做法能够屏蔽掉开发过程里的调试信息。本文将seelog部署程序的思想融入设计webgo日志中,依据level的不同值来记录相关的日志,然而webgo的日志系统的级别较轻,使用了系统自带的log.Logger接口,默认将信息传送至os.Stdout,用户能够利用这个接口,再用webgo.SetLogger对输出进行自定义设定。4 webgo和beego的比较分析beego框架大量的应用到Golang的web框架中,相比于其它webgo框架,本文所设计的主要优势体现在对路由的转发以及业务Research on High Concurrency Architecture Based on CO ProcessLIU Jian1, HUANG Cai-sheng2(1.wallet Life (Pingtan)Science and Technology Co., Ltd. Shanghai branch, Shanghai 200234;2.Weirui Intelligent Technology (Shanghai)Limited Company, Shanghai 200000)Abstract:This article uses the simple features of goroutine to develop the webgo architecture. By comparing the webgo architecture and the beegoarchitecture, we can see that the high concurrent architecture incorporating the co process idea is more advantageous.Key words:computer; software; Association; high concurrent structure86