构造数据队列的方法、装置及从其插入和消费对象的方法

文档序号:9261355阅读:379来源:国知局
构造数据队列的方法、装置及从其插入和消费对象的方法
【技术领域】
[0001]本申请涉及计算机技术,尤其是涉及一种构造数据队列的方法。本申请还涉及一种向该构造数据队列的方法构造的队列中插入对象以及从该队列中消费对象的方法。另夕卜,本申请还涉及一种构造数据队列的装置。
【背景技术】
[0002]计算机领域需要处理大量的数据,因此,如何有效的实现存储和组织数据是一个重要的问题,为此,产生了专门研究上述问题的学科,即数据结构。
[0003]数据队列(Queue)是一种常用的数据结构;通常的数据队列是一种先进先出的线性表。它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。这种数据结构形式在多种数据处理场合均有应用。
[0004]例如,在实时计算系统也可称为流式计算系统中,数据从产生就源源不断地参与计算的系统。在大数据处理领域,相比于其它非流式计算系统,如著名的Hadoop(分布式系统),流式计算具有数据低延迟、实时可查等特点。在流式计算系统中,任意计算节点在内部都会用队列(Queue)来保存接收或发送数据,对经过队列的数据而言,其具有先进先出的语义特点。数据从一端进入队列称为“入队”,从另一端离开队列称为“出队”。在流式计算系统中,队列常被作为消息缓冲区使用。
[0005]具体地,所述流式计算系统的拓扑结构包含两部分:数据节点和数据流。如图1所示,所述数据节点(Node)是指:数据实际发生改变的地方,接受系统其它来源的数据作为输入,经过内部加工处理后作为输出。在分布式环境下,计算节点通常部署在不同的物理机器上,同时充当资源的划分和管理者;所述数据流(Stream)是指:有向连接不同计算节点,提供上一个节点的输出到下一个节点输入的数据通道。
[0006]数据节点的内部结构如图2所示,首先流入的所有数据都要经过节点接受队列recvQueue排队,recvQueue队列中的数据通过数据自身的任务标识taskld转发到对应的任务队列taskQueue ;每个数据都含有taskld,以表明需要被哪个具体的任务处理;每个任务从自己的任务队列taskQueue中取出数据进行逻辑处理,如清洗、过滤、聚合、计算等进程;然后将加工后的数据放入节点的输出队列sendQueue中流入下游关联节点。从中可以看出,每个节点都含有一个接收队列recQueue、输出队列sendQueue,以及若干任务队列taskQueue,接收队列recQueue用于流入数据的分发,输出队列sendQueue则起到汇总流出数据的作用,而任务队列taskQueue作为缓冲器则将真正的计算逻辑和数据流进行了解率禹。
[0007]现有实时计算系统中采用的队列模型是阻塞队列模型(BlockingQueue),该阻塞队列模型支持链表和数组两种形态。在队列容量限定情况下,采用阻塞的策略进行数据存取。但是,BlockingQueue模型在队头和队尾各有一把悲观锁来控制数据的存取,所以在高并发情况下存在严重的性能开销问题。另外,BlockingQueue模型的数据存取在现代计算机体系中是高速缓存不友好(not cache friendly)的,容易出现伪共享的问题。在多线程竞争下,加锁、释放锁的操作会导致比较多的上下文切换和调度延时,使用锁的代码模块通常难以进行组合,所以极易引起系统吞吐量低、数据延迟等性能问题,并且锁在解决并行过程中资源访问问题的同时可能会引入诸多新的问题,比如死锁(dead lock)的问题。

【发明内容】

