实现持久化数据队列的方法

文档序号:7698852阅读:118来源:国知局
专利名称:实现持久化数据队列的方法
技术领域
本发明涉及持久化数据队列的方法,尤其是指一种在通信系统消息传递中采用》兹盘文件实现持久化数据队列的方法。
背景技术
在通信系统中,有大量需要传递的消息,而这些净皮传递的信息有些是需要持久的保存下来,消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是同时在线或者消息中心在发送者发送消息后关^L 了 ,在消息中心重新启动后仍然可以将消息发送出去。目前持久化消息队列大多采用数据库持久化消息,也就是将^l保存的消息队列存储在数据库或文件中,而这种消息持久性的原理很简单,就是在发送者将消息发送出去后,消息中心首先将消息存储到本地数据文件、内存数据库或者远程数据库等,然后试图将消息发送给接收者,发送成功则将消息从存储中删除,失败则继续尝试。消息中心启动以后首先要检查制定的存储位置,如果有未发送成功的消息,则需要把消息发送出去。
对数据库持久化来说,需要搭建数据库,而搭建的数据库本身是需要开销的,对于一个轻量级的应用,要专门为消息持久化^^建数据库,付出的开销太大,另外,数据库存储数据本身是不具备先进先出特点的,因此在操作时会导致效率较低。因此采用现有的持久化消息队列的方式,尽管功能比较完善,但是对待大量的消息数据而言,需要的开销4艮大,并且效率很低,在处理速度要求较高的应用中则会很难满足该应用的需求。

发明内容
本发明目的在于提出实现持久化数据队列的方法,尤其是指一种采用轻量级的、基于磁盘文件的、先进先出、端到端的数据队列来实现的方法。
本发明所述的方法可用于通信系统的消息传递,也可直接用于需要持久化消息的数据转发以及流量控制中。
本发明的方法在于提供一种实现持久化数据队列的方法,包括以下步骤 获得控制文件信息;根据所述控制文件信息载入数据队列;通过控制模块管 理》兹盘路径中的文件。
优选地,获得控制文件信息步骤包括
判断指定的磁盘路径中是否设有控制文件的步骤
若指定的磁盘路径内有所述控制文件,直接读取所述控制文件后并 载入所述数据队列;
若指定的磁盘路径内没有控制文件时,按照设定的格式创建所述控 制文件信息,并载入所述数据队列。
优选地,才艮据所述控制文件载入数据队列是,才艮据所述控制文件信息中 描述的队列头尾信息,载入数据队列。
优选地,通过所述控制模块管理所述的》兹盘路径中的文件具体为 所述控制文件通过所述控制才莫块读取或修改或删除所述;兹盘中的数据文 件;以及
所述控制文件通过所述控制模块将数据文件写入所述磁盘中; 其中所述的控制才莫块包括GetData、 PutData、 IsFull、 IsEmpty、 GetCount 的方法。
优选地,所述控制文件将名夂持久化的数据写入^兹盘包括以下步骤 采用IsFull方式判断数据文件是否为满来确定该数据的写入位置。
优选地,采用IsFull方式时采用GetData用来/人队列头获取数据, PutData用来将数据写入队列尾。
优选地,在采用IsEmpty的方式来提供队列是否空状态,GetCount用来 获取队列当前的数据单元数。
5优选地,所述数据队列的读写操作首先在内存中进行,在PutData操作 时将新添加的数据写入所述磁盘。
优选地,所述的数据队列为了先进先出队列。
优选地,还包括,在获得控制文件的步骤前,判断所述指定磁盘路径中 是否已经具有符合设定要求的控制文件,如果没有,则在所述数据队列中进 行判断;如果有,则采用该控制文件直接载入所述数据队列。
本发明是采用文件对数据队列进行持久化,本发明的方案中在进行数据 持久化的过程中,所基于的磁盘文件分为两种类型控制文件和数据文件, 所述控制文件用来对队列的头尾进行控制,数据文件用来保存数据单元。
本发明所述的方法是一个基于磁盘文件的轻量级的持久化数据队列实 现方法,与现有技术相比没有过多的管理功能,仅仅实现一个先进先出的点 对点的持久化队列,并不需要额外的设备和软件的支持,可直接应用于需要 持久化先进先出队列的应用中,本发明的结构和算法简单,占用资源小,速 度快,可以被直接嵌入各种应用中,传输不同类型的数据,在进程内的队列 应用中,采用该轻量级的解决方案,较现有技术开销小,运行速度快,效率 高。


