一种基于消息中间件的数据处理方法和装置与流程

文档序号:24157637发布日期:2021-03-05 12:53阅读:121来源:国知局
一种基于消息中间件的数据处理方法和装置与流程

[0001]
本发明涉及计算机技术领域,尤其涉及一种基于消息中间件的数据处理方法和装置。


背景技术:

[0002]
消息中间件是分布式系统中不可或缺的重要组件,常用来解决系统解耦、异步消息处理、流量洪峰削减等问题。目前市面上已有较多的消费中间件,例如activemq、rabbitmq、kafka和rocketmq。
[0003]
由于activemq和rabbitmq历史较为悠久,扩展性和性能较差,不适用于高性能、高可扩展的互联网场景,因此本发明主要以kafka和rocketmq为对象进行说明。
[0004]
在实现本发明的过程中,发明人发现现有技术存在如下问题:
[0005]
1、由于一个分区(或队列)只能由一个消费者处理,因此分区(或队列)的数量限制了kafka(或rocketmq)的水平扩展能力,且分区数量过多也会降低系统的可用性;
[0006]
2、虽通过依赖分区(或队列)扩容方式提高数据并发度,但该扩容依赖人工,维护不易;
[0007]
3、当消费者数量超出分区(或队列)数量时,多出的消费者会处于空闲状态,无法实现水平扩容;
[0008]
4、在系统出现异常时,对于所拉取到数据易出现处理失败或确认失败的问题,而现有方式并未提供重新消费的思路。


技术实现要素:

