发明内容
本发明要解决以上技术问题,提供一种队列数据的分发和处理算法,既能满足大规模数据的并行处理需求,又能够满足有些数据的先后处理顺序的需求。
为解决上述技术问题,本发明采用的技术方案是:一种队列数据的分发和处理算法,包括数据编码器、数据队列管理器、等待队列管理器和多个任务机,
所述数据编码器从数据源接收数据,并对接收到的数据按照ID-base64(body)-OP的编码结构进行数据编码生成编码数据,所述数据编码器将所述编码数据发送到所述数据队列管理器中,
所述数据队列管理器在启动时创建空的先进先出数据队列,把接收到的所述编码数据保存到所述先进先出数据队列尾部,然后所述数据队列管理器从所述先进先出数据队列头部取出所述编码数据进行分发,所述分发算法如下:
a)如果所述先进先出数据队列为空,则所述数据队列管理器处于等待状态;
b)如果所述先进先出数据队列中有编码数据,取出所述先进先出数据队列头部的一个所述编码数据,根据所述编码结构获得所述编码数据的编号ID,并判断所述编号ID是否加锁;
c)如果没有加锁,则对所述编号ID进行加锁,然后把所述编码数据发送出去,并等待第一个有空闲的任务机接收所述编码数据,同时转到步骤f);
d)如果已经加锁,则把所述编码数据发送到所述等待队列管理器;
e)所述编码数据分发成功后,转到步骤a)进行循环;
f)提供一个解锁接口,等待任务机模块调用,所述解锁接口将所述步骤c)中已经加锁的所述编号ID作为输入参数,调用所述解锁接口后,对所述步骤c)已经加锁的所述编号ID进行解锁;
所述等待队列管理器接收所述步骤d)已经加锁的所述编码数据,并把所述编码数据保存到一个等待队列中,其管理算法如下:
g)所述等待队列管理器启动时,创建一个空的数据队列,所述数据队列可以在任意位置插入或者取出数据;
h)所述等待队列管理器接收到所述步骤d)中已经加锁的所述编码数据时,保存到所述数据队列的尾部;
i)提供一个取出接口,等待任务机模块调用,所述取出接口将所述步骤d)中已经加锁的所述编码数据的编号ID作为输入编号ID,调用所述取出接口后,从所述数据队列中取出第一条编号ID等于所述输入编号ID的编码数据,如果没有找到等于所述输入编号ID的编码数据,则返回空;
所述任务机对所述步骤c)中收到的所述编码数据,按照操作指令OP的要求进行处理,所述任务机为多个,所述任务机的处理流程如下:
j)所述任务机启动时向所述数据队列管理器注册,表明可以接收所述编码数据,所述任务机处于空闲状态;
k)多个所述任务机的第一次空闲状态是由注册时的先后顺序决定的;
l)所述任务机从所述数据队列管理模块的步骤c)中,收取一条发送过来的所述编码数据;
m)所述任务机解析所述编码数据获得所述编码数据的编号ID、数据主体Body和操作指令OP;
n)所述任务机根据所述操作指令OP对所述数据主体Body进行操作;
o)所述编码数据处理完成后,所述任务机从所述等待队列管理器中调用步骤i)接口,取出下一个编号ID等于当前编号ID的编码数据;
p)如果步骤o)所述下一个编号ID等于当前编号ID的编码数据为空,通知所述数据队列管理模块调用步骤f)接口对所述编号ID进行解锁,解锁完成后,所述任务机处于空闲状态,然后转到步骤c)继续收取下一条数据;
q)如果步骤o)数据项不为空,则以这个数据项为新的编码数据,然后转到步骤m)由该任务机继续处理这个新的编码数据。
所述数据编码器通过Socket或者进程间通信接收所述编码数据。
所述数据主体Body采用base64格式。
本发明具有的优点和积极效果是:一种队列数据的分发和处理算法,对每种数据和处理规则进行编码,并保存到一个先进先出的数据队列中,然后依据编码内容,确定该数据是否需要等待其它数据处理完成,或者不需要可以直接处理,然后再由相关的任务机进行处理,能够满足对无先后顺序处理要求的数据由不同任务机并发处理,而对于有先后顺序处理要求的数据又能够分配到某任务机排队处理,最终能够同时满足两种不同条件的数据处理需求。
具体实施方式
下面结合附图对本发明的具体实施例做详细说明。
如图1-2所示,一种队列数据的分发和处理算法,包括数据编码器、数据队列管理器、等待队列管理器和多个任务机,
所述数据编码器从数据源接收数据。这里数据源传输来的数据是有如下三部分组成:
1)数据编号ID:每个数据都一个ID编号,相同ID的数据,表明需要等待之前有该编号ID的数据处理完成,即有先后处理顺序的要求。不同编号ID的数据,可以并发处理,没有先后处理顺序的要求。
2)数据主体Body:为实际数据内容,可以为任意数据类型
3)操作指令OP:一个对该数据主体的操作指令,任务机根据这个指令知道如何处理该数据:
所述数据编码器对接收到的数据按照ID-base64(body)-OP的编码结构进行数据编码生成编码数据。将所述编码数据发送到所述数据队列管理器中。
所述数据队列管理器在启动时创建空的先进先出数据队列,把接收到的所述编码数据保存到所述先进先出数据队列尾部,然后所述数据队列管理器从所述先进先出数据队列头部取出所述编码数据进行分发,所述分发算法如下:
a)如果所述先进先出数据队列为空,则所述数据队列管理器处于等待状态;
b)如果所述先进先出数据队列中有编码数据,取出所述先进先出数据队列头部的一个所述编码数据,根据所述编码结构获得所述编码数据的编号ID,并判断所述编号ID是否加锁;
c)如果没有加锁,则对所述编号ID进行加锁,然后把所述编码数据发送出去,并等待第一个有空闲的任务机接收所述编码数据,同时转到步骤f);
d)如果已经加锁,则把所述编码数据发送到所述等待队列管理器;
e)所述编码数据分发成功后,转到步骤a)进行循环;
f)提供一个解锁接口,等待任务机模块调用。所述解锁接口将所述步骤c)中已经加锁的所述编号ID作为输入参数,调用所述解锁接口后,对所述步骤c)已经加锁的所述编号ID进行解锁;
所述等待队列管理器接收所述步骤d)已经加锁的所述编码数据,并把所述编码数据保存到一个等待队列中,其管理算法如下:
g)所述等待队列管理器启动时,创建一个空的数据队列,所述数据队列可以在任意位置插入或者取出数据;
h)所述等待队列管理器接收到所述步骤d)中已经加锁的所述编码数据时,保存到所述数据队列的尾部;
i)提供一个取出接口,等待任务机模块调用。所述取出接口将所述步骤d)中已经加锁的所述编码数据的编号ID作为输入编号ID,调用所述取出接口后,从所述数据队列中取出第一条编号ID等于所述输入编号ID的编码数据,如果没有找到等于所述输入编号ID的编码数据,则返回空;
所述任务机对所述步骤c)中收到的所述编码数据,按照操作指令OP的要求进行处理,所述任务机为多个,所述任务机的处理流程如下:
j)所述任务机启动时向所述数据队列管理器注册,表明可以接收所述编码数据,所述任务机处于空闲状态;
k)多个所述任务机的第一次空闲状态是由注册时的先后顺序决定的;
l)所述任务机从所述数据队列管理模块的步骤c)中,收取一条发送过来的所述编码数据;
m)所述任务机解析所述编码数据获得所述编码数据的编号ID、数据主体Body和操作指令OP;
n)所述任务机根据所述操作指令OP对所述数据主体Body进行操作;
o)所述编码数据处理完成后,所述任务机从所述等待队列管理器中调用步骤i)接口,取出下一个编号ID等于当前编号ID的编码数据;
p)如果步骤o)所述下一个编号ID等于当前编号ID的编码数据为空,通知所述数据队列管理模块调用步骤f)接口对所述编号ID进行解锁,解锁完成后,所述任务机处于空闲状态,然后转到步骤c)继续收取下一条数据;
q)如果步骤o)数据项不为空,则以这个数据项为新的编码数据,然后转到步骤m)由该任务机继续处理这个新的编码数据。
所述数据编码器通过Socket或者进程间通信接收所述编码数据。
所述数据主体Body采用base64格式。
一种队列数据的分发和处理算法的最佳实施方式:主要模块包括数据编码器、数据队列管理器、等待队列管理器和多个任务机。模块可以运行在不同物理机或者同一物理机的多个进程或线程。模块之间采用Socket通信或者进程间通信来发送和接收数据。
数据来源是通过Socket通信和进程间通信向数据编码器传递相关数据。传递前需要处理好数据编号ID、数据主体Body和任务机可理解的操作指令OP。比如对于文本文件,可以每一行的行号为数据编号,行的内容为数据主体;或者每个段落的段落号为数据编号,段落的内容为数据主体;对于数据库类型数据,可以每行的主键为数据编号,行的内容为数据主体;对于excel表格的数据编号和主体也同样容易约定。操作指令OP是与任务机约定好的字符串,比如SUM代表行内数据求和,AVG代表行内数据求平均值,START、STOP、DELETE代表依据该数据主体内容对某个实体对象进行启动、停止、删除等,实体对象可以是创建某个进程、停止某个进程等等。操作指令OP的具体内容并没有限制,只要任务机能够理解该指令,并知道如何对数据主体进行操作就行。因此只要符合上述三个特征的数据都可以作为本发明的数据来源。这里约定具有相同编号ID的数据不能同时被任务机处理,必须等前一个数据处理完成后,才能处理下一个该编号数据。不同编号ID的数据可以同时被不同任务机同时处理。因此对于数据源而言,如果有先后顺序要求,必须采用相同的ID编号,而没有先后顺序要求,则采用不同的ID编号。
数据编码器通过Socket或者进程间通信接收来自数据源的数据,采用ID-base64(body)-OP结构对数据进行编码。数据主体Body可以为任意类型,采用base64格式可以保证传递过程不需要考虑主体内容。编码完成后把结果内容发送给数据队列管理器模块。
数据队列管理器模块:启动时创建一个空的先进先出队列。采用一个线程或者进程接收编码后的数据,并保存到队列的尾部;采用另外一个线程或者进程分发数据,分发算法如下:
a)如果数据队列为空,则处于等待状态;
b)如果队列中有数据,取出队列中头一个数据,根据编码结构获得该数据编号ID,并判断该数据编号ID是否加锁;
c)如果没有加锁,则对该编号ID进行加锁,并保存该编号锁,然后把该数据发送出去,等待第一个有空闲的任务机接收数据;
d)如果已经编号ID加锁,则把该数据发送到等待队列管理器;
e)该数据分发完成后,转到步骤a)进行循环
f)模块内部保存着所有加锁编号ID的列表,并提供一个解锁的接口,该接口需要有一个数据编号ID作为输入参数。调用接口后,对数据编号ID进行解锁。
5.等待队列管理器模块:把无法被任务机立即接收处理的数据,保存到一个等待队列中,其管理算法如下:
a)等待队列管理器启动时,创建一个空的数据队列,该队列不是先进先出队列模式,可以在任意位置插入或者取出数据;
b)启动一个线程或者进程等待接收数据。从数据队列管理接收到数据后,保存到队列的尾部;
c)提供一个取出数据的接口,该接口需要有一个数据编号ID作为输入参数。调用接口后,从队列中取出第一条编号ID等于输入编号ID的数据项,如果没有找到输入编号ID的数据项,则返回空。
6.任务机模块:对收到的数据,按照指令的要求进行处理。任务机可以有多个,每个任务机的处理流程如下:
a)任务机启动时向数据队列管理器注册,表明可以接收数据,任务机此时处于空闲状态;
b)多个任务机的第一次空闲状态是由注册时的先后顺序决定的;
c)从数据队列管理模块中,收取一条发送过来的数据;
d)解析该数据获得当前数据编号ID,数据主体Body和操作指令OP;
e)根据操作指令OP对数据主体Body进行操作。具体操作指令OP执行的操作方法本发明不限。比如数据主体为一个文件路径名,如果操作指令OP为START,那么任务机可以执行该文件。如果操作指令OP为STOP,那么任务机可以终止该文件运行。如果操作指令OP为DELETE,那么任务机可以删除该文件。但是一般情况对于同一数据主体,不应该并发执行START\STOP\DELETE等操作,必须等前一个操作完成后,才能执行下一个操作;
f)该数据处理完成后,从等待队列管理器中取出下一个编号等于当前ID的数据项。这里并不是从等待队列头部取出数据项,因为下一个数据项的编号ID可能是其它编号,表明该数据项有其它任务机在操作这个编号,那么这个数据项是需要继续等待的。所以这里需要找到的是第一个与当前编号ID相同的数据项。这个数据项的之前操作任务已经完成,可以进行下一个操作指令。
g)如果步骤f)获得的数据项为空,通知数据队列管理模块对该数据编号ID进行解锁。解锁完成后,任务机处于空闲状态,然后转到步骤c)继续收取下一条数据。
h)如果步骤f)获得的数据项不为空,然后转到步骤d)由本任务机处理该数据项。
因此,本发明能够满足对数据处理的多样性要求。
以上对本发明的实施例进行了详细说明,但所述内容仅为本发明的较佳实施例,不能被认为用于限定本发明的实施范围。凡依本发明范围所作的均等变化与改进等,均应仍归属于本专利涵盖范围之内。