[0008]本申请提供一种构造数据队列的方法,以解决现有数据队列具有的上述问题。
[0009]本申请另外提供一种向数据队列中插入对象的方法,以解决向现有的数据队列中插入对象时出现的系统吞吐量低、数据延迟等性能问题。
[0010]本申请另外提供一种从数据队列中消费对象的方法,以解决从现有的数据队列中消费对象时出现的系统吞吐量低、数据延迟等性能问题。
[0011]本申请另外提供一种构造数据队列的装置,以解决现有数据队列具有的上述问题。
[0012]本申请提供一种构造数据队列的方法,包括设置环形数组,为环形数组设置put计数器和take计数器。
[0013]所述环形数组具有size个槽位,首尾槽位衔接,形成环形,每个槽位中可存储规定格式的数据对象;向该环形数组中存储数据对象称为插入对象,从该环形数组中拉取数据对象并清空相应的槽位称为消费对象;所述插入和消费均沿环形数组规定方向顺序操作,所述规定方向称为操作方向。所述PUt计数器对向环形数组插入对象进行计数;所述take计数器对从环形数组消费对象进行计数;所述put计数器和take计数器为初始值为零的递增变量。
[0014]优选地,所述put计数器和take计数器为递增变量具体是,所述put计数器和take计数器均为64字节填充的长整形严格递增变量。
[0015]优选地,所述size为2的指数倍。
[0016]优选地,对环形数组中的槽位赋予从O开始沿操作方向递增的槽位值。
[0017]本申请还提供一种向该构造数据队列的方法构造的队列中插入对象的方法,所述数据队列为上述根据构造数据队列的方法构造的数据队列。该向数据队列中插入对象的方法包括:获取数据队列中put计数器的值;原子递增put计数器的值,作为put计数器的当前值;获取数据队列中take计数器的当前值;根据put计数器的当前值与take计数器的当前值判断是否可以插入对象;若判断结果为是,则进入下一步;向数据队列中指定槽位插入对象;将put计数器的当前值作为最新的put计数器的值发布。
[0018]可选地,所述原子递增put计数器,获取put计数器的当前值的步骤采用下述方法:
[0019]若生产者为一个,将put计数器的值原子递增1,作为put计数器的当前值。
[0020]若生产者为至少两个,则对put计数器的值以CAS原子操作的方式进行所述原子递增,操作结果作为PUt计数器的当前值。
[0021]可选地,所述根据put计数器的当前值与take计数器的当前值判断是否可以插入对象,包括:
[0022]作put计数器的当前值减去take计数器的当前值的差运算。
[0023]判断运算结果是否等于size值,若是,则是否可以插入对象的判断结果为否,并进入判断是否等待步骤;若否,则所述是否可以插入对象的判结果为是。
[0024]判断是否等待步骤的判断结果如果为是,则继续作前述差运算;判断结果如果为否,则结束插入对象的操作。
[0025]可选地,向数据队列中指定槽位插入对象的步骤中,以下述方式确定所述指定槽位:
[0026]以put计数器当前值的二进制形式与size-Ι的值的二进制形式进行按位与运算,计算的结果赋予插入槽位值Slotput,该插入槽位值Slotput即为所述指定槽位。
[0027]本申请还提供一种从数据队列中消费对象的方法,所述数据队列为上述根据构造数据队列的方法构造的数据队列。该从数据队列中消费对象的方法包括:
[0028]获取put计数器及take计数器的值;根据上述计数器的值,判断是否可以消费对象;若是,则进入下一步;将take计数器的值原子递增,作为take计数器的当前值;根据take计数器的当前值,确定消费对象相对应的槽位值;从相对应的槽位值的槽位中消费对象。
[0029]可选地,所述根据上述计数器的值,判断是否可以消费对象,包括如下步骤:
[0030]作put计数器的值减去take计数器的值的差运算。
[0031]若上述差运算结果大于零,则判断结果为是;若运算结果小于或者等于零,则判断结果为否,并进入判断是否等待步骤。
[0032]判断是否等待步骤的判断结果如果为是,则继续作前述差运算;判断结果如果为否,则结束消费对象的操作。
[0033]可选地,所述确定消费对象相对应的槽位值的步骤中,以下述方式确定所述相对应的槽位:
[0034]通过take计数器当前值与size_l的值以二进制形式进行按位与运算,计算的结果赋予消费槽位值Slottate,对应该Slottake的槽位即为所述相对应的槽位。
[0035]与现有技术相比,本申请其中一方面具有以下优点:本申请提供一种构造数据队列的方法,包括设置环形数组、为环形数组设置put计数器和take计数器。所述环形数组具有size个槽位,首尾槽位衔接,形成环形,每个槽位中可存储规定格式的数据对象;
当前第1页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1