[0009]
有鉴于此,本发明实施例提供一种基于消息中间件的数据处理方法和装置,至少能够解决现有技术中消费能力受限于消费者数量以及需手动扩容的问题。
[0010]
为实现上述目的,根据本发明实施例的一个方面,提供了一种基于消息中间件的数据处理方法,包括:
[0011]
接收消费者传输的数据获取请求,根据所述消费者的标识,确定与所述消费者相对应的分区,获取所述分区的第一偏移量;
[0012]
在所述分区中,获取与所述第一偏移量相对应的第一数据,并触发查询超时待确认重试队列中是否存在超时待确认消息的操作;
[0013]
若不存在,则传输所述第一数据至所述消费者;或
[0014]
若存在,则根据所述超时待确认消息中的第二偏移量,获取第二数据,传输所述第一数据和所述第二数据至所述消费者。
[0015]
可选的,在所述接收消费者传输的数据获取请求之前,还包括:
[0016]
当监测到所述分区中存在偏移量锁文件时,根据所述分区的标识,确定与所述分区相对应的消费者;获取各消费者当前的工作状态,通过预定抢锁机制,从当前处于空闲状态的消费者中确定符合所述抢锁机制的消费者,传输所述偏移量锁文件至所确定的消费
者。
[0017]
可选的,所述通过预定抢锁机制,从当前处于空闲状态的消费者中确定符合所述抢锁机制的消费者,包括:传输所述分区存在所述偏移量锁文件的信息至当前处于空闲状态的消费者;接收多个消费者传输的对所述偏移量锁文件的获取请求,以从所述多个消费者中确定符合所述抢锁机制的消费者。
[0018]
可选的,在所述获取所述分区的第一偏移量之后,还包括:传输所述第一偏移量至所述消费者中,并在监测到所述消费者传输所述第一偏移量至偏移量持久化文件后,触发所述消费者释放所述偏移量锁文件至所述分区中。
[0019]
可选的,所述获取与所述第一偏移量相对应的第一数据,包括:确定与所述第一偏移量相对应的数据文件;利用与所述数据文件相关联的索引文件,查找小于或等于所述第一偏移量的最大偏移量,得到与所述最大偏移量相对应的第三数据在所述数据文件中的位置;从所述位置开始进行顺序扫描,直至扫描到所述第一偏移量所处位置为止,得到与所述第一偏移量相对应的第一数据。
[0020]
可选的,在触发查询超时待确认重试队列中是否存在超时待确认消息的操作之前,还包括:利用超时确认扫描线程,对偏移量确认文件中的消息进行扫描,得到标注为未处理的超时待确认消息;其中,所述偏移量确认文件包括偏移量和与该偏移量对应数据处理状态的映射关系;传输所述超时待确认消息至所述超时待确认重试队列中进行存储。
[0021]
可选的,还包括:接收所述消费者传输的偏移量,根据所接收到的偏移量,对所述偏移量确认文件中与各偏移量相对应的消息进行标注更新;其中,偏移量为处理完成的所述第一数据和/或所述第二数据的偏移量。
[0022]
为实现上述目的,根据本发明实施例的另一方面,提供了一种基于消息中间件的数据处理装置,包括:
[0023]
请求接收模块,用于接收消费者传输的数据获取请求,根据所述消费者的标识,确定与所述消费者相对应的分区,获取所述分区的第一偏移量;
[0024]
操作触发模块,用于在所述分区中,获取与所述第一偏移量相对应的第一数据,并触发查询超时待确认重试队列中是否存在超时待确认消息的操作;
[0025]
数据传输模块,用于若不存在,则传输所述第一数据至所述消费者;或若存在,则根据所述超时待确认消息中的第二偏移量,获取第二数据,传输所述第一数据和所述第二数据至所述消费者。
[0026]
可选的,还包括锁文件分配模块,用于:当监测到所述分区中存在偏移量锁文件时,根据所述分区的标识,确定与所述分区相对应的消费者;获取各消费者当前的工作状态,通过预定抢锁机制,从当前处于空闲状态的消费者中确定符合所述抢锁机制的消费者,传输所述偏移量锁文件至所确定的消费者。
[0027]
可选的,所述锁文件分配模块,用于:传输所述分区存在所述偏移量锁文件的信息至当前处于空闲状态的消费者;接收多个消费者传输的对所述偏移量锁文件的获取请求,以从所述多个消费者中确定符合所述抢锁机制的消费者。
[0028]
可选的,还包括锁文件释放模块,用于:传输所述第一偏移量至所述消费者中,并在监测到所述消费者传输所述第一偏移量至偏移量持久化文件后,触发所述消费者释放所述偏移量锁文件至所述分区中。
[0029]
可选的,所述操作触发模块,用于:确定与所述第一偏移量相对应的数据文件;利用与所述数据文件相关联的索引文件,查找小于或等于所述第一偏移量的最大偏移量,得到与所述最大偏移量相对应的第三数据在所述数据文件中的位置;从所述位置开始进行顺序扫描,直至扫描到所述第一偏移量所处位置为止,得到与所述第一偏移量相对应的第一数据。
[0030]
可选的,操作触发模块,还用于:利用超时确认扫描线程,对偏移量确认文件中的消息进行扫描,得到标注为未处理的超时待确认消息;其中,所述偏移量确认文件包括偏移量和与该偏移量对应数据处理状态的映射关系;传输所述超时待确认消息至所述超时待确认重试队列中进行存储。
[0031]
可选的,还包括标注更新模块,用于:接收所述消费者传输的偏移量,根据所接收到的偏移量,对所述偏移量确认文件中与各偏移量相对应的消息进行标注更新;其中,偏移量为处理完成的所述第一数据和/或所述第二数据的偏移量。
[0032]
为实现上述目的,根据本发明实施例的再一方面,提供了一种基于消息中间件的数据处理电子设备。
[0033]
本发明实施例的电子设备包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现上述任一所述的基于消息中间件的数据处理方法。
[0034]
为实现上述目的,根据本发明实施例的再一方面,提供了一种计算机可读介质,其上存储有计算机程序,所述程序被处理器执行时实现上述任一所述的基于消息中间件的数据处理方法。
[0035]
根据本发明所述提供的方案,上述发明中的一个实施例具有如下优点或有益效果:将原有一个分区(或队列)仅对应一个消费者的思路,变更为多个消费者;新增偏移量锁文件,以保证对应于同一分区(或队列)的多个消费者可以并发获取偏移量信息,并达到获取数据不重复的效果;新增偏移量确认文件、超时确认扫描线程和超时待确认重试消息队列,以通过超时重试机制,保证异常未确认的数据不丢失,做到数据消费的不重不漏以及再消费;无需考虑扩容或修改分区(或队列)的大小,即可实现消费处理能力的水平扩展,降低了对手动扩容的依赖性,具有良好的维护性。
[0036]
上述的非惯用的可选方式所具有的进一步效果将在下文中结合具体实施方式加以说明。
附图说明
[0037]
附图用于更好地理解本发明,不构成对本发明的不当限定。其中:
[0038]
图1是根据本发明实施例的一种基于消息中间件的数据处理方法的主要流程示意图;
[0039]
图2是现有kafka数据生产和消费模型示意图;
[0040]
图3是优化后的kafka数据生产和消费模型示意图;
[0041]
图4是根据本发明实施例的一种可选的基于消息中间件的数据处理方法的流程示意图;
[0042]
图5是多个消费者通过抢锁机制获取偏移量锁文件的示意图;
[0043]
图6是根据本发明实施例的另一种可选的基于消息中间件的数据处理方法的流程示意图;
[0044]
图7是在分区中根据偏移量获取相应数据的示意图;
[0045]
图8是根据本发明实施例的又一种可选的基于消息中间件的数据处理方法的流程示意图;
[0046]
图9是根据本发明实施例的一具体的基于消息中间件的数据处理方法的流程示意图;
[0047]
图10是根据本发明实施例的一种基于消息中间件的数据处理装置的主要模块示意图;
[0048]
图11是本发明实施例可以应用于其中的示例性系统架构图;
[0049]
图12是适于用来实现本发明实施例的移动设备或服务器的计算机系统的结构示意图。
具体实施方式
[0050]
以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
[0051]
需要说明的是,本发明实施例主要适用于kafka、rocketmq、ddmq等具有分布式架构的消息中间件,且适用于面对海量数据、吞吐量要求高、响应延迟低的互联网场景。本发明主要以kafka为例进行说明。
[0052]
参见图1,示出的是本发明实施例提供的一种基于消息中间件的数据处理方法的主要流程图,包括如下步骤:
[0053]
s101:接收消费者传输的数据获取请求,根据所述消费者的标识,确定与所述消费者相对应的分区,获取所述分区的第一偏移量;
[0054]
s102:在所述分区中,获取与所述第一偏移量相对应的第一数据,并触发查询超时待确认重试队列中是否存在超时待确认消息的操作;
[0055]
s103:若不存在,则传输所述第一数据至所述消费者;
[0056]
s104:若存在,则根据所述超时待确认消息中的第二偏移量,获取第二数据,传输第一数据和第二数据至所述消费者。
[0057]
上述实施方式中,对于步骤s101,消费中间件中的数据(message,也可称为消息)是以主题topic为基本单位组织的,不同主题之间是相互独立的。每个主题又可以分为多个不同的分区partition,且分区数量通常在创建主题时预先设定,每个分区存储一部分数据。
[0058]
例如,topic的名称为"my_topic",分有2个分区,那么在kafka的数据目录中(由配置文件中的log.dirs指定)就有两个目录:my_topic_0和my_topic_1,其命名规则为<topic_name>-<partition_id>,以分别存储这2个分区中的数据。
[0059]
现有方式中,一个消费者可以消费多个分区中的消息,但一个分区却只能被一个消费者消费(对应于rocketmq,分区还包括多个队列,一个队列只能被一个消费者消费),当
该消费者的消费线程宕机时,需要由其他消费线程替补。
[0060]
参见图2所示,为现有kafka模型数据生产和消费示意图,当消费者数量超过分区数量,则多于数量的消费者就会处于空闲状态,例如kafkaconsumer4和kafkaconsumer5。
[0061]
为提高分区内数据的消费速度,本发明采用多对多的关系,即一个分区(对应于rocketmq则为队列)可以被多个消费者消费,而同一个消费者又可以消费多个分区中的数据。
[0062]
参见图3所示,为优化后的kafka模型数据生产和消费示意图,kafkaconsumer1、kafkaconsumer2和kafkaconsumer3并行处理partition1中的数据,从而避免消费者空闲的情况,有效提高数据处理的吞吐量。
[0063]
每个消费者都设有唯一的id(host:uuid,可以通过配置文件指定,也可以由系统生成),格式为:/consumers/[group_id]/ids/[consumer_id]是一个临时的znode,节点值为{"topic_name":#streams

},即表示此消费者目前所消费的topic+partitions列表。
[0064]
实际操作中,可以预先设定哪些消费者可以处理哪些分区(对于rocketmq则为队列),并将消费者id和分区标识(例如编号)存放在zookepper中;其中,zookepper为kafka的一个功能性组件。
[0065]
在各消费者和各分区之间设有唯一消费线程,用以进行信息传输。kafka消费线程在接收到消费者传输的数据获取请求后,从相应分区中获取偏移量offset(即第一偏移量);其中,offset存储于消费线程所在设备的内存中,用以表示一条message在分区数据文件中的唯一逻辑存储位置。
[0066]
需要说明的是,虽多个消费者可以并行处理同一分区内的数据,但同一时刻只有一个消费者可以向分区请求获取偏移量,对于该唯一消费者的确定,可以通过抢锁机制,具体见后续图4描述,在此不再赘述。
[0067]
kafka采用push机制由sender/producer主动发送数据到broker,而pull则由消费者主动向broker请求数据;其中,kafka集群由一个或者多个服务器组成,服务器被称为broker。因此,获取到锁文件的消费者,会通过pull,从broker中获取到对应分区的offset和消息数据。对于其他消费中间件,例如activemq和rabbitmq,这里的pull则替换为默认推送模式。
[0068]
对于步骤s102,分区中的每条数据由offset来表示其在这个分区中的位置。需要说明的是,offset不是实际存储位置,而是逻辑上的一个值,它唯一确定了分区中的一条数据。分区中的每条数据包含了以下三个属性:
[0069]
1)offset
[0070]
2)messagesize
[0071]
3)data
[0072]
其中,offset为long型;messagesize为int32,表示data的大小;data为数据的具体内容。
[0073]
针对于某个offset的数据,kafka在数据存储时,采用了分区(分区)、分段(logsegment)和稀疏索引三个方式进行数据管理,按照该三个方式顺序查找,即可得到与分区偏移量相对应的数据。
[0074]
例如,消费线程首先确定偏移量(即第一偏移量)所处数据文件topica-1.log,之
后利用与该数据文件相对应的索引文件topica-1.index,查找数据在数据文件topica-1.log中的位置,并该位置处的数据(即第一数据)返回给消费者,具体见后续图6描述,在此不再赘述。
[0075]
由于有些数据可能由于系统异常导致消费者未处理完毕,因此在获取第一数据的同时,还会检查超时待确认重试队列,以确定是否存在需要与该分区相关联的需要重新处理的数据。其中,超时待确认重试队列用以存放超时待确认消息,为降低该队列对系统内存的占用,待确认重试队列中可以仅存储有数据的偏移量。
[0076]
对于步骤s103和s104,基于偏移量的唯一性,可以针对每个主题设置有一个超时待确认重试队列,并存储所包含所有分区的待处理数据偏移量,也可以预先针对每个分区设置有超时待确认重试队列,实现消息独立。
[0077]
以针对分区单独设置超时待确认重试队列为例:
[0078]
1)若该队列中存在超时待确认消息:超时待确认消息仅存有偏移量(即第二偏移量),后续仍需要根据该偏移量从分区中获取相应数据(即第二数据)。在传输第一数据至消费者的同时,也会将该第二数据返回给消费者一并进行处理。
[0079]
2)若该队列中不存在超时待确认消息:则仅将获取到的第一数据返回给消费者。
[0080]
消费者也可以通过kafka提供的api(application programming interface,应用程序编程接口)读取消息内容,之后自行完成业务逻辑。
[0081]
上述实施例所提供的方法,消费线程在获取消费者所请求的数据同时,若查询存在超时待确认消息,也会将相应超时待确认数据一同传输至消费者,以便消费者对超时待确认数据再次消费。
[0082]
参见图4,示出了根据本发明实施例的一种可选的基于消息中间件的数据处理方法流程示意图,包括如下步骤:
[0083]
s401:当监测到分区中存在偏移量锁文件时,根据所述分区的标识,确定与所述分区相对应的消费者;
[0084]
s402:获取各消费者当前的工作状态,通过预定抢锁机制,从当前处于空闲状态的消费者中确定符合抢锁机制的消费者,传输所述偏移量锁文件至所确定的消费者;
[0085]
s403:接收消费者传输的数据获取请求,根据所述消费者的标识,确定与所述消费者相对应的分区,获取所述分区的第一偏移量;
[0086]
s404:传输所述第一偏移量至所述消费者中,并在监测到所述消费者传输所述第一偏移量至偏移量持久化文件后,触发所述消费者释放所述偏移量锁文件至所述分区中;
[0087]
s405:在所述分区中,获取与所述第一偏移量相对应的第一数据,并触发查询超时待确认重试队列中是否存在超时待确认消息的操作;
[0088]
s406:若不存在,则传输所述第一数据至所述消费者;
[0089]
s407:若存在,则根据所述超时待确认消息中的第二偏移量,获取第二数据,传输第一数据和第二数据至所述消费者。
[0090]
上述实施方式中,对于步骤s403、s405~s407可参见图1所示步骤s101~s103的描述,在此不再赘述。
[0091]
上述实施方式中,对于步骤s401,本发明中的一个分区对应于多个消费者处理,其标识及对应关系存储于kafka的zookepper中。
[0092]
为保证每个消费者所获取的数据不重复,本发明在原有kafka规模的基础上针对每个分区设置有一个偏移量锁文件,例如topica-1.lock,用以保证消费者在获取相应分区偏移量offset时是串行的,但消息处理逻辑仍是并行的。对于rocketmq,则为一个队列一把文件锁。
[0093]
对于步骤s402,分区中的数据较多,多个消费者可以同时并发处理。对于当前处于空闲状态、且与同一分区相对应的多个消费者,可以并发获取偏移量锁文件中的锁。通过预定抢锁的方式,最终只有一个消费者会获取到锁,例如图5中的kafkaconsumer1。
[0094]
所设定的抢锁机制,包括但不限于是以下方式:
[0095]
1)随机指定;
[0096]
2)根据消费者编号顺序性选择,例如选择最大编号或者最小编号;
[0097]
3)若消费者有文字编号,可以选择首字母最大或最小的消费者。
[0098]
空闲分两种,当前无数据处理的空闲和因为宕机所导致的空闲。为避免所选择的消费者可能处于宕机空闲的情况,本发明采取了空闲状态筛选机制,具体地:
[0099]
步骤一:传输分区存在偏移量锁文件的信息至当前处于空闲状态的消费者;
[0100]
步骤二:接收多个消费者传输的对偏移量锁文件的获取请求,以从多个消费者中确定符合抢锁机制的消费者。
[0101]
对于处于宕机空闲的消费者,可能会接收到“分区存在偏移量锁文件的信息”,但却无法发送对该文件的获取请求,以此实现剔除这些消费者,保证了确定可用消费者的准确性。
[0102]
另外,由于同一消费者对应于多个分区,当多个分区的偏移量锁文件均存在时,该消费者可能仅会响应接收最早的“分区存在偏移量锁文件的信息”,并发送相应的锁文件获取请求。例如,分区1和分区2均存在偏移量锁文件,但分区1中偏移量锁文件存在的信息早于分区2告知该消费者,后续该消费者仅传输对分区1中锁文件的获取请求。
[0103]
除此之外,消费者也可以响应所接收到的所有“分区存在偏移量锁文件的信息”,并发送相应的文件获取请求,例如,对分区1和分区2的锁文件获取请求。
[0104]
实际操作中,对模型内只能单线程访问和处理数据的区域,都可以通过改造锁的粒度提高数据处理吞吐量。这里对于锁的改造粒度,不是针对整个消费处理过程的加锁,而只是对获取最新偏移量后可消费的n条数据。
[0105]
对于步骤s404,抢到锁文件的消费者对于锁文件的释放,还可以是其获取到数据(例如第一数据和/或第二数据)之后,后续其他消费者继续进行抢锁操作,但不属于当前分区的消费者不会来抢锁。
[0106]
为提高对于分区内数据的消费速度,本发明采用提前更新的方式,以在消费者将偏移量传输至_consumer_offsets偏移量持久化文件后,触发该消费者释放锁文件至相应分区中。对于同一分区内的其他消费者,可以不用等待消费者处理数据完毕,即可提前进行抢锁、数据拉取、数据处理操作,提高了分区内message的并发处理度。
[0107]
需要说明的是,之前所获取到的偏移量是可以读取的最小偏移量,然后例如读取6条消息后,之后提交的偏移量就变为了原来的offset+6。偏移量更新的意义在于,假若这6条消息消费者实际已消费,但在提交偏移位置之前系统出现宕机的情况,在系统运行恢复后,可以继续从原来位置拉取数据重新消费,保证不会出现数据丢失的情况。
[0108]
上述实施例所提供的方法,打破现有消息者数量有上限的思路,将多个消费者处理同一个分区中数据的逻辑并行起来。多个消费者之间的竞争只在获取偏移量上,而对于后续获取数据、处理数据等逻辑并不加锁,既保证了各个消费者所获取数据的独立性,同时又使得各消费者的处理逻辑并行,大大提升了数据的整体消费性能,提高了数据并发数量。
[0109]
参见图6,示出了根据本发明实施例的另一种可选的基于消息中间件的数据处理方法流程示意图,包括如下步骤:
[0110]
s601:接收消费者传输的数据获取请求,根据所述消费者的标识,确定与所述消费者相对应的分区,获取所述分区的第一偏移量;
[0111]
s602:在所述分区中,确定与所述第一偏移量相对应的数据文件;
[0112]
s603:利用与所述数据文件相关联的索引文件,查找小于或等于所述第一偏移量的最大偏移量,得到与所述最大偏移量相对应的第三数据在数据文件中的位置;
[0113]
s604:从所述位置开始进行顺序扫描,直至扫描到所述第一偏移量所处位置为止,得到与所述第一偏移量相对应的第一数据;
[0114]
s605:在获取第一数据的同时,触发查询超时待确认重试队列中是否存在超时待确认消息的操作;
[0115]
s606:若不存在,则传输所述第一数据至所述消费者;
[0116]
s607:若存在,则根据所述超时待确认消息中的第二偏移量,获取第二数据,传输所述第一数据和所述第二数据至所述消费者。
[0117]
上述实施方式中,对于步骤s601、s605~s607可参见图1所示步骤s101~s103的描述,在此不再赘述。
[0118]
上述实施方式中,对于步骤s602~s604,针对于某个偏移量的数据,kafka在数据存储时,采用了分区(partition)、分段(logsegment)和稀疏索引这几个手段以提高查询高效性:
[0119]
1)分区:具体见上述描述,在此不再赘述;
[0120]
2)分段:为分区内数据查询的优化。比如有50条message,其offset从0-49。假设将分成5段,第一段为0-9,第二段为10-19,以此类推,每段存放在一个单独的数据文件里,数据文件可以以该段中最小的偏移量命名,例如最初始的文件是00000.log命名的,下一个log中第一条消息的偏移量是18987,则该log文件的命名为18987.log。后续在查找指定偏移量的数据时,用二分查找就可以定位到该数据存储在哪个段中;
[0121]
3)稀疏索引:作为分段的优化,kafka为每个分段后的数据文件建立索引文件,文件名可以与数据文件名称一致,只是文件扩展名为.index。此时,每个分段包含有一个数据文件和一个索引文件,例如,00000.index和00000.log。
[0122]
索引文件中包含若干了索引条目,每个条目代表了数据文件中一条偏移量的索引。索引包含两部分,分别为相对offset和position:
[0123]

