专利名称:一种基于文件系统的消息中间件持久消息的存储方法
技术领域:
本发明涉及一种基于文件系统的消息中间件持久消息的存储方法。
背景技术:
以可靠传输为目的的消息中间件服务器,存储客户端发送给服务器端的消息是一 个非常关键的环节。对消息的存储一般需要达到以下要求 1)可靠性,能够将客户端发给服务器端的每条消息做持久化,能根据消息标识符 定位到消息的准确存储位置。 2)性能,能够快速将消息在非易失性存储器和内存之间进行置换。
目前实现消息存储最常用的两种方式
1.内存存储 将所有客户端发送给服务器端的消息保存在内存之中,由于所有消息均在内存中 操作,采用这个方式的消息中间件吞吐性能非常高。但是该种方式存在以下问题
如果服务器宕机,所有保存在内存之中的消息都将丢失,再次重启之后,这些消息 无法被消费; 消息在内存中存储有容量限制,如果超出了可用的内存上限,将阻塞客户端的发
送进程,直到这些消息被接收者取得而被服务器释放其所占用的内存。 2.数据库存储 将所有客户端发送给服务器端的消息保存在数据库之中,即使服务器宕机,重启 之后消息中间件依然可以从数据库中恢复所有未被客户端接收的消息。但是该种方式存在 以下问题 在高负载的情况下,往数据库中频繁插入和删除消息记录的数据库操作会导致整 个消息中间件消息吞吐性能严重降低。 绑定额外的数据库系统会降低服务器的处理性能和网络性能,还会增加用户的投 资 综合以上两种方式,基于文件系统的消息中间件持久消息的存储技术需要解决可 靠性问题,性能问题等。
发明内容
本发明的目的就是针对上述的不足,提供了一种在保证消息存储的可靠性的同 时,还提高了持久消息的读写性能的基于文件系统的消息中间件持久消息的存储方法。
—种基于文件系统的消息中间件持久消息的存储方法,包括如下步骤
第一步以消息为参数创建AddMessageCommand。 即在AddMessageCommand的message字段设为需要存储的消息;在 RemoveMessageCommand中的messageld设为需要从存储中删除的消息标识符。Visitor则 提供了以访问者模式处理所有Command对象的方法,Visitor的子类IndexVisitor会根据不同的Command子类建立索引。第二步把AddMessageCommand对象序列化为字节流。 Command类提供了 write和read序列化和反序列化的方法,write方法可以将 Command对象序列化成字节流,read方法可以将字节流反序列化成Command对象。通过 这样的方式,就可以将Command对象存储在日志文件中,也可以从日志文件读取内容生成 Command对象。 第三步将字节流写入日志文件,如果设置为异步模式,则将多个写入操作合并, 将每个写入操作需写入的字节流合并, 一次性写入到日志文件中。 第四步更新内存中的索引页,将消息标识符和消息对应于日志文件中的位置插 入到索引树中的节点。 索引信息存放在一个B+树的叶节点中,key对应于消息的标识符,value对应该消 息在日志文件中的位置。每次在日志文件中添加一条消息记录,都会更新B+树更新索引信 息。 每一个B+树节点都存放在索引文件中,每个节点占用的磁盘容量为4096个字节, 在第一页中存放了整个索引的元数据,可以通过这个元数据找到所有队列的消息索引。由 于内存容量的限制,并非将所有索引信息都存放在内存之中,而是通过设置索引页缓存保 存最近使用的索引页。 第五步写回索引文件,将更新的索引树节点所对应的文件页以双写的方式写回 到索引文件。 每次更新索引文件都将需要更新的文件页全部顺序写入备份文件,当写入备份文 件成功之后,再将这些文件页写回到索引文件,通过这样的方式来避免写回索引文件时宕 机引起的索引文件不一致的问题。当写入备份文件不成功时,就直接丢弃这些需要更新的 索引页,当写回索引页不成功时,则从备份文件恢复这些索引页。
然后设置一读取流程,具体来说为 第一步查找消息在日志文件中的位置,通过消息标识符在索引树上查找其对应 的日志文件位置信息。 第二步反序列化,读取日志文件,将读到的字节流反序列化成 AddMessageCommand对象。 第三步读取消息,从AddMessageCommand对象中取出消息。 本发明提供的基于文件系统的消息中间件持久消息的存储方法,具有如下优点 1.可以做持久存储,即使宕机,也能保证在重启之后恢复所有的消息,将消息中间
件运行状态恢复到宕机之前的运行状态。 2.可以根据消息标识符快速检索到消息,提高消息中间件消息的吞吐量。
图1为本发明实施例中项向储子系统存储消息的流程图;
图2为本发明实施例中从存储子系统读取消息的流程图。
具体实施例方式
下面以非限定性的实施方式来具体解释、说明本技术方案。 —种基于文件系统的消息中间件持久消息的存储方法,包括一存储步骤和一读取 步骤。 存储步骤如图1所示,具体为 第 一 步以消息为参数创建AddMessageCommand,艮卩在AddMessageCommand的 message字段设为需要存储的消息;在RemoveMessageCommand中的messageld设为需要从 存储中删除的消息标识符;第二步把AddMessageCommand对象序列化为字节流; 第三步将字节流写入日志文件,如果设置为异步模式,则将多个写入操作合并, 将每个写入操作需写入的字节流合并,一次性写入到日志文件中; 第四步更新内存中的索引页,将消息标识符和消息对应于日志文件中的位置插 入到索引树中的节点; 第五步写回索引文件,将更新的索引树节点所对应的文件页以双写的方式写回 到索引文件。
而读取步骤如图2所示,具体来说为 第一步查找消息在日志文件中的位置,通过消息标识符在索引树上查找其对应 的日志文件位置信息。 第二步反序列化,读取日志文件,将读到的字节流反序列化成 AddMessageCommand对象。 第三步读取消息,从AddMessageCommand对象中取出消息。
权利要求
一种基于文件系统的消息中间件持久消息的存储方法,其特征在于包括如下步骤第一步以消息为参数创建AddMessageCommand,即在AddMessageCommand的message字段设为需要存储的消息;在RemoveMessageCommand中的messageId设为需要从存储中删除的消息标识符;第二步把AddMessageCommand对象序列化为字节流;第三步将字节流写入日志文件,如果设置为异步模式,则将多个写入操作合并,将每个写入操作需写入的字节流合并,一次性写入到日志文件中;第四步更新内存中的索引页,将消息标识符和消息对应于日志文件中的位置插入到索引树中的节点;第五步写回索引文件,将更新的索引树节点所对应的文件页以双写的方式写回到索引文件。
全文摘要
本发明是一种基于文件系统的消息中间件持久消息的存储方法,包括如下步骤第一步以消息为参数创建AddMessageCommand;第二步把AddMessageCommand对象序列化为字节流;第三步将字节流写入日志文件,如果设置为异步模式,则将多个写入操作合并,将每个写入操作需写入的字节流合并,一次性写入到日志文件中;第四步更新内存中的索引页,将消息标识符和消息对应于日志文件中的位置插入到索引树中的节点;第五步写回索引文件。本发明提供了一种在保证消息存储的可靠性的同时,还提高了持久消息的读写性能的基于文件系统的消息中间件持久消息的存储方法。
文档编号H04L29/08GK101707633SQ20091023096
公开日2010年5月12日 申请日期2009年11月27日 优先权日2009年11月27日
发明者李景泽, 谢钟扬 申请人:山东中创软件商用中间件股份有限公司