一种数据处理的方法及系统的制作方法_2

文档序号:8512489阅读:来源:国知局
以进行数据的接收存储。
[0032]众所周知,对数据的分类接收及存储会大大的提高数据处理的效率,那么,在数据接收和存储时引入分布式消息队列就是一种很好的处理方式。目前,在大多数有任务处理的系统中都会涉及到消息队列,通过消息队列来解耦合各个系统,减少各系统之间的依赖,提高稳定性,比如activemq、kafka等等。
[0033]本发明的优选实施例中以kafka为例来进行说明。例如,当有数据请求信息时,kafka服务器端会将接收到的实时数据根据不同的关键字(topic)进行分类,分类后的数据会被平均分配到此topic下的多个分组(partit1n)上,以partit1n为最小数据单位进行数据的分配及读取。如此,同时接收到的海量数据会依据其自身不同的特征被进行详细的分组。之后,每组数据被分发到不同的客户端进行接收存储。数据的接收及存储过程将在后文详述,此处不再赘述。
[0034]服务端装置还包含有任务协调装置,当出现客户端装置加入或者离开的情况时,任务协调装置会启动负载均衡算法,将kafka服务器端装置分组后的数据均衡分配到相应的客户端装置。此处,任务协调装置可采用Zookeeper或其他任务协调装置来实现。
[0035]在本发明的优选实施例中,为了解决一组kafka客户端意外宕机所造成的数据积压问题,采取了分布式多台机器的结构,引入了多组kafka客户端装置,通过动态修改kafka客户端装置的Group ID及引入“去重”机制来实现数据接收。由于当kafka客户端在接收数据的时候,需要指定topic,而每个topic的数据只能对应一个Group ID的一组kafka客户端,因此,本发明通过引入多组kafka客户端,动态修改每组kafka客户端的Group ID,以使每个topic的数据会被多组kafka客户端同时接收。每组kafka客户端在对数据进行接收时会对数据进行检查,判断其是否已被其他的kafka客户端接收过,如果已有其他客户端进行接收则对相应数据进行丢弃处理,否则进行接收存储。
[0036]采用如上所述的方案后,即使一组kafka客户端意外宕机无法接收数据,也不影响数据的实时接收,此方案既能解决单个客户端宕机造成的数据积压,又能解决服务端大批量推送数据时客户端接收效率低的问题。
[0037]步骤S12:客户端装置接收所述分组后的数据,并将该数据进行存储。其中,将该数据进行存储的步骤包括:持久化存储所述数据,以及缓存该数据。
[0038]在本发明的优选实施例中,客户端装置接收数据后,将所述数据分别持久化存储到数据库及缓存到一个读取性能很高的数据库。增加该缓存后,在进行数据处理时,直接从该缓存中读取信息,读取速度大大提高,数据处理完成后,将该缓存中相应的数据删除,并将处理结果反馈给数据库以进行数据状态变更。当数据处理失败时,不反馈信息,从缓存中读取未处理数据继续进行。如此,在数据处理时需要与数据库的数据交互量将大大减少,可以释放大量空间,从而保证了数据库的I/o性能,提高了处理效率,有利于保证数据的实时性。
[0039]步骤S13:客户端装置读取存储的所述数据,然后对读取的数据分片,再对每片数据分别作单线程处理。
[0040]在本发明的优选实施方式中,步骤S13可以按照如下步骤来进行:
[0041]步骤S131:客户端装置中的数据分发单元定时读取数据,并根据数据的业务字段对数据进行分片,然后分发到客户端装置中不同的数据处理单元;
[0042]步骤S132:各数据处理单元单线程处理接收到的数据。
[0043]由步骤S131及步骤S132可以看出,当待处理数据存储到缓存中后,客户端装置中的数据分发单元从缓存中读取数据,并根据数据的业务字段对数据进行分片,然后分发到不同的数据处理单元。此处,数据的业务字段可根据需要进行配置。
[0044]每个数据处理单元内部都有单独的数据队列,由单独的线程进行处理,这样就形成了单线程依次顺序处理数据的机制,从而既保证了处理性能,又避免了多线程同时更新导致的更新丢失及内存资源浪费问题。
[0045]各数据处理单元对数据进行处理后,如果数据处理成功,会将数据库对应的数据状态变更为已处理,同时删除缓存中的数据;如果数据处理失败,不变更状态,继续处理数据队列里的下一条数据。数据分发单元会定时的从缓存中读取未处理的数据,并根据数据的业务字段对数据进行分片,然后进行分发重新处理,从而保证了数据处理的准确性,避免了数据积压或者数据处理失败造成的数据丢失。
[0046]另外本发明实施方式中,还可增加一个内存数据库用于存储加锁和解锁指令,以实现手动控制数据处理的暂停和重启。在需要暂停或重启数据处理的情况下,所述数据分发单元将加锁或解锁指令分发至各所述数据处理单元以暂停或重启数据处理。例如,用户需要在每天的固定时刻暂停数据处理以进行其它操作,此时就可以在该内存数据库中设定一个定时器模块来进行控制。
[0047]当需要暂停数据处理时,内存数据库中的定时器会发出一条加锁指令到数据分发单元。数据分发单元收到加锁指令后会将指令分发给所有数据处理单元。数据处理单元收到指令后,首先清空其内存队列,然后等待处理完当前数据,之后其数据队列变为阻塞状态,等待解锁后继续执行。
[0048]当需要重启数据处理时,内存数据库中的定时器会发出一条解锁指令到数据分发单元。数据分发单元收到解锁指令后将指令分发给所有数据处理单元。数据处理单元收到指令后,唤醒阻塞的数据队列继续数据处理,从而达到重新开始的效果。
[0049]图2是根据本发明实施例的一种数据处理的方法的详细步骤流程图。
[0050]如图2所示的流程图,当服务端装置接收到实时数据后,根据kafka消息队列的消息管理规则对数据进行分组,并在任务协调装置的协调下分发到多组客户端装置(步骤S21)。客户端装置根据接收规则接收数据并保存到数据库及缓存LevelDB中,此处缓存也可选用其他读写性能高的数据库(步骤S22)。存储成功后,数据分发单元定时从缓存中读取数据,并根据设定的业务字段对数据进行分片后分发到不同的数据处理单元(步骤S23)。各数据处理单元内部都有单独的数据队列,由单独的线程进行处理(步骤S24)。当数据处理成功时,将数据库中对应数据状态变更为已处理,同时删除缓存LevelDB中的数据;如果处理失败,不变更数据库中的数据状态。数据分发单元会定时从缓存LevelDB中读取未处理的数据重新处理,保证了数据处理的准确性。
[0051]当需要进行数据处理的暂停及重启时,内存数据库Redis中存储的加锁及解锁指令会被数据分发单元分发到各个数据处理单元,以进行相应的处理。这里的内存数据库也可选用其他高性能的缓存或数据库。
[0052]图3是根据本发明实施例的一种数据处理的方法的kafka分布式消息队列工作原理示意图。
[0053]当有数据请求信息时,kafka服务器端会将接收到的实时数据根据不同的关键字(topic)进行分类,分类后的数据会被平均分配到此类的多个分组(partit1n)上。
[0054]kafka客户端根据指定的topic进行数据接收,每组kafka客户端都有自己的Group ID,每组内的不同kafka客户端对应接收相应partit1n的数据。
[0055]如图3所示,一组相同关键字(topic)的数据被分为多个分组(partit1n):分组
1、分组2、分组3......。相应的客户端装置有3组,kafka客户端A、kafka客户端B及kafka
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1