图l是本发明所述的控制文件的数据结构说明;
图2是本发明所述的数据文件的数据结构说明;
图3是本发明所述的文件描述区结构说明;
图4是本发明所述的数据单元描述区结构说明;
图5是本发明所述的数据单元存储区结构说明;
图6是本发明的方法中由队列头获取it据的流程图7是本发明的方法中将数据写入队列尾的流程图8是本发明的方法中确定数据队列是否为空队列的流程图9是本发明的方法中确定数据队列是否为满队列的流程图10是本发明的方法中获取队列当前数据单元数的流程6图11是本发明的方法流程图。
具体实施例方式
本发明提出一种实现持久化数据队列的方法,参考图ll所示,包括以下
步骤首先,获得控制文件信息;然后根据控制文件信息载入数据队列;所 述控制文件管理所述的^兹盘路径中的数据文件。其中所述的数据队列可由控 制文件和数据文件组成,控制文件和数据文件保存在同一i兹盘路径下,也就 是说, 一个数据队列影射到一个指定的磁盘路径。
在本发明的方案中,获得控制文件信息是通过判断指定路径下是否设有 控制文件的步骤获得,即若在所述指定路径内有所述控制文件,直接读取控 制文件中的信息;若所述指定路径内没有控制文件时,则按照设定的格式创 建控制信息,并将控制信息写入新创建的控制文件中。获得控制文件信息后, 才艮据控制文件中描述的队列头尾信息,载入凝:据队列。在所述数据队列载入 成功后,即可采用后面所述的方法对数据队列进行读写操作,在实际的一般 应用中都有一个或多个接收消息线程和一个或多个发送消息线程,接收线程 将接收到的消息写入队列,发送线程从队列中读取消息。队列消息传输顺序 为先进先出。
本发明的实施例中所述的控制文件通过控制^t块最多可管理65, 536个数 据文件,其中由所述管理的数据文件中,每个数据文件可以存放的数据单元 最多为10, 000个,队列容量为10,000X65,536=655,360,000个。参考图1 至图5,说明了本发明的方案中可参考的控制文件以及数据文件的数据结构, 所述控制文件长度为8个字节(参考图1),该控制文件可分为2个域队列 头信息域和队列尾信息域,其中每个域有2个字段文件号和文件中的数据 单元号,长度分别为2字节,类型为无符号整型数。所述的队列头信息域通 过文件号和数据单元号描述了队列头的数据单元处于第几个文件中的第几个 数据单元,通过队列头信息,可直接访问到文件中队列头数据单元的描述信 息,再通过该描述信息可直接访问到具体数据,具体过程可以参看本实施例 中从数据队列中读数据的说明。所述队列头信息域通过文件号和数据单元号 描述了队列头的数据单元处于第几个文件中的第几个^t据单元,通过队列头 信息,可直接访问到文件中队列头数据单元的描述信息,再通过该描述信息可直接访问到具体数据。
本实施例中所述的it据文件共分3个域文件描述区、数据单元描述区、 数据单元存储取(参见图2)。其中所述文件描述区用来描述本数据文件的基 本信息,数据单元描述区用来描述本数据文件中每个数据单元的基本信息, 数据单元存储区用来存储数据。文件描述区和数据单元描述区为定长域,这 样可通过计算偏移量直接定位到数据单元存储区的每个数据单元的具体位 置,实现文件数据单元的快速访问。所述数据文件描述区长度为12字节,由 文件标识符、文件时间戳、文件中数据单元的数量共3个字段组成,如图3 所示。其中文件标识符用来表示本文件是特定的数据队列数据文件,取值为 0x00003c8e,文件时间戳表示本凄t据文件生成的时间,取系统utc时间,文 件数据单元数量描述了本数据文件存放的数据单元个数。数据单元描述区长
度为10*10, 000=100, 000字节,由10,000个数据单元描述符组成,每个数据 单元描述符长度为10字节,如图4所示。每个数据单元描述符由数据单元偏 移量、数据单元长度、数据单元属性共3个字段组成。数据单元偏移量长度 为4字节,类型为无符号整型,描述了本数据单元在数据文件中所处的绝对 偏移位置, 一个有效的tt据单元的偏移量应大于100,012,通过数据单元偏移 量可直接将文件指针定位到数据单元在文件中的存储位置,实现数据单元的 快速访问。数据单元长度为4字节,类型为无符号整型,描述了数据单元在 文件中占用存储空间大小,通过数据单元界定了数据单元操作的范围,实现 数据的异步存储和访问,达到节省空间的效果。数据单元属性长度为2字节, 类型为无符号整型,其值由使用数据队列的应用自定义, 一个典型的应用是 将数据单元属性用来表示数据单元类型,实现在数据队列中存储多种类型的 数据的目的。
本实施例中的数据队列采用现有的5个队列应用的7>有方法GetData、 PutData、 IsFull、 IsEmpty、 GetCount组成本发明持久化实现的方案中的控 制模块,所述控制文件通过这些方法构成的控制才莫块对数据文件进行管理, 其中GetData用来从队列头获取数据(参考图6), PutData用来将数据写入 队列尾(参考图7), IsFull提供队列是否满状态(参考图9), IsEmpty提供 队列是否空状态(参考图8 ), GetCount用来获取队列当前的数据单元数(参 考图10)。数据的读写操作首先在内存中进行,然后如果是PutData操作则将新添加的数据单元写入;兹盘。
将欲持久化的数据写入磁盘文件的过程参见以下步骤
1、 获取控制文件信息,该控制文件信息的获得可以参考前面所述的内容, 在此不再赘述;
2、 由于控制文件控制凝:据队列中的凝:据,由所述控制文件采用IsFull 方法判断队列是否为满,如果为满则不能向数据文件中写入数据,直接返回 写入失败,如果队列不满则执行写入数据操作。写入数据操作逻辑如下根 据控制文件中的队列尾信息判断尾数据文件是否写满,判断规则为尾数据 单元号如果小于9999,则尾数据文件未满,反之则尾数据文件已经写满。如 果尾数据文件未满,则将尾数据单元号+1,如果尾数据文件已经写满,则切 换到下一个数据文件,切换规则为新的尾数据文件号=(当前尾信息中的文 件号+1)%65536,新的尾数据单元号=0。根据前述逻辑得到的要写入的尾数 据文件号打开相应数据文件,如果该数据文件不存在则创建该文件,将文件 操作指针定位到EOF,写入数据到文件中。如果写入操作成功,则将文件操作 指针定位到数据文件中的数据单元描述符,定位方法为根据队列尾信息中 的数据单元号计算偏移量,计算公式为12+(数据单元号*10),然后将文件 操作指针定位到前面计算得到的偏移量,定位完成后,按照数据单元描述符 的结构(图4)写入10字节的凝:据单元描述符,如果前面的搮:作都成功,则 将新的尾信息写入控制文件中。
在本实施例中,采用IsE卿ty算法用来判断数据队列是否为空,该算法 由控制文件中的队列头信息和队列尾信息计算得到,具体公式为如果队列 头文件号等于队列尾文件号同时队列头数居单元昊等于队列尾数据单元号则 队列为空,反之则队列非空。本实施例中可采用IsFull算法用来判断数据队 列是否为满,该算法由控制文件中的队列头信息和队列尾信息计算得到,具体 逻辑为先计算下一个数据文件号,计算公式为(队列尾文件号+1)%65536, 如果下一个数据文件号等于队列头文件号,则数据队列已满,反之则数居队 列不满。
本实施例采用GetCount算法用来计算当前队列中的记录^t,算法为首 先尾文件号-头文件号,得到头尾文件数差,如果该差值小于0则将该差值 +65536作为头尾文件数差,最后计算头尾文件数差*10000+(尾数据单元号-头数据单元号),得到当前队列中的记录数。
以上是描述了由控制文件控制下如果将凄t据写入;兹盘文件的过程。 下面对如何从数据队列中读数据进行详细说明,具体流程如下(参考图
6):调用上述的IsEmpty方法判断队列是否为空,如果为空则数据队列中无 数据可读,直接返回读取失败,如果队列中有数据则根据控制文件中的队列 头信息定位到数据文件中的数据单元描述符,定位方法为首先根据队列头 信息中的文件号找到对应数据文件并打开,再根据队列头信息中的数据单元 号计算偏移量,计算/>式为12+(数据单元号*10),最后将文件操作指针定 位到前面计算得到的偏移量,定位完成后,读取10字节的数据单元描述符, 按照数据单元描述符的结构(图4)解析得到队列头数据单元的文件绝对偏移 量,将文件操作指针定位到该偏移量上,读取数据单元描述符中描述长度的 数据,将队列头指向下一个数据单元,具体算法为将lt据单元号+l,如果 小于10000,则直接更新队列头信息到控制文件中,如果大于等于10000,则 表明下一个数据单元在下一个数据文件中,将队列头文件号+1,设置队列头 数据单元号为O,删除上一个数据文件,返回成功。
在本发明的方案中,所述控制文件还操作写入i兹盘的数据队列对数据修 改或删除,其具体过程在此不再进行赘述。
在本实施例中,所述的控制文件是必须的,在创建翁:据队列时产生,再 操作数据队列时修改;数据文件不是必须的,在操作数据队列时动态生成、 修改和删除。
综上所述,本发明方法以及方法中采用的算法简单,可以被直接嵌入各 种应用中,在进程内的队列应用中,采用该轻量级的解决方案,较现有技术 开销小,运行速度快,效率高。
虽然以上结合优选实施例对本发明进行了描述,但本领域的技术人员应 该理解,本发明所述的方法并不限于具体实施方式
中所述的实施例,在不背 离由所附权利要求书限定的本发明精神和范围的情况下,可对本发明作出各 种修改、增加、以及替换。
权利要求
1. 一种实现持久化数据队列的方法,包括以下步骤获得控制文件信息;根据所述控制文件信息载入数据队列;通过控制模块管理磁盘路径中的文件。
2. 才艮据权利要求1所述的实现持久化数据队列的方法,其特征在于,获 得控制文件信息步骤包括判断指定的磁盘路径中是否设有控制文件的步骤若指定的磁盘路径内有所述控制文件,直接读取所述控制文件后并 载入所述数据队列;若指定的》兹盘路径内没有控制文件时,按照设定的格式创建所述控 制文件信息,并载入所述数据队列。
3. 根据权利要求l所述的实现持久化数据队列的方法,其特征在于, 根据所述控制文件载入数据队列是,根据所述控制文件信息中描述的队列头尾信息,载入数据队列。
4. 根据权利要求2所述的实现持久化数据队列的方法,其特征在于,通 过所述控制模块管理所述的》兹盘路径中的文件具体为所述控制文件通过所述控制模块读取或修改或删除所述磁盘中的数据文 件;以及所述控制文件通过所述控制模块将数据文件写入所述i兹盘中; 其中所述的控制模块包括GetData、 PutData、 IsFull、 IsEmpty、 GetCount 的方法。
5. 根据权利要求4所述的实现持久化数据队列的方法,其特征在于, 所述控制文件将欲持久化的数据写入磁盘包括以下步骤采用IsFull方式判断数据文件是否为满来确定该数据的写入位置。
6. 根据权利要求5所述的实现持久化数据队列的方法,其特征在于, 采用IsFull方式时采用GetData用来从队列头获耳又tt据,PutData用来将数据写入队列尾。
7. 根据权利要求5所述的实现持久化数据队列的方法,其特征在于,在 采用IsEmpty的方式来提供队列是否空状态,GetCount用来获取队列当前的 数据单元数。
8. 根据权利要求4所述的实现持久化数据队列的方法,其特征在于,所 述数据队列的读写操作首先在内存中进行,在PutData操作时将新添力口的数 据写入所述》兹盘。
9. 根据权利要求l所述的实现持久化数据队列的方法,其特征在于,所 述的数据队列为了先进先出队列。
10. 根据权利要求2所述的实现持久化数据队列的方法,其特征在于, 还包括,在获得控制文件的步骤前,判断所述指定磁盘路径中是否已经具有 符合设定要求的控制文件,如果没有,则在所述数据队列中进行判断;如果 有,则采用该控制文件直接载入所述数据队列。
全文摘要
本发明提供了一种实现持久化数据队列的方法,包括以下步骤获得控制文件信息;根据所述控制文件信息载入数据队列;通过控制模块管理磁盘路径中的文件。本发明是采用轻量级的、基于磁盘文件的、先进先出、端到端的数据队列来实现的方法,可用于通信系统的消息传递,也可直接用于需要持久化消息的数据转发以及流量控制中。
文档编号H04L12/54GK101510838SQ20091007835
公开日2009年8月19日 申请日期2009年2月26日 优先权日2009年2月26日
发明者傅乐民, 伟 彭, 东 曹 申请人:北京北纬点易信息技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1