掌桥专利:专业的专利平台
掌桥专利
首页

一种分布式在线代码编译运行方法及系统

文献发布时间:2024-04-18 19:58:26


一种分布式在线代码编译运行方法及系统

技术领域

本发明涉及在线代码编译技术领域,尤其涉及一种分布式在线代码编译运行方法及系统。

背景技术

代码是现今计算机领域不可或缺的关键基础支撑技术,是各种计算机软件和AI程序发展的基石。以python程序为例,它具有较为简单的句法格式和成熟的上层封装,但任何一个初学者在学习python程序时都要解决环境路径配置、python解释器安装和代码编辑工具选择等等问题。对初学者来说,这些问题常常是复杂的,在线式代码编辑和运行工具要更有优势。

然而高并发大流量的线上请求运行程序会给服务器带来非常大的压力,目前大多数工作在面临程序死循环和运行时间较长时都只采用简单杀死进程的方法,满足不了多用户长时间利用线上工具运行代码的需求。同时现有的分布式框架都不支持毫秒级任务和每秒高百万个任务并发,在嵌套并行方面(例如超参数搜索内部的并行模拟)也支持不足。

发明内容

基于背景技术存在的技术问题,本发明提出了一种分布式在线代码编译运行方法及系统,保证了高并发大流量情况下的代码运行需求以及如何支持毫秒级任务及任务嵌套并行。

本发明提出的一种分布式在线代码编译运行方法,包括如下步骤:

S1:分区读入用户代码并存储于全局控制存储器中;

S2:基于混沌进化的实时优化调度方法,在全局调度器与远程节点之间建立调度策略,以通过全局调度器将用户代码调度到远程节点中,各个远程节点执行用户代码并在各个节点之间共享内存;

S3:获取远程节点执行用户代码后的代码运行结果并返回给用户;

其中,在S2中,基于混沌进化的实时优化调度方法具体如下:

S21:计算调度期间内所有远程节点的运行效益

S22:设定远程节点原始种群

S23:假设种群代数为

S24:基于运行效益

进一步地,所述运行效益

其中,

进一步地,变异个体

其中,

进一步地,最优解

其中,

进一步地,在步骤S23中,基于混沌理论的无周期变动性特征,在交叉操作对中采用混沌优化以得到子代个体

通过映射得到的混沌数学模型为

基于不同

利用初始时间序列矩阵分解远程节点个体样本

基于远程节点个体样本

通过动态概率的方式选择矩阵

将概率

以初始优化解个数作为不同通道分别对所有变异个体进行交叉操作得到子代个体

进一步地,概率

其中,

进一步地,步骤S1中,具体包括:

设计两级哈希映射,第一级主哈希映射将每个主题与至少一个处理该主题的节点列表配对,用于将用户代码发送到该节点,第二级副哈希映射将每个主题与仅在该节点上存在的分区列表配对,用于将用户代码发送到该分区中;

采用基于计数器的轮询技术,当用户代码基于第一级主哈希映射选择了该节点,则基于第二级副哈希映射继续访问该节点中的分区,以选择分区。

进一步地,在步骤S2中,通过全局调度器将用户代码调度到远程节点中,各个远程节点执行用户代码并在各个节点之间共享内存,具体包括:

远程函数add()在初始化时自动向全局控制存储器注册,并分发给每个节点的工作执行进程;

设定对象a和b,其中a和b分别存储在节点N1和N2上,远程函数add(a,b)启动并提交给本地调度器,通过本地调度器;

全局调度器在全局控制存储器中查找add(a,b)参数的位置,并在存储参数b的节点N2上进行调度任务;

节点N2处的本地调度器检查本地对象存储器是否包含add(a,b)的参数,当不包含时,通过在全局控制存储器中查找a的位置得到a储存在N1上;

N2的本地对象存储器在本地工作程序调用add(),通过共享内存访问参数以在N2的本地复制a,从而实现各个远程节点执行用户代码并在各个节点之间共享内存。

一种分布式在线代码编译运行系统,包括分区读入模块、调度模块和反馈模块;

所述分区读入模块用于分区读入用户代码并存储于全局控制存储器中;

