CN101197844B - 基于发布订阅***的文件存储方法 - Google Patents

基于发布订阅***的文件存储方法 Download PDF

Info

Publication number
CN101197844B
CN101197844B CN200710164756XA CN200710164756A CN101197844B CN 101197844 B CN101197844 B CN 101197844B CN 200710164756X A CN200710164756X A CN 200710164756XA CN 200710164756 A CN200710164756 A CN 200710164756A CN 101197844 B CN101197844 B CN 101197844B
Authority
CN
China
Prior art keywords
message
file
container table
destination
index
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CN200710164756XA
Other languages
English (en)
Other versions
CN101197844A (zh
Inventor
尹建伟
丁夏珍
吴健
邓水光
李莹
施东材
吴朝晖
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Zhejiang University ZJU
Original Assignee
Zhejiang University ZJU
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Zhejiang University ZJU filed Critical Zhejiang University ZJU
Priority to CN200710164756XA priority Critical patent/CN101197844B/zh
Publication of CN101197844A publication Critical patent/CN101197844A/zh
Application granted granted Critical
Publication of CN101197844B publication Critical patent/CN101197844B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明涉及一种基于发布订阅***的文件存储方法,其特征在于:在pub/sub***中,为每个消息目的地都创建一个消息容器表,且每个目的地的消息容器表都将存在一个表结构中,同时每个目的地的消息容器表就是缓存消息的接口,可以通过消息容器表提供的存储、删除、修改方法来对消息进行相应的动作。本发明有益的效果是:实现了一个具有文件存储功能的消息容器表,同时可以像操作普通表结构一样来操作该消息容器表,即通过put(),get(),remove()等方法进行,在进行持久化消息存储的同时不需要知道底层的细节。同时本发明的另一个优点是它的存储速度比数据库快很多,因为它不需要进行数据库的连接。

Description

基于发布订阅***的文件存储方法
技术领域
本发明涉及文件存储方法,主要是一种基于发布订阅***的文件存储方法。
背景技术
现如今,越来越多的企业、单位面临着各种各样的数据集成和***整合,CORBA、DCOM、RMI等RPC中间件技术也应运而生,但由于采用RPC同步处理技术,在性能、健壮性、可扩展性上都存在着诸多缺点。而基于消息的异步处理模型采用非阻塞的调用特性,发送者将消息发送给消息服务器,消息服务器在合适的时候再将消息转发给接收者;发送和接收是异步的,发送者无需等待,二者的生命周期也可以不必相同,而且发送者可以将消息间接传给多个接收者,大大提高了程序的性能、可扩展性及健壮性,这使得异步处理模型在分布式应用上比起同步处理模型更具有吸引力。
其中发布/订阅(publish/subscribe,简称pub/sub)***便是一种基于分布式计算平台的消息传递***,也可以称中间件***,用于为分布式***中的各参与者之间提供一种松耦合的通信方式。在pub/sub***中,有消息的生产者(发布者)和消息的消费者(订阅者),发布者通过中间代理把消息发给对该消息感兴趣的订阅者,而订阅者不一定都在线,此时就要把消息存储起来,等下次订阅者上线时,再把消息发送。消息持久化就是提供存储消息的功能,它保证了***的可靠性。使得不管是服务器当机还是客户端连接失败,发送到服务器端的持久化消息都能被正确处理。然而,由于数据文件可能非常大,那怎样用尽可能少的时间进行数据的存储、读取、删除等操作变得至关重要。这些性能跟采用什么样的数据存储方式有关,这里提出的是文件存储的方式,它通过把持久化消息存储到文件中,而达到消息的存储、删除、提取的高性能表现。
目前消息存储机制主要有数据库存储,也就是通过把持久化消息存储到特定的数据库中,但是由于创建数据库连接的开销非常大,从而影响了消息的存储,删除等的性能。
发明内容
本发明要解决现有pub/sub***中消息持久化存在的缺陷,提供一种对消息的高性能的存储、删除和提取的基于发布/订阅***的文件存储方法,是一种发布订阅***中对消息进行持久化时采用的方法。
本发明解决其技术问题所采用的技术方案:这种基于发布订阅***的文件存储方法,在pub/sub***中,为每个消息目的地都创建一个消息容器表,且每个目的地的消息容器表都将存在一个表结构中。同时每个目的地的消息容器表就是缓存消息的接口,可以通过消息容器表提供的存储、删除、修改等方法来对消息进行相应的动作。这使得操作文件像操作一个内存中的表一样方便轻松。消息容器表的具体方法的实现如下:消息容器表中存放的是特定目的地的消息总和,每个消息以(messageId,message)形式的(关键字,值)对来存储。在存储消息对的同时,为每个消息建立一个索引,索引记录了每个消息的关键字和值两个数据所在的文件以及在文件的起始位置。每个索引的结构大小都一样,所有索引都以链表的形式存放在索引文件中。并且,每个消息和它对应的索引关系以(messageId,IndexItem)形式的(关键字,值)对存放在一个消息索引表中。具体的消息以数据文件的格式存储在文件中,文件的大小可手动配置,但在文件大小配置好的情况下,存放在文件中的消息大小不可超过配置好的每个文件的大小。具体步骤如下:
***启动好后,自动为每个目的地建立一个消息容器表,且每个目的地只有一个消息容器表,该目的地中的所有消息都以关键字/值对的形式保存在这个消息容器表中,其中关键字对应于目的地中的一个消息的messageId(messageId在消息的发送过来的包中已经定义),值则对应该消息对象的内容。
1.当一个可持续订阅的消息到达服务器端:
从消息中得到它将要发往的目的地名称,根据该目的地名称,找到对应的消息容器表,若不存在这样的消息容器表,则创建一个新的消息容器表。接着,从到达的消息中找到对应的messageId以及它的值,通过消息容器表提供的存储消息的方法将消息保存到文件中。
2.若要从文件中取出一个持久化消息,则:
同上找到该消息对应的消息容器表,并根据消息容器表提供的取消息的方法去文件中读取一条消息即可。
3.若要从文件中删除一个持久化消息,则:
同上找到该消息对应的消息容器表,根据消息容器表的删除消息的方法,在文件中找到该消息,并删除即可。
本发明有益的效果是:实现了一个具有文件存储功能的消息容器表,同时可以像操作普通表结构一样来操作该消息容器表,即通过put(),get(),remove()等方法进行,在进行持久化消息存储的同时不需要知道底层的细节。同时本发明的另一个优点是它的存储速度比数据库快很多,因为它不需要进行数据库的连接。
附图说明
图1为关键过程流程图。
具体实施方式
下面结合附图和实施例对本发明作进一步介绍:
为使本发明的目的,技术方案和优点更加清楚,下面将本发明用于以java为开发语言的pub/sub***中,并将结合附图作进一步的详细阐述。
在java语言环境下,本发明相当于实现了一个具有文件存储功能的Map,该Map存储的数据不会随着服务器的关闭或崩溃而消失,下次服务器重新启动的时候依旧可以使用Map里的数据。同时,实现Map的所有接口,供其它类方便调用。每个目的地对应一个MapContainer(消息容器表),每个目的地当中的消息的MessageId是唯一的,所以以MessageId作为key存放在MapContainer当中。先介绍一些主要原理:
1)类MapContainer实现了map接口(Map提供了一个通用的元素存储方法。Map集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值),且与常用的map的区别是:常用的map把对象存在内存里面,而本发明却把对象存到磁盘上。使用方法和通常的map一样,MapContainer.put(key,object)(将指定值与指定键相关联,并存到map里面)/MapContainer.get(key)(返回与指定键关联的值);
2)每个目的地对应一个MapContainer,为每个目的地创建一个MapContainer,存储该目的地的消息。所有的MapContainer放到一个map中。过程为:收到消息->获得该消息的目的地->找到对应MapContainer->MapContainer.put(messageId,message);
3)由于消息量可能会非常大,所以数据文件可能非常的大,必须快速定位消息数据在该文件当中的位置,然后正确读取消息数据。本发明因此采用索引,即为每一个消息创建一个索引,由于是用Map存取的,所以索引记录了key和value两个数据在文件的起始位置。所有的索引用一个list链接起来,每个索引的大小都是一样的。还采用了文件读写,因为消息的存取需要在文件当中随机的读取与写入,在JDK中提供了RandomAccessFile这个类,支持文件的随机读写,但是该类的I/O操作效率较低,每读/写一个字节就需对磁盘进行一次I/O操作。通过RandomAccessFile类加上缓冲读写机制提高数据读写的速度。同时每个数据都有一个数据头。数据头包含一个常量和数据长度,读数据时只有当读出的常量是正确的,才认为该数据是正确的。
下面介绍消息存储的一些结构和实现:
采用索引机制,IndexItem的结构:
  short MAGIC   用于判断该索引是否正确
  long offset   该索引在index中的位置
  long previousItem   前一个索引的位置
  long nextItem   后一个索引的位置
  long keyOffset   key的位置
  int keyFile   key所在的文件
  long valueOffset   value的位置
  int valueFile   value所在的文件
  boolean active   该索引是否活动的
