一种面向多语言的高并发在线开发支撑方法与流程

文档序号:19249749发布日期:2019-11-27 20:03阅读:211来源:国知局
一种面向多语言的高并发在线开发支撑方法与流程

本发明涉及web应用技术,尤其涉及在线编程平台的实现方法,目的在于实现包括junit测试、python编程、jmeter压力测试和selenium测试等在内的webide平台。



背景技术:

本地编程平台(本地ide)在现阶段用户量增多、服务量扩大和服务种类激增等更高的要求下逐渐暴露出兼容性、扩展性方面的问题,webide在线编程平台的想法由此产生。webide不仅能消除环境配置难的问题,而且与我们的后端服务能够更好的融合,服务能够即时更新,代码文件能够远程保存。

当前国内外已经存在很多不同类型的webide在线编程平台,比如专注于前端运行时编程的jsfiddle,项目管理集成的在线编程的国内平台coding.net,甚至一些老牌的本地ide,比如eclipse,也在开始扩展webide的业务。但是不同的需求会产出不同的产品,对于这么多已经成型的webide在线编程平台,其中的技术并不能直接套用,而且我们提供的服务不仅仅限于代码的编译和运行,更多关注点在于后续的代码分析部分。在线编程平台的分析服务部分,市面上还未有成熟的实现方案或产品。

在线编程平台的影响日益扩大的今天,如何整合开发流水线,使得代码编辑、运行、管理和分析能够在统一的平台上得到实现是开发者关注的重点。一款在线的、可视化的、具备完善的编辑和分析模块的在线编程平台是开发者们所期待的。



技术实现要素:

为了实现上述目标,本发明实现了一个兼容多种语言和项目类型、可直观编辑代码并运行、能够承受较高并发和负载的在线集成开发平台。

本发明的技术方案为:一种在线集成开发平台,其特征是代码编辑器可进行智能提示;对于jmeter测试提供表单式编辑界面;对后台请求进行负载均衡转发,实现基于docker的代码执行机制,兼容多种编程语言和项目类型,并能较为方便地进行扩;开发异步队列服务管理实现分布式计算,提升系统性能。

主要包括代码自动提示设计、jmeter表单化展示、请求分发和文件同步、代码运行机制和异步队列服务的实现方式,其中包括:

1.java代码自动提示设计,java代码自动提示技术主要基于词法分析器,snippet(代码片段),关键字和方法库实现实现。

1.1词法分析器使用状态转换图来识别单词符号。状态转换图使有限方向图,包含一个初态和至少一个终态。主要区分了分界符、运算符、单行注释、多行注释、标识符或关键字、数字串、非法字符的情况

1.2代码片段使用‘name’:{prefix:‘’,body:‘’}数据结构表示,其中name表示名称描述语句,prefix表示约定字符串,用于匹配用户输入,body为代码模板。需要事先自定义代码片段库,尽可能减少用户简单代码块的编辑以及重复复制黏贴操作

2.jmeter表单化展示,以代码编辑器为核心的前端已经支持多种类型的测试,但压力测试需要运行的是xml格式的测试计划脚本文件。因此提供了表单式编辑的前端界面。该编辑界面是一个可独立部署的前端项目,调用webide的后端api实现考试的流程。

2.1json与xml相互转化,通过给用户提供表单化编辑测试计划的方式获得用户输入,再将json格式的用户输入转化为xml格式的测试脚本供测试程序执行,此外还实现了已存储的测试脚本在界面上的展示。

2.2串行并行混杂的接口调用,jmeter表单式编辑作为独立的前端项目,在工作空间初始化过程中,需要依次实现获取工作空间码、获取文件内容、建立socket通讯这三个步骤。其中获取文件内容这一步骤,需要同时发送两个请求以获取不同文件的内容。

3.请求分发与文件同步

3.1使用nginx来对后端请求进行转发,通过第三方分发算法sticky在保证客户端websocket连接的基础上使得每台后端服务器的负载尽可能均衡。同时通过健康检查排除宕机的服务器,增强系统的容错性。

3.2利用阿里云的nas文件存储服务保证多节点服务器上用户文件的一致性,通过将所有后端服务器上的工作空间都挂载到nas文件系统实例,从而实现文件的共享和实时更新。