所述调度模块用于基于混沌进化的实时优化调度方法,在全局调度器与远程节点之间建立调度策略,以通过全局调度器将用户代码调度到远程节点中,各个远程节点执行用户代码并在各个节点之间共享内存;

所述反馈模块用于获取远程节点执行用户代码后的代码运行结果并返回给用户;

所述调度模块的实时优化调度过程具体如下:

计算调度期间内所有远程节点的运行效益

设定远程节点原始种群

假设种群代数为

基于运行效益

本发明提供的一种分布式在线代码编译运行方法及系统的优点在于:本发明结构中提供的一种分布式在线代码编译运行方法及系统,利用分布式集群部署有效提高应对高并发大流量的问题性,保证了高并发大流量情况下的代码运行需求以及如何支持毫秒级任务及任务嵌套并行。该分布式在线代码运行框架支持毫秒级任务、每秒高百万个任务并发、任务嵌套并行和异构资源使用,可以有效解决高并发大流量情况下的代码运行需求,即使个别节点宕机并不影响使用。

附图说明

图1为本发明的流程示意图;

图2为分布式在线代码编译运行框架示意图;

图3为消息写入分区的示意图;

图4为代码远程运行控制部分示意图;

图5为代码提交远程运行流程示意图;

图6为代码返回远程运行结果流程示意图;

图7为远程节点调度进化的流程流程图。

具体实施方式

下面,通过具体实施例对本发明的技术方案进行详细说明,在下面的描述中阐述了很多具体细节以便于充分理解本发明。但是本发明能够以很多不同于在此描述的其他方式来实施,本领域技术人员可以在不违背本发明内涵的情况下做类似改进,因此本发明不受下面公开的具体实施的限制。

针对如何保证高并发大流量情况下的代码运行需求以及如何支持毫秒级任务及任务嵌套并行。

如图2所示,首先建立一套完整的WebUI界面,方便用户简单的访问和使用系统。然后利用JavaSpringBoot技术建立服务器控制层来接收WebUI界面的访问请求,在接收到请求之后,将请求送入消息队列。消息队列将不同请求分批次送入不同的分区(将请求送入各个分区之中,物理上在磁盘的大容量空闲块创立分区同名的文件夹,将各个请求写入的消息追加到分区数据文件的尾部),具体实现利用文件系统的磁盘写入读取机制。再利用JavaSpringBoot技术建立服务器能力层,服务器能力层用来负责接收大量的请求消息,每个能力模块单元(服务器能力层包括多个能力模块单元)订阅一个或是多个分区的消息队列,物理上在分文对应文件夹多个固定文件顺序读写,能力模块单元具有多个可以分开部署,每个能力模块单元从各自分区读取用户运行代码请求并对用户代码处理。每个能力模块单元都利用http服务与代码运行全局调度控制器交互并提交运行代码请求,代码运行全局调度控制器确定代码执行依赖并分发代码任务,各个远程节点执行代码并在各个节点之间共享内存。执行完毕后生成键值对写入内存,服务器控制层读取代码运行结果并返回给用户。

其中,建立全局调度器,任务调度和存储调度分别由全局控制存储器、全局存储器完成,其中全局控制存储器存储对象查询表、任务查询表、函数查询表和操作日志。建立远程代码执行节点,包括本地内存保持器、本地调度器、工作执行进程、对象数据存储器、对象管理器等,远程节点负责任务的具体执行。需要执行的代码首先利用标识注册到全局控制存储器,然后分发给节点的工作执行进程,工作执行进程完成任务并与本地调度中心完成交互,如果存在函数执行依赖不在本地对象数据存储器,本地调度中心与全局控制存储中心交互并复制内存,同一节点的各个执行工作进程通过共享对象数据存储器分享参数。发生故障时,各个组件只需重新启动并从全局控制存储器读取沿袭,所有组件都通过全局控制存储器共享所需状态。

如图1至7所示,本发明提出的一种分布式在线代码编译运行方法,包括如下步骤:

S1:分区读入用户代码并存储于全局控制存储器中;