DataItem(存储在文件上的数据格式)的结构:
 short MAGIC   用于判断该索引是否正确
 long offset   该索引在index中的位置
 int file   所在的文件
 int size   数据的长度
下面介绍本发明的基于文件存储的数据存储过程(基于图一):
每个目的地对应一个MapContainer,根据目的地中的messageId和message值建立对应的MapContainer,所有的MapContainer存放在一个map中。
●存数据:调用MapContainer.put(messageId,message)
1.创建一个空的IndexItem(索引项)
2.通过findSpaceForData()函数查找到空闲的文件区域
3.把keyData即messageId写入文件,并创建一个dataItem,在dataItem,
存放messageId所在的文件以及在该文件的偏移量
4.根据dataItem设置IndexItem的值,即keyFile和keyOffset
5.通过findSpaceForData()函数查找到空闲的文件区域
6.把valueData即message消息体写入文件,并创建一个dataItem,存放message所在的文件以及在该文件的偏移量
7.根据dataItem设置IndexItem的值,即valueFile和valueOffset
8.把IndexItem放入一个list,并存入index文件
9.把indexItem、keyDate放入两张Map,一张以indexItem作为key,另一张以keyData作为key
●取数据:调用MapContainer.get(messageId)
1.从消息索引表(存放(messageId,IndexItem)形式的(key,value)对的表结构)中根据keyData得到IndexItem(索引项)
2.在特定的IndexItem中,得到存放在其中的message所在的文件以及在文件的偏移量,也即得到DataItem
3.由DataManager根据DataItem得到存在文件上的具体的消息数据
●删除数据:调用MapContainer.remove(messageId)
1.从消息索引表(存放(messageId,IndexItem)形式的(key,value)对的表结构)中根据keyData得到IndexItem(索引项)
2.从两张消息索引表(存放(messageId,IndexItem)形式的(key,value)对和存放(IndexItem,messageId)形式的(key,value)对的表结构)中删除掉对应indexItem、keyData项
3.根据IndexItem得到存放在其中的message所在的文件以及在文件的偏移量,也就得到了DataItem(和前面一样)
4.由DataManager根据DataItem删除存在文件上的具体的消息数据
5.从list链表中删除掉IndexItem项
6.把IndexItem重置,active=false
7.updata该IndexItem到index文件中
上述实施例用来解释说明本发明,而不是对本发明进行限制,在本发明的精神和权利要求的保护范围内,对本发明作出的任何修改和改变,都落入本发明的保护范围。

