VC天下 » C/C++架构设计

实时数据缓存管理的初步设计

对于实时较大数据量的缓存管理上,设计的方式有很多。在此提出一种初步的、较粗略的思路,仅供参考。背景:系统分为三层,数据采集层(采集底层的数据),消息管理层(对采集上来的数据进行处理)、消息接口层(对消息解析封装、处理客户端的Socket请求等)。

在数据的缓存管理上,采用双缓冲区模式的管理机制。

双缓冲区模式:在内存里开辟两块容量相等的缓冲区(以下将分别它们称为第一缓冲区和第二缓冲区)作为连续数据输入的缓冲区。工作开始时,采集到消息管理层的数据先写入第一缓冲区中,在第一缓冲区写满后,再写入第二缓冲区,当把数据写入第二缓冲区的同时,数据处理线程根据自身需要取出第一缓冲区中的数据做特定的处理,例如存文件,存储完毕后,将缓冲清空,等待再次被写入。当第二缓冲区被写满后,再回到第一缓冲区,把新数据写入第一缓冲区中;与此同时数据处理线程取出第二缓冲区中的数据。整个数据缓存处理过程可以如此不断地循环进行下去。

缓冲区的大小,可以从XML配置文件中设置,设置方式有两种,一种为大小模式,一种为时间间隔模式。采用设置大小的模式后,数据写入缓冲的判定准则为是否到达指定的缓冲区最大容量,如果到了,就开始写入另一个缓冲区。采用时间间隔的模式的话,则以设置的时间间隔为准则,来切换写入的两个缓冲区。从而实现两个缓冲区的交替进行,确保数据无丢失。

当一条采集数据从采集层传到消息管理层时,首先查找设备主题,如果存在此设备ID,则设置相应的设备主题的数据,然后进入当前工作的缓冲区,增加此条数据,然后,分发给订阅此设备的所有用户,最后,将此数据记录插入到levelDB数据库中。

消息分发到消息接口层时,接口层将此条消息解析成XML格式,加上消息头,发送给订阅用户。消息头中,有一项重要的编号sn,作为一次发送消息包的唯一编号标示。发送成功后,记录此sn到sn的集合中。接口层等待客户端反馈的消息,如果客户反馈回消息来了,则提取返回的sn编号,在sn集合中进行查找,如果查找成功,那么,删除此sn集合中的记录,此条数据已经完整的处理成功了。每隔5分钟,或者其它时间段(这个时间间隔,可以在系统XML文件中设定),检查sn集合。如果sn集合中有存在的sn记录,则视为发送不成功的消息记录,此时再次重新发送。重新发送时,需要根据设备id与时间戳作为key,从levelDB中去查找对应到的value,即数据,再结合用户id,形成发送消息,从而发送给对应的客户端。

sn集合包含:sn编号、用户id、设备id、时间戳。

数据缓存插入levelDB存储系统时,以device_id + time_stamp 为key值,确保key值唯一,data为value。

插入关系数据库的话,采用分区表的机制,便于数据量过大时,提升查询效率。

以下为三个流程图:数据缓存管理流程1

数据缓存管理流程2

数据缓存管理流程3

发表评论