S2:基于混沌进化的实时优化调度方法,在全局调度器与远程节点之间建立调度策略,以通过全局调度器将用户代码调度到远程节点中,各个远程节点执行用户代码并在各个节点之间共享内存;

S3:获取远程节点执行用户代码后的代码运行结果并返回给用户;

通过步骤S1至S3,利用分布式集群部署有效提高应对高并发大流量的问题性,保证了高并发大流量情况下的代码运行需求以及如何支持毫秒级任务及任务嵌套并行。该分布式在线代码运行框架支持毫秒级任务、每秒高百万个任务并发、任务嵌套并行和异构资源使用,可以有效解决高并发大流量情况下的代码运行需求,即使个别节点宕机并不影响使用。

以下具体说明。

一.服务器消息接受转发部分

服务器消息接受转发部分主要分为三个模块:服务器控制层、服务器能力层和消息转发层。为了保证能大量接收用户的WebUI发送的代码运行请求,基于springboot的框架设计出利用websocket通信协议的服务器控制层。服务器控制层主要负责接收用户代码,处理用户非代码运行的需求,及时返回用户不需要等待的传输信息。同时,在用户代码运行完成后,利用websocket通信协议主动向用户WebUI界面发送代码运行结果,不需要用户主动轮询,节约带宽和cpu资源。

普通服务器处理用户请求不设计消息转发模块,但本方法在服务器控制层、服务器能力层设计了消息转发层。原因是:对于代码运行需求来说,用户代码上会附加大量的操作,包括但不限于引入公开依赖、读取敏感信息等等,我们需要对用户的代码进行分析,去除代码敏感操作以及处理代码运行前置问题。同时用户代码可能会有大量错误,以至于不能通过代码编译,将未通过编译的代码直接运行会消耗大量的时间、带宽和内存资源,所以在将消息送入代码运行模块之前就需要对代码进行编译检查,这些操作都需要服务器能力层完成。编译检查和去除代码敏感操作以及处理代码运行前置问题是一个不能即使返回的操作,但服务器控制层会接收源源不断的用户操作,为此利用消息转发层平衡服务器控制层和服务器能力层之间的关系,能力层也可以使用消息转发层来实现多服务器分布式部署。

消息转发层具体实现使用发布/订阅模式,对于消息转发层来说,服务器控制层是发布者,服务器能力层是订阅者,发布者和订阅者都可以有多个。发布者生产消息到队列,然后订阅者从队列中取出并且消费消息。消息被消费后,队列将不再存储消息,其它所有订阅者不能消费到已经被消费过的消息。队列支持存在多个发布者,但是对一条发布者生产的消息而言,只会有一个订阅者可以消费,其它订阅者则不能再次消费。当订阅者不存在时,消息则由队列一直保存,直到有订阅者把它消费完成。

本实施例公开了一种不同于以往常规的分区方法,基于节点的双哈希映射分区方法。设计两级哈希映射,第一级主哈希映射将每个主题与至少一个处理该主题的节点列表配对,用于将用户代码发送到该节点,第二级副哈希映射将每个主题与仅在该节点上存在的分区列表配对,用于将用户代码发送到该分区中。采用基于计数器的轮询技术,与原始的分区器不相同,当用户代码基于第一级主哈希映射一旦选择了该节点,系统就会访问其在分区器内存中的表示,以检索第二级副哈希映射,第二级副哈希映射将最终在所选节点内选择分区。对于分区器未见的节点对象表示,还有另一个按主题计数器选择的设置,它有助于所选分区的节点内部轮换,但不需要另一个专用的查找表,因为这个特殊的计数器可以与其自己的分区列表一起保存。同时对于具有相同领导节点的分区,本实施例设计保持轮询选择策略,当分区出现故障并得到解决分区重新上线时,这些分区中的一些主题将返回到其原始所有者。

消息转发层的队列设计多个分区,一个分区可以有一个或者多个订阅者消费它的数据。 每个队列都形成一个分区日志,如图3所示,每个分区文件都是一个有序的记录序列(不可变),在磁盘顺序读写。如果有新的日志会按顺序结构化添加到末尾,分区文件中的记录每个都按顺序的分配一个固定ID号,命名为偏移量,在整个分区中具有唯一性。如图2所示,有分区0、分区1、分区2,其中日志写入的顺序从老到新,ID号命名从0-12等。