4.代码运行服务实现机制

4.1异步队列服务提供了统一的restapi,webide后端通过调用该api实现运行工具的启动和停止,webide后端对该api封装的接口如下:

其中asyncjobtool包装了对应工具的信息,callbackclass定义了任务处理完毕时webide的回调函数。

4.2通过构建docker镜像提供多种编程语言和项目类型的运行环境,如java、python、jmeter、selenium等,同时能够方便地进行扩展,只要构建符合数据约束的docker镜像,即可无缝接入webide中。数据约束包括:

a)日志和分数等文件输出到统一文件

b)本地的分数计算结果符合已有json格式定义:

其中score和title的内容根据项目类型需要进行定义。

5.异步服务包括操作原语设计,异步队列和分布式方案

5.1操作原语的设计为集成到webide平台的服务规定了统一的接口标准,满足操作原语要求的第三方服务才可以集成到平台上。操作原语包括服务的运行,停止和状态三种。

5.2异步队列让进入webide通信模块的服务得到管理,以消息或消息组为单位,接收下一个阶段分布式方案的调度。服务在执行后通过异步消息的方式通知队列,更新队列中原有消息或消息组。

5.3分布式方案采用合理的负载均衡策略,分配异步队列中的消息或消息组至不同的服务器执行。具体服务通过容器镜像的方式运行。

本发明的有益效果:本平台为所有参与慕测主站考试或练习的用户,提供了一个在线集成开发环境,实现代码智能提示功能,减少简单代码块的编辑、重复复制黏贴操作,提高用户开发效率;多类型多语言视角,适应多样性开发需求;进行请求分发,解决高负载、高并发情况;提供异步队列服务管理,大大提高了服务的可扩展性,也为可伸缩性提供了可能性。

附图说明

图1为本发明的整体架构图。

图2为词法分析状态转换图。

图3为分布式异步服务框架图

具体实施方式

为进一步了解本发明的技术内容,配合所附图对webide的工作方式说明如下。

图1为webide平台的整体架构图。用户从慕测主站进入webide后请求的流转过程包括以下步骤:

步骤1:用户点击在线做题,携带token从慕测主站进入webide,如果是jmeter项目则进入jmeter前端,否则进入默认前端

步骤2:前端进行可视化展示,同时将带token的用户请求发送到服务器端

步骤3:前端发往服务器端的请求经过nginx进行负载均衡转发

步骤4:服务器端收到带有token的请求,对token进行解析,获取用户和考试信息,判断用户是否为首次进入webide,如果是则前往oss下载考试对应试题,如果不是则直接使用服务器上已有的用户文件,将用户文件信息返回给前端

步骤5:前端获得服务端返回的文件信息,进行工作空间展示,同时与服务器端建立websocket连接,并订阅相关接口

步骤6:用户进行代码编辑操作时,前端将用户编辑的文件发送到服务端

步骤7:服务端对服务器上的文件进行写入,并将写入是否成功返回给前端

步骤8:用户发起运行请求时,前端将服务端请求运行用户项目代码

步骤9:服务端接收到运行请求,将运行任务发送给异步队列服务,并告知前端排队中

步骤10:异步队列服务接收到webide服务端的任务,启动服务阵列中的docker容器进行任务处理

步骤11:docker容器运行项目代码,在docker内部进行分析、计算、打包等操作

步骤12:服务端监听到任务处理完成,将处理结果通过websocket推送到前端展示。

图2为词法分析状态转换图,编辑器通过词法分析实现智能提示,词法分析的预处理过程步骤如下:

步骤1:从左到右读入下一个字符,如果到最后一个字符,执行步骤22,否则执行步骤3、步骤4、步骤5;

步骤2:连接字符串到str;

步骤3:将字符读到ch中,指针前移一个字符;

步骤4:检查ch中的字符是否为空白,若是则调用getchar()直至ch中进入一个非空白字符;

步骤5:判断ch是否为字母,若是,执行步骤7,否则执行步骤6;

步骤6:判断ch是否为数字,若是依次执行步骤2、步骤3、步骤10,否则执行步骤12;

步骤7:判断ch是否为字母或数字,是的话依次执行步骤2、步骤3、步骤8,否则执行步骤8;