Claims (2)

1.一种基于发布订阅***的文件存储方法,其特征在于:在pub/sub***中,为每个消息目的地都创建一个消息容器表,且每个目的地的消息容器表都将存在一个表结构中,同时每个目的地的消息容器表就是缓存消息的接口,可以通过消息容器表提供的存储、删除、修改方法来对消息进行相应的动作;消息容器表的具体方法如下:消息容器表中存放的是设定目的地的消息总和,每个消息以关键字/值对的形式来存储,在存储消息对的同时,为每个消息建立一个索引,索引记录了每个消息的关键字和值两个数据所在的文件以及在文件的起始位置,每个索引的结构大小都一样,所有索引都以链表的形式存放在索引文件中;并且,每个消息和它对应的索引关系以关键字/值对的形式存放在一个消息索引表中,具体的消息以数据文件的格式存储在文件中,文件的大小可手动配置,但在文件大小配置好的情况下,存放在文件中的消息大小不可超过配置好的每个文件的大小。
2.根据权利要求1所述的基于发布订阅***的文件存储方法,其特征在于:***启动好后,为每个目的地建立一个消息容器表,且每个目的地只有一个消息容器表,该目的地中的所有消息都以关键字/值对的形式保存在这个消息容器表中,其中关键字对应于目的地中的一个消息的messageId,messageId在消息的发送过来的包中已经定义,值则对应该消息对象的内容;
(1).当一个可持续订阅的消息到达服务器端:
从消息中得到它将要发往的目的地名称,根据该目的地名称,找到对应的消息容器表,若不存在这样的消息容器表,则创建一个新的消息容器表;接着,从到达的消息中找到对应的messageId以及它的值,通过消息容器表提供的存储消息的方法将消息保存到文件中;
(2).若要从文件中取出一个持久化消息,则:
同上找到该消息对应的消息容器表,并根据消息容器表提供的取消息的方法去文件中读取一条消息即可;
(3).若要从文件中删除一个持久化消息,则:
同上找到该消息对应的消息容器表,根据消息容器表的删除消息的方法,在文件中找到该消息,并删除即可。 
CN200710164756XA 2007-12-12 2007-12-12 基于发布订阅***的文件存储方法 Expired - Fee Related CN101197844B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN200710164756XA CN101197844B (zh) 2007-12-12 2007-12-12 基于发布订阅***的文件存储方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN200710164756XA CN101197844B (zh) 2007-12-12 2007-12-12 基于发布订阅***的文件存储方法