消息转发层中发布者发布过的消息记录会被持久化到硬盘中,无论该消息是否被消费,发布记录都会被消息转发层保留到硬盘当中,同时设置保留期限。假定保留策略设置为两天,则在发布消息的两天内,该消息可供使用,之后则被消息转发层丢弃以释放空间,因此消息转发层的性能在数据大小方面是非常出色的,可以长时间保留数据不成问题。

日志中分区有几个用途。首先,它们允许日志的大小超出适合单台服务器的大小,每个单独的分区必须适合托管它的服务器,但是一个队列可能有许多分区,因此它可以处理任意数量的数据,其次,他们作为并行的单位更多的是在同一点上。分区日志分布在队列集群中的服务器上,这些服务器都处理数据并请求共享分区。为了实现容错,每个分区被复制到多个可配置的队列集群中的服务器上。每个分区都有一个控制服务器,假如分区1分别被复制到了三台服务器上,其中第二台为这个分区的控制服务器,其它两台服务器都会成为这个分区的跟随服务器。其中分片的控制服务器处理该分区的所有读和写请求,而跟随服务器被动地复制控制服务器所发生的改变,如果该分片的控制服务器发生了故障等,两个跟随服务器中的其中一台服务器将自动成为新的控制服务器。每台服务器都充当一些分区的控制服务器和一些分区的跟随服务器,因此消息队列集群内的负载非常平衡。

二.远程代码运行控制部分

在服务器能力层对用户代码完成清洗和处理过后,能力层会将请求传输到远程代码运行控制部分。远程代码运行控制部分主要由以下结构组成:

1、全局调度器:用于接收本地调度器提交的任务,并将任务分发给合适的本地任务调度器执行。

2、内存保持器:用于保存分布式任务的状态信息,包括对象机器的映射、任务描述、任务纠错信息等。

3、本地调度器:用于提交任务到全局调度器,以及分配任务给当前机器的工作执行进程。

4、工作执行进程:用于执行分布式运算任务,并将运算结果存储到数据对象存储器。

5、对象数据存储器:每个节点上启动了一个对象数据存储器存储只读数据对象,工作执行进程可以通过共享内存的方式访问这些对象数据,这样可以有效地减少内存拷贝和对象序列化成本。对象数据存储器底层由Apache Arrow框架实现。

6.对象管理器:每个节点上的对象数据存储器都由对象管理器进行管理,它可以在工作执行进程访问本地象数据存储器上不存在的远程数据对象时,主动拉取其它节点上的对象数据到当前节点。

7.全局控制存储器:全局控制存储保持系统的整个控制状态,全局控制存储器只保存对象查询表、任务查询表、函数查询表及操作日志,将对象数据存储下放到节点存储,这样可以实现持久沿袭存储与其他系统组件分离,允许每个组件独立扩展。同时将对象元数据存储在全局控制存储器中而不是全局调度器中,从而将任务调度与存储调度完全分离。全局控制存储器大大简化了远程代码运行控制部分的总体设计,因为它使系统中的每个组件都可以无状态。这不仅简化了对容错的支持(即,在发生故障时,组件只需重新启动并从全局控制存储器读取沿袭),而且由于所有组件都通过全局控制存储器共享所需状态,因此可以轻松地独立扩展分布式对象存储和调度程序。另一个好处是易于开发调试、分析和可视化工具。

具体的,本申请在用户提交到代码之后,全局调度器会首先接收用户代码任务并将基本信息存储于全局控制存储器中。在全局调度器之后还需要将代码运行任务下发到远程节点。本实施例在全局调度器与远程节点之间,设计了一种基于混沌进化的实时优化调度方法,如图7所示,具体如下:

S21:计算调度期间内所有远程节点的运行效益

其中,

S22:设定远程节点原始种群

S23:假设种群代数为

其中,

其中,