步骤8:判断字符序列str是都为关键字,若是将str类型设置为”keyword”,写回文件,并设置str为空,并执行步骤1,否则执行步骤9;

步骤9:将str类型设置为”id”,写回文件,并设置str为空,执行步骤1;

步骤10:判断ch是否为字母,若是将str类型设置为”error”,写回文件,并设置str为空,执行步骤1,否则执行步骤11;

步骤11:将str类型设置为”digit”,写回文件,并设置str为空,执行步骤1;

步骤12:判断ch是否为运算符,若是执行步骤13,否则执行步骤20;

步骤13:判断ch是否为’/’,若是依次执行步骤3、步骤14,否则执行步骤18;

步骤14:判断ch是都为’*’,若是依次执行步骤3、步骤15,否则执行步骤18;

步骤15:判断ch是否为’*’,若是依次执行步骤3、步骤16,否则执行步骤18;

步骤16:判断ch是否为’/’,若是依次执行步骤3、步骤18,否则执行步骤18;

步骤17:判断ch是否为'+'、'*'、'-'、'/'、'>'、'<'、'='、'&'、'|'、'~',若是写回文件对应类型,否则执行步骤1;

步骤18:判断ch是否为’/’,若是执行步骤19,否则执行步骤17;

步骤19:判断ch是否为9,若是执行步骤17,否则依次执行步骤3、步骤17;

步骤20:判断ch是否为界符,若是将str类型设置为”separators”,写回文件,否则执行步骤21;

步骤21:将str类型设置为”error”,写回文件,执行步骤1,否则执行步骤1;

步骤22:结束。

jmeter表单式编辑需要实现json与xml的相互转化,最关键的是制定结构对应关系,使得xml结构中的标签名、标签属性及值、子标签,在json有对应的存储方式。最终指定的对应关系如下:

webide的通信模块设计了start,stop和status三种操作原语,并使用celery+haproxy的解决方案实现了分布式异步队列。

1.操作原语规定了通信模块统一的接口标准

1.1start开始服务,传入详细的运行参数,运行容器镜像文件相应的执行脚本,返回容器运行的进程pid,更新异步队列中的信息。开始服务原语考虑了服务的重入,多次开始服务只会触发一次开始效果。

1.2stop停止服务,传入服务进程pid作为参数,通过执行容器脚本停止容器镜像的运行,返回执行状态,更新异步队列中的信息。

1.3status查看服务状态,传入服务进程pid,通过执行容器脚本查询服务运行的进度。

2.采用celery集成rabbitmq队列,实现了异步队列,能够动态的添加、删除和更新队列中的消息或消息组。celery对rabbitmq进行包装,按照操作原语的标准对外暴露start,stop和status接口。

3.使用haproxy作为负载均衡的方案。采用四层负载均衡,并且使用动态权重的roundrobin算法。负载均衡的方案流程如下:

3.1规定初始服务器负载权重

3.2haproxy监控服务器性能状态

3.3服务器运行队列中的服务

3.4服务器性能状态改变

3.5haproxy修改负载权重

本发明中涉及了若干项关键技术,说明如下:

1)websocket

在本发明中,websocket主要用来实现服务端与客户端的双向通信机制,使得服务端可以主动将运行提交结果等数据主动推送到客户端进行展示。

2)nginx

在本发明中,nginx主要用来进行前端静态文件部署和后端请求转发,与sticky算法结合实现服务端负载均衡,提升webide性能。

3)nas

在本发明中,nas主要用来进行服务器上的文件挂载,实现多个计算节点上文件和目录的共享与实时更新。

4)celery+rabbitmq

在本发明中,使用celery集成rabbitmq队列,实现了异步队列。

5)haproxy

在本发明中,使用haproxy作为负载均衡的方案。采用四层负载均衡,并且使用动态权重的roundrobin算法。

综上所述,本发明将本地开发转为线上开发,大大减少了用户配置环境花费的时间精力,兼容多种编程语言和项目类型,可扩展性良好。同时进行了多方位负载均衡保证,能够在短时间内承载大量的用户操作,对服务器资源合理分配,打造高性能、高可用的集成在线开发平台。

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