基于发布订阅系统的文件存储方法

文档序号:7663089阅读:184来源:国知局

专利名称::基于发布订阅系统的文件存储方法
技术领域
:本发明涉及文件存储方法,主要是一种基于发布订阅系统的文件存储方法。
背景技术
:现如今,越来越多的企业、单位面临着各种各样的数据集成和系统整合,CORBA、DCOM、RMI等RPC中间件技术也应运而生,但由于采用RPC同步处理技术,在性能、健壮性、可扩展性上都存在着诸多缺点。而基于消息的异步处理模型采用非阻塞的调用特性,发送者将消息发送给消息服务器,消息服务器在合适的时候再将消息转发给接收者;发送和接收是异步的,发送者无需等待,二者的生命周期也可以不必相同,而且发送者可以将消息间接传给多个接收者,大大提高了程序的性能、可扩展性及健壮性,这使得异步处理模型在分布式应用上比起同步处理模型更具有吸引力。其中发布/订阅(publish/subscribe,简称pub/sub)系统便是一种基于分布式计算平台的消息传递系统,也可以称中间件系统,用于为分布式系统中的各参与者之间提供一种松耦合的通信方式。在pub/sub系统中,有消息的生产者(发布者)和消息的消费者(订阅者),发布者通过中间代理把消息发给对该消息感兴趣的订阅者,而订阅者不一定都在线,此时就要把消息存储起来,等下次订阅者上线时,再把消息发送。消息持久化就是提供存储消息的功能,它保证了系统的可靠性。使得不管是服务器当机还是客户端连接失败,发送到服务器端的持久化消息都能被正确处理。然而,由于数据文件可能非常大,那怎样用尽可能少的时间进行数据的存储、读取、删除等操作变得至关重要。这些性能跟采用什么样的数据存储方式有关,这里提出的是文件存储的方式,它通过把持久化消息存储到文件中,而达到消息的存储、删除、提取的高性能表现。目前消息存储机制主要有数据库存储,也就是通过把持久化消息存储到特定的数据库中,但是由于创建数据库连接的开销非常大,从而影响了消息的存储,删除等的性能。
发明内容本发明要解决现有pub/sub系统中消息持久化存在的缺陷,提供一种对消息的高性能的存储、删除和提取的基于发布/订阅系统的文件存储方法,是一种发布订阅系统中对消息进行持久化时采用的方法。本发明解决其技术问题所采用的技术方案这种基于发布订阅系统的文件存储方法,在pub/sub系统中,为每个消息目的地都创建一个消息容器表,且每个目的地的消息容器表都将存在一个表结构中。同时每个目的地的消息容器表就是缓存消息的接口,可以通过消息容器表提供的存储、删除、修改等方法来对消息进行相应的动作。这使得操作文件像操作一个内存中的表一样方便轻松。消息容器表的具体方法的实现如下消息容器表中存放的是特定目的地的消息总和,每个消息以(messageld,message)形式的(关键字,值)对来存储。在存储消息对的同时,为每个消息建立一个索引,索引记录了每个消息的关键字和值两个数据所在的文件以及在文件的起始位置。每个索引的结构大小都一样,所有索引都以链表的形式存放在索引文件中。并且,每个消息和它对应的索引关系以(messageld,Indexltem)形式的(关键字,值)对存放在一个消息索引表中。具体的消息以数据文件的格式存储在文件中,文件的大小可手动配置,但在文件大小配置好的情况下,存放在文件中的消息大小不可超过配置好的每个文件的大小。具体步骤如下系统启动好后,自动为每个目的地建立一个消息容器表,且每个目的地只有一个消息容器表,该目的地中的所有消息都以关键字/值对的形式保存在这个消息容器表中,其中关键字对应于目的地中的一个消息的messageld(messageld在消息的发送过来的包中已经定义),值则对应该消息对象的内容。1.当一个可持续订阅的消息到达服务器端从消息中得到它将要发往的目的地名称,根据该目的地名称,找到对应的消息容器表,若不存在这样的消息容器表,则创建一个新的消息容器表。接着,从到达的消息中找到对应的messageld以及它的值,通过消息容器表提供的存储消息的方法将消息保存到文件中。2.若要从文件中取出一个持久化消息,贝lj:同上找到该消息对应的消息容器表,并根据消息容器表提供的取消息的方法去文件中读取一条消息即可。3.若要从文件中删除一个持久化消息,贝lj:同上找到该消息对应的消息容器表,根据消息容器表的删除消息的方法,在文件中找到该消息,并删除即可。本发明有益的效果是实现了一个具有文件存储功能的消息容器表,同时可以像操作普通表结构一样来操作该消息容器表,即通过put〇,get〇,remove()等方法进行,在进行持久化消息存储的同时不需要知道底层的细节。同时本发明的另一个优点是它的存储速度比数据库快很多,因为它不需要进行数据库的连接。图l为关键过程流程图。具体实施例方式下面结合附图和实施例对本发明作进一步介绍为使本发明的目的,技术方案和优点更加清楚,下面将本发明用于以java为开发语言的pub/sub系统中,并将结合附图作进一步的详细阐述。在java语言环境下,本发明相当于实现了一个具有文件存储功能的Map,该Map存储的数据不会随着服务器的关闭或崩溃而消失,下次服务器重新启动的时候依旧可以使用Map里的数据。同时,实现M邻的所有接口,供其它类方便调用。每个目的地对应一个M邻Container(消息容器表),每个目的地当中的消息的Messageld是唯一的,所以以Messageld作为key存放在MapContainer当中。先介绍一些主要原理1)类MapContainer实现了map接口(Map提供了一个通用的元素存储方法。Map集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值),且与常用的map的区别是常用的map把对象存在内存里面,而本发明却把对象存到磁盘上。使用方法和通常的腿p—样,MapContainer.put(key,object)(将指定值与指定键相关联,并存到map里面)/MapContainer.get(key)(返回与指定键关联的值);2)每个目的地对应一个MapContainer,为每个目的地创建一个MapContainer,存储该目的地的消息。所有的MapContainer放到一个map中。过程为收到消息-〉获得该消息的目的地-〉找至树应MapContainer->MapContainer.put(messageld,message);3)由于消息量可能会非常大,所以数据文件可能非常的大,必须快速定位消息数据在该文件当中的位置,然后正确读取消息数据。本发明因此采用索引,即为每一个消息创建一个索弓l,由于是用M印存取的,所以索引记录了key和value两个数据在文件的起始位置。所有的索引用一个list链接起来,每个索引的大小都是一样的。还采用了文件读写,因为消息的存取需要在文件当中随机的读取与写入,在JDK中提供了RandomAccessFile这个类,支持文件的随机读写,但是该类的1/0操作效率较低,每读/写一个字节就需对磁盘进行一次I/O操作。通过RandomAccessFile类加上缓冲读写机制提高数据读写的速度。同时每个数据都有一个数据头。数据头包含一个常量和数据长度,读数据时只有当读出的常量是正确的,才认为该数据是正确的。下面介绍消息存储的一些结构和实现:采用索引机制,Indexltem的结构<table>complextableseeoriginaldocumentpage7</column></row><table>Dataltem(存储在文件上的数据格式)的结构<table>complextableseeoriginaldocumentpage4</column></row><table>下面介绍本发明的基于文件存储的数据存储过程(基于图一):每个目的地对应一个MapContainer,根据目的地中的messageld和message值建立对应的MapContai匿,所有的MapContainer存放在一个map中。存数据调用MapContainer.put(messageld,message)1.创建一个空的Indexltem(索引项)2.通过findSpaceForData()函数査找到空闲的文件区域3.把keyData即messageld写入文件,并创建一个dataltem,在dataltem,存放messageld所在的文件以及在该文件的偏移量4.根据dataltem设置Indexltem的值,即keyFile和keyOffset5.通过findSpaceForData〇函数査找到空闲的文件区域6.把valueData即message消息体写入文件,并创建一个dataltem,存放message所在的文件以及在该文件的偏移量7.根据dataltem设置Indexltem的值,即valueFile和valueOffset8.把Indexltem放入一个list,并存入index文件9.把indexItem、keyDate放入两张Map,一张以indexltem作为key,另一张以keyData作为key取数据调用M即Container.get(messageld)1.从消息索引表(存放(messageld,Indexltem)形式的(key,value)对的表结构)中根据keyData得到Indexltem(索引项)2.在特定的Indexltem中,得到存放在其中的message所在的文件以及在文件的偏移量,也即得到Dataltem3.由DataManager根据Dataltem得到存在文件上的具体的消息数据删除数据调用MapContainer.remove(messageld)1.从消息索引表(存放(messageld,Indexltem)形式的(key,value)对的表结构)中根据keyData得到Indexltem(索引项)2.从两张消息索引表(存放(messageld,Indexltem)形式的(key,value)对和存放(Indexltem,messageld)形式的(key,value)对的表结构)中删除掉对应indexltem、keyData项3.根据Indexltem得到存放在其中的message所在的文件以及在文件的偏移量,也就得到了Dataltem(和前面一样)4.由DataManager根据Dataltem删除存在文件上的具体的消息数据5.从list链表中删除掉Indexltem项6.把Indexltem重置,active=false7.updata该Indexltem至ljindex文件中上述实施例用来解释说明本发明,而不是对本发明进行限制,在本发明的精神和权利要求的保护范围内,对本发明作出的任何修改和改变,都落入本发明的保护范围。权利要求1、一种基于发布订阅系统的文件存储方法,其特征在于在pub/sub系统中,为每个消息目的地都创建一个消息容器表,且每个目的地的消息容器表都将存在一个表结构中,同时每个目的地的消息容器表就是缓存消息的接口,可以通过消息容器表提供的存储、删除、修改方法来对消息进行相应的动作。2、根据权利要求1所述的基于发布订阅系统的文件存储方法,其特征在于消息容器表的具体方法如下消息容器表中存放的是设定目的地的消息总和,每个消息以messageld,message形式的关键字,值对来存储,在存储消息对的同时,为每个消息建立一个索引,索引记录了每个消息的关键字和值两个数据所在的文件以及在文件的起始位置,每个索引的结构大小都一样,所有索引都以链表的形式存放在索引文件中;并且,每个消息和它对应的索引关系以messageld,Indexltem形式的关键字,值对存放在一个消息索引表中,具体的消息以数据文件的格式存储在文件中,文件的大小可手动配置,但在文件大小配置好的情况下,存放在文件中的消息大小不可超过配置好的每个文件的大小。3、根据权利要求1或2所述的基于发布订阅系统的文件存储方法,其特征在于系统启动好后,为每个目的地建立一个消息容器表,且每个目的地只有一个消息容器表,该目的地中的所有消息都以关键字/值对的形式保存在这个消息容器表中,其中关键字对应于目的地中的一个消息的messageld,raessageld在消息的发送过来的包中已经定义,值则对应该消息对象的内容;(1).当一个可持续订阅的消息到达服务器端-从消息中得到它将要发往的目的地名称,根据该目的地名称,找到对应的消息容器表,若不存在这样的消息容器表,则创建一个新的消息容器表;接着,从到达的消息中找到对应的messageld以及它的值,通过消息容器表提供的存储消息的方法将消息保存到文件中;(2).若要从文件中取出一个持久化消息,贝'J:同上找到该消息对应的消息容器表,并根据消息容器表提供的取消息的方法去文件中读取一条消息即可;(3).若要从文件中删除一个持久化消息,贝IJ-同上找到该消息对应的消息容器表,根据消息容器表的删除消息的方法,在文件中找到该消息,并删除即可。全文摘要本发明涉及一种基于发布订阅系统的文件存储方法,其特征在于在pub/sub系统中,为每个消息目的地都创建一个消息容器表,且每个目的地的消息容器表都将存在一个表结构中,同时每个目的地的消息容器表就是缓存消息的接口,可以通过消息容器表提供的存储、删除、修改方法来对消息进行相应的动作。本发明有益的效果是实现了一个具有文件存储功能的消息容器表,同时可以像操作普通表结构一样来操作该消息容器表,即通过put(),get(),remove()等方法进行,在进行持久化消息存储的同时不需要知道底层的细节。同时本发明的另一个优点是它的存储速度比数据库快很多,因为它不需要进行数据库的连接。文档编号H04L29/08GK101197844SQ20071016475公开日2008年6月11日申请日期2007年12月12日优先权日2007年12月12日发明者丁夏珍,健吴,吴朝晖,尹建伟,施东材,莹李,邓水光申请人:浙江大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1