相对offset:数据文件分段以后,每个数据文件的起始偏移量不为0,相对偏移量表示偏移量相对于其所属数据文件中最小偏移量的大小,以减小索引文件的占用空间。例如,分段后一个数据文件的偏移量是从10开始,那么偏移量为15的数据在index文件中的相对offset就是15-10=5。
[0124]

position:表示数据在数据文件中的绝对位置。只要打开文件并移动文件指针
到这个分区就可以读取到对应的数据。
[0125]
需要说明的是,index文件中并未针对数据文件中每条数据建立索引,而是采用了稀疏存储的方式,每隔一定字节的数据建立一条索引,以避免索引文件占用过多空间的情况,所以通常索引文件是可以存储在系统内存中的。但后续使用过程中,对于没有建立索引的数据不能够一次定位到其在数据文件中的位置,仍需要做顺序性扫描,但相对于未建索引之前扫描范围大幅度较小。
[0126]
以下具体举例,参见图7所示,要查找绝对offset为7的数据:
[0127]
1)首先是用二分查找确定其位于哪个数据文件中,查询结果为第一个数据文件segment(数据段)中。
[0128]
2)打开这个segment的索引文件,再次利用二分查找到offset小于或者等于指定offset的索引条目中最大的offset,查询结果为offset=6。通过索引文件,得到offset为6的message在该数据文件中的位置为9807;
[0129]
3)打开该数据文件,从位置为9807的区域开始顺序扫描,直到找到offset为7的message为止。
[0130]
上述实施例所提供的方法,利用分区内的分段、稀疏索引方式,可以快速定位与指定偏移量相对应的数据,从而提高了在分区内查询数据的查询效率。
[0131]
参见图8,示出了根据本发明实施例的又一种可选的基于消息中间件的数据处理方法流程示意图,包括如下步骤:
[0132]
s801:利用超时确认扫描线程,对偏移量确认文件中的消息进行扫描,得到标注为未处理的超时待确认消息;其中,所述偏移量确认文件包括偏移量和与该偏移量对应数据处理状态的映射关系;
[0133]
s802:传输所述超时待确认消息至所述超时待确认重试队列中进行存储;
[0134]
s803:接收消费者传输的数据获取请求,根据所述消费者的标识,确定与所述消费者相对应的分区,获取所述分区的第一偏移量;
[0135]
s804:在所述分区中,获取与所述第一偏移量相对应的第一数据,并触发查询超时待确认重试队列中是否存在超时待确认消息的操作;
[0136]
s805:若不存在,则传输所述第一数据至所述消费者;
[0137]
s806:若存在,则根据所述超时待确认消息中的第二偏移量,获取第二数据,传输所述第一数据和所述第二数据至所述消费者;
[0138]
s807:接收所述消费者传输的偏移量,根据所接收到的偏移量,对所述偏移量确认文件中与各偏移量相对应的消息进行标注更新;其中,偏移量为处理完成的所述第一数据和/或所述第二数据的偏移量。
[0139]
上述实施方式中,对于步骤s803~s806可分别参见图1所示步骤s101~s103以及图6所示步骤s602~s604的描述,在此不再赘述。
[0140]
上述实施方式中,对于步骤s801,超时确认扫描线程会定时扫描偏移量确认文件中的消息,并将未确认的消息(标记为0)的超时未确认消息放入到超时待确认重试队列中。
[0141]
其中,偏移量确认文件用以记录消费者处理完消息之后再次提交的消息,包括偏移量和与该偏移量对应数据处理状态的映射关系。
[0142]
例如,可以记录每一条消息确认的时间(例如2019.08.12确认)和是否确认的标志
位(0或1,默认0为未确认)。若当前消息的确认时间是10分钟前,但是此条消息的状态依然为0未确认,则确认该条消息超时未确认。
[0143]
另外,偏移量确认文件能够保证数据的异步确认,提高性能。可以设置与分区相对应,因此可以对该分区的索引文件中的偏移量进行复制,再附加标志位选项,得到带时间和确认标注的偏移量确认文件。
[0144]
对于步骤s802,超时待确认重试队列中存储有超时待确认消息,为降低对系统内存的占用,此时可以仅存储偏移量。
[0145]
后续在获取消费者所请求数据的同时,遍历该超市待确认重试队列,以判断是否存在需要重试消费的数据。
[0146]
对于步骤s807,消费者在消费数据完毕后,也会将数据的标识传输至该偏移量确认文件中进行偏移量标注状态更新。
[0147]
由于可能出现系统故障或者消费者宕机的情况,所以对于所获取到的第一数据和/或第二数据,消费者可能仅处理了部分,所以传输至偏移量确认文件中的偏移量可能也仅为部分。
[0148]
上述实施例所提供的方法,通过增加了二次消费确认和超时重试机制,可以解决现有拉取数据后处理失败/确认失败的问题,保证在系统出现异常导致数据未能正确消费的情况下,能通过重试的方式保证数据至少再消费一次。
[0149]
参见图9,示出了根据本发明实施例的一具体的基于消息中间件的数据处理方法流程示意图,包括如下步骤:
[0150]
s901:当监测到分区中存在偏移量锁文件时,根据分区的标识,确定与分区相对应的消费者;
[0151]
s902:获取各消费者当前的工作状态,传输分区存在偏移量锁文件的信息至当前处于空闲状态的消费者;
[0152]
s903:接收多个消费者传输的对偏移量锁文件的获取请求,以从多个消费者中确定符合抢锁机制的消费者,传输偏移量锁文件至所确定的消费者;
[0153]
s904:接收消费者传输的数据获取请求,根据消费者的标识,确定与消费者相对应的分区,获取分区的第一偏移量;
[0154]
s905:传输第一偏移量至所述消费者中,并在监测到消费者传输第一偏移量至偏移量持久化文件后,触发消费者释放偏移量锁文件至分区中;
[0155]
s906:在分区中,获取与第一偏移量相对应的第一数据;
[0156]
s907:利用超时确认扫描线程,对偏移量确认文件中的消息进行扫描,得到标注为未处理的超时待确认消息;其中,偏移量确认文件包括偏移量和与该偏移量对应数据处理状态的映射关系;
[0157]
s908:传输超时待确认消息至超时待确认重试队列中进行存储;
[0158]
s909:在获取第一数据的同时,触发查询超时待确认重试队列中是否存在超时待确认消息的操作;
[0159]
s910:若不存在,则传输第一数据至消费者;
[0160]
s911:若存在,则根据超时待确认消息中的第二偏移量,获取第二数据,传输第一数据和第二数据至消费者;
[0161]
s912:接收消费者传输的偏移量,根据所接收到的偏移量,对偏移量确认文件中与各偏移量相对应的消息进行标注更新;其中,偏移量为处理完成的第一数据和/或第二数据的偏移量。
[0162]
本发明实施例所提供的方案,针对现有消息中间件在消费者数量超限后(kafka为分区数量、rocketmq为分区数量*队列数量)数据消费能力受限的问题,提供了一套优化方案:
[0163]
1)将原有一个分区(或队列)仅对应一个消费者的思路,变更为多个消费者,以此提高对该分区(或队列)中数据的并发处理性能;
[0164]
2)新增偏移量锁文件,以保证对应于同一分区(或队列)的多个消费者可以并发获取偏移量信息,并达到获取数据不重复的效果;
[0165]
3)新增偏移量确认文件、超时确认扫描线程和超时待确认重试消息队列,以通过超时重试机制,保证异常未确认的数据不丢失,做到数据消费的不重不漏以及再消费;
[0166]
4)通过分区中分段和稀疏索引的方式,提高了数据定位的准确性和查询的效率;
[0167]
5)无需考虑扩容或修改分区(或队列)的大小,即可实现消费处理能力的水平扩展,降低了对手动扩容的依赖性,具有良好的维护性。
[0168]
参见图10,示出了本发明实施例提供的一种基于消息中间件的数据处理装置1000的主要模块示意图,包括:
[0169]
请求接收模块1001,用于接收消费者传输的数据获取请求,根据所述消费者的标识,确定与所述消费者相对应的分区,获取所述分区的第一偏移量;
[0170]
操作触发模块1002,用于在所述分区中,获取与所述第一偏移量相对应的第一数据,并触发查询超时待确认重试队列中是否存在超时待确认消息的操作;
[0171]
数据传输模块1003,用于若不存在,则传输所述第一数据至所述消费者;或若存在,则根据所述超时待确认消息中的第二偏移量,获取第二数据,传输所述第一数据和所述第二数据至所述消费者。
[0172]
本发明实施例装置还包括锁文件分配模块1004(图中未标出),用于:当监测到所述分区中存在偏移量锁文件时,根据所述分区的标识,确定与所述分区相对应的消费者;获取各消费者当前的工作状态,通过预定抢锁机制,从当前处于空闲状态的消费者中确定符合所述抢锁机制的消费者,传输所述偏移量锁文件至所确定的消费者。
[0173]
本发明实施例装置中,所述锁文件分配模块1004,用于:传输所述分区存在所述偏移量锁文件的信息至当前处于空闲状态的消费者;接收多个消费者传输的对所述偏移量锁文件的获取请求,以从所述多个消费者中确定符合所述抢锁机制的消费者。
[0174]
本发明实施例装置还包括锁文件释放模块1005(图中未标出),用于:传输所述第一偏移量至所述消费者中,并在监测到所述消费者传输所述第一偏移量至偏移量持久化文件后,触发所述消费者释放所述偏移量锁文件至所述分区中。
[0175]
本发明实施例装置中,所述操作触发模块1002,用于:确定与所述第一偏移量相对应的数据文件;利用与所述数据文件相关联的索引文件,查找小于或等于所述第一偏移量的最大偏移量,得到与所述最大偏移量相对应的第三数据在所述数据文件中的位置;从所述位置开始进行顺序扫描,直至扫描到所述第一偏移量所处位置为止,得到与所述第一偏移量相对应的第一数据。
[0176]
本发明实施例装置中,所述操作触发模块1002,还用于:利用超时确认扫描线程,对偏移量确认文件中的消息进行扫描,得到标注为未处理的超时待确认消息;其中,所述偏移量确认文件包括偏移量和与该偏移量对应数据处理状态的映射关系;传输所述超时待确认消息至所述超时待确认重试队列中进行存储。
[0177]
本发明实施例装置还包括标注更新模块1006(图中未标出),用于:接收所述消费者传输的偏移量,根据所接收到的偏移量,对所述偏移量确认文件中与各偏移量相对应的消息进行标注更新;其中,偏移量为处理完成的所述第一数据和/或所述第二数据的偏移量。
[0178]
另外,在本发明实施例中所述装置的具体实施内容,在上面所述方法中已经详细说明了,故在此重复内容不再说明。
[0179]
图11示出了可以应用本发明实施例的示例性系统架构1100。
[0180]
如图11所示,系统架构1100可以包括终端设备1101、1102、1103,网络1104和服务器1105(仅仅是示例)。网络1104用以在终端设备1101、1102、1103和服务器1105之间提供通信链路的介质。网络1104可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
[0181]
用户可以使用终端设备1101、1102、1103通过网络1104与服务器1105交互,以接收或发送消息等。终端设备1101、1102、1103上可以安装有各种通讯客户端应用。
[0182]
终端设备1101、1102、1103可以是具有显示屏并且支持网页浏览的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机和台式计算机等等。
[0183]
服务器1105可以是提供各种服务的服务器,例如对用户利用终端设备1101、1102、1103所浏览的购物类网站提供支持的后台管理服务器(仅为示例)。后台管理服务器可以对接收到的产品信息查询请求等数据进行分析等处理,并将处理结果(例如目标推送信息、产品信息
--
仅为示例)反馈给终端设备。
[0184]
需要说明的是,本发明实施例所提供的基于消息中间件的数据处理方法一般由服务器1105执行,相应地,基于消息中间件的数据处理装置一般设置于服务器1105中。
[0185]
应该理解,图11中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。
[0186]
下面参考图12,其示出了适于用来实现本发明实施例的终端设备的计算机系统1200的结构示意图。图12示出的终端设备仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
[0187]
如图12所示,计算机系统1200包括中央处理单元(cpu)1201,其可以根据存储在只读存储器(rom)1202中的程序或者从存储部分1208加载到随机访问存储器(ram)1203中的程序而执行各种适当的动作和处理。在ram 1203中,还存储有系统1200操作所需的各种程序和数据。cpu 1201、rom 1202以及ram 1203通过总线1204彼此相连。输入/输出(i/o)接口1205也连接至总线1204。
[0188]
以下部件连接至i/o接口1205:包括键盘、鼠标等的输入部分1206;包括诸如阴极射线管(crt)、液晶显示器(lcd)等以及扬声器等的输出部分1207;包括硬盘等的存储部分1208;以及包括诸如lan卡、调制解调器等的网络接口卡的通信部分1209。通信部分1209经由诸如因特网的网络执行通信处理。驱动器1210也根据需要连接至i/o接口1205。可拆卸介
质1211,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1210上,以便于从其上读出的计算机程序根据需要被安装入存储部分1208。
[0189]
特别地,根据本发明公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分1209从网络上被下载和安装,和/或从可拆卸介质1211被安装。在该计算机程序被中央处理单元(cpu)1201执行时,执行本发明的系统中限定的上述功能。
[0190]
需要说明的是,本发明所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本发明中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本发明中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、rf等等,或者上述的任意合适的组合。
[0191]
附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
[0192]
描述于本发明实施例中所涉及到的模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的模块也可以设置在处理器中,例如,可以描述为:一种处理器包括请求接收模块、操作触发模块、数据传输模块。其中,这些模块的名称在某种情况下并不构成对该模块本身的限定,数据传输模块还可以被描述为“传输第一数据和/或第二数据的模块”。
[0193]
作为另一方面,本发明还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中。上述计算
机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该设备包括:
[0194]
接收消费者传输的数据获取请求,根据所述消费者的标识,确定与所述消费者相对应的分区,获取所述分区的第一偏移量;
[0195]
在所述分区中,获取与所述第一偏移量相对应的第一数据,并触发查询超时待确认重试队列中是否存在超时待确认消息的操作;
[0196]
若不存在,则传输所述第一数据至所述消费者;或
[0197]
若存在,则根据所述超时待确认消息中的第二偏移量,获取第二数据,传输所述第一数据和所述第二数据至所述消费者。
[0198]
根据本发明实施例的技术方案,相比现有技术,具有以下有益效果:
[0199]
1)将原有一个分区(或队列)仅对应一个消费者的思路,变更为多个消费者,以此提高对该分区(或队列)中数据的并发处理性能;
[0200]
2)新增偏移量锁文件,以保证对应于同一分区(或队列)的多个消费者可以并发获取偏移量信息,并达到获取数据不重复的效果;
[0201]
3)新增偏移量确认文件、超时确认扫描线程和超时待确认重试消息队列,以通过超时重试机制,保证异常未确认的数据不丢失,做到数据消费的不重不漏以及再消费;
[0202]
4)通过分区中分段和稀疏索引的方式,提高了数据定位的准确性和查询的效率;
[0203]
5)无需考虑扩容或修改分区(或队列)的大小,即可实现消费处理能力的水平扩展,降低了对手动扩容的依赖性,具有良好的维护性。
[0204]
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1