本实施例利用混沌理论的无周期变动性特征,采用混沌映射的方法生成混沌原始时间序列模拟混沌遍历运动,并将其转化为远程节点群优化变量以求得最优解。即基于混沌理论的无周期变动性特征,在交叉操作对中采用混沌优化以得到子代个体

S23-1:通过映射得到的混沌数学模型为

为混沌变量,b取值范围为[0,1]。

S23-2:基于不同

通过不同的

S23-3:利用初始时间序列矩阵分解远程节点个体样本

S23-4:基于远程节点个体样本

S23-5:通过动态概率的方式选择矩阵

其中,

的取值一般在0.5,如果/>

动态概率

S23-6:将概率

每个初始优化解对应

S23-7:以初始优化解个数作为不同通道分别对所有变异个体进行交叉操作得到子代个体

S24:基于运行效益

其中,

根据步骤S21至S24,本实施例使用并行算法来同时处理混沌进化算法中的交叉、变异、选择和混沌优化过程,具体为并行计算中交叉、变异、选择虽然为依次连接关系,但是交叉、变异、选择可以并行处理,因而可以在交叉操作过程中加入混沌优化以得到最优解,也就是得到最优远程节点。在差分进化算法过程中,远程节点种群被划分,并在不同的计算机上进行变异、交叉和最优解选择,然后转入下一代进程并重新进行种群划分,反复迭代并行计算流程,直到达到最大迭代次数G为止。对于混沌优化过程中的精英个体混沌局部搜索(也就是交叉操作过程中),本实施例使用并行算法来划分远程节点种群,并将精英种群放在其中一个远程节点上进行混沌局部搜索,以找到最优解,同时进行混沌全局搜索任务,直到迭代结束,最终得到子代个体

在全局控制器将用户提交代码转发到远程节点开始执行之后的流程设计可以见图4,在图4中通过一个简单的示例说明了远程代码运行控制部分是如何工作的。在图4中添加两个对象a和b(可以是标量或矩阵),并返回结果c。远程函数add()在初始化时自动向全局控制存储器注册,并分发给系统中的每个工作执行进程(图5中的步骤0)。

图5后续显示了由工作进程启动项调用add函数触发的分步操作。首先远程(a,b),其中a和b分别存储在节点N1和N2上。然后工作进程启动项将add(a,b)提交给本地调度器(步骤1),后者将其转发给全局调度器(步骤2)。接下来,全局调度器在全局控制存储器中查找add(a,b)参数的位置(步骤3),并决定在存储参数b的节点N2上调度任务(步骤4)。节点N2处的本地调度器检查本地对象存储器是否包含add(a,b)的参数(步骤5)。然而本地对象存储器没有对象a,于是在全局控制存储器中查找a的位置(步骤6)。得知a存储在N1,N2的本地对象存储器在本地复制它(步骤7)。由于add()的所有参数现在都存储在本地,因此本地调度器在本地工作程序调用add()(步骤8),该工作程序通过共享内存访问参数(步骤9)。

图6显示了远程代码运行控制部分的返回运行结果操作流程。首先是节点N1处的get()和节点N2处的add()。由于remote.get(idc)的调用,工作进程启动项使用add()返回的结果idc检查本地对象存储中的值c(步骤1)。由于本地对象存储器未存储c,因此它在全局控制存储器中查找其位置。此时,全局控制存储器没有c的条目,因为尚未创建c。于是N1的对象存储器在对象查询表中注册了一个回调,当创建了c的条目时将被触发(步骤2)。同时,在节点N2,add函数()完成其执行,将结果c存储在本地对象存储中(步骤3),然后将c的条目添加到全局控制存储器(步骤4)。结果,全局控制存储器用c的条目触发对节点N1的对象存储的回调(步骤5)。接下来,N1从N2复制c(步骤6),并将c返回到remote.get()函数(步骤7),最终完成任务。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,根据本发明的技术方案及其发明构思加以等同替换或改变,都应涵盖在本发明的保护范围之内。

相关技术
  • 一种代码编译方法、计算机装置及计算机可读存储介质
  • 一种动态编译运行外部代码的系统及其方法
  • 一种分布式代码运行及交互安全方法及其系统
技术分类

06120116486599