Publications (2)

Publication Number Publication Date
CN101197844A CN101197844A (zh) 2008-06-11
CN101197844B true CN101197844B (zh) 2011-01-26

Family

ID=39547990

Family Applications (1)

Application Number Title Priority Date Filing Date
CN200710164756XA Expired - Fee Related CN101197844B (zh) 2007-12-12 2007-12-12 基于发布订阅***的文件存储方法

Country Status (1)

Country Link
CN (1) CN101197844B (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103177026A (zh) * 2011-12-23 2013-06-26 北京新媒传信科技有限公司 数据管理方法和数据管理***
CN103500206A (zh) * 2013-09-29 2014-01-08 北京华胜天成科技股份有限公司 基于文件存储数据的存储方法及装置
CN103678577B (zh) * 2013-12-10 2017-10-24 新浪网技术(中国)有限公司 一种数据更新方法及装置
CN105677916A (zh) * 2016-03-02 2016-06-15 浪潮软件集团有限公司 一种关于Redis使用的方法
CN108259312A (zh) * 2016-12-29 2018-07-06 广州市动景计算机科技有限公司 信息发布方法、装置及服务器

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6985887B1 (en) * 1999-03-19 2006-01-10 Suncrest Llc Apparatus and method for authenticated multi-user personal information database
CN1779704A (zh) * 2004-11-18 2006-05-31 黄金富 信用资料查询***及查询方法
EP1793562A1 (en) * 2005-12-02 2007-06-06 Alcatel Lucent Virtual private network publish-subscribe multicast service
CN101078995A (zh) * 2007-06-08 2007-11-28 北京大学 构件运行支撑平台接入消息服务的方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6985887B1 (en) * 1999-03-19 2006-01-10 Suncrest Llc Apparatus and method for authenticated multi-user personal information database
CN1779704A (zh) * 2004-11-18 2006-05-31 黄金富 信用资料查询***及查询方法
EP1793562A1 (en) * 2005-12-02 2007-06-06 Alcatel Lucent Virtual private network publish-subscribe multicast service
CN101078995A (zh) * 2007-06-08 2007-11-28 北京大学 构件运行支撑平台接入消息服务的方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
刘昱.基于内容的Pub/Sub***中分发器网络自重构的研究.计算机应用研究.2006,(2),全文. *

Also Published As

Publication number Publication date
CN101197844A (zh) 2008-06-11

Similar Documents

Publication Publication Date Title
CN101686209B (zh) 消息转发***中存储消息的方法和装置
CN103095724B (zh) 一种内容中心网络多个兴趣包压缩发送及处理的方法
CN109491859A (zh) 针对Kubernetes集群中容器日志的收集方法
CN101197844B (zh) 基于发布订阅***的文件存储方法
US9898454B2 (en) Using text messages to interact with spreadsheets
KR101919180B1 (ko) 웹 기반 이메일 시스템에서의 대화 구조의 동기화 기법
US10122665B2 (en) Distributed synchronization data in a message management service
US20110219083A1 (en) Email auto-filing and management
CN102833180B (zh) 一种分享微博消息的方法和***
US8489694B2 (en) Peer-to-peer collaboration of publishers in a publish-subscription environment
CN110968431B (zh) 一种消息处理方法、装置及设备
CN106991177B (zh) 一种分布式环境下实时日志的无损采集方法及其***
CN101938430A (zh) 电子邮件的处理方法和处理***
CN103209214A (zh) 一种基于NoSQL的消息中间件的实现方法
CN102769687A (zh) 信息群发***及方法
CN101453428B (zh) 用于定制邮件历史的方法和设备
CN102891797A (zh) 支持消息持久化的发布订阅方法
CN102833408B (zh) 一种消息显示方法和装置
CN102801693A (zh) 一种外网信息的处理方法和***
CN106020713A (zh) 一种基于缓冲区的文件存储方法
CN100546281C (zh) 一种传输数据的方法及装置
CN101309231B (zh) 一种线索的操作方法及装置
CN105204776B (zh) 数据处理方法及装置
CN107040455B (zh) 一种基于redis的即时消息通讯方法和***
CN113626457A (zh) 缓存删除重试机制实现数据库与缓存一致性方法及***

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
EE01 Entry into force of recordation of patent licensing contract

Application publication date: 20080611

Assignee: Hundsun Technologies Inc.

Assignor: Zhejiang University

Contract record no.: 2013330000107

Denomination of invention: File memory method based on subscription issuing system

Granted publication date: 20110126

License type: Common License

Record date: 20130426

LICC Enforcement, change and cancellation of record of contracts on the licence for exploitation of a patent or utility model
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20110126

Termination date: 20171212

CF01 Termination of patent right due to non-payment of annual fee