掌桥专利:专业的专利平台
掌桥专利
首页

一种基于kafka的堆积数据消费方法、终端设备及存储介质

文献发布时间:2023-06-19 16:11:11



技术领域

本发明涉及数据处理领域,尤其涉及一种基于kafka的堆积数据消费方法、终端设备及存储介质。

背景技术

Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写。Kafka是一种分布式的、基于发布或订阅的消息系统,以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间复杂度的访问性能和高吞吐率,即使在非常廉价的商用机器上也能做到单机支持每秒100K条以上消息的传输,支持Kafka Server间的消息分区及分布式消费,同时保证每个分区(Partition)内的消息顺序传输,同时支持离线数据处理和实时数据处理,它以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如Cloudera、Apache Storm、Spark、flink、spring等都支持与Kafka集成。

高吞吐率的kafka导致下游接入处理程序性能跟不上该吞吐的效率就会导致上下游数据堆积,java spring框架集成kafkaapi时只能根据topic分区的数量设置相应分区数的线程数去处理数据,单线程单分区的处理方式,如果系统遇上业务的高峰期则表现数据处理缓慢,消费不及时,导致业务不可估量的损失。具体不足如下:

1)下游消费能力不足时会导致数据堆积;

2)无法监测topic数据堆积时做出应对处理;

3)增加下游消费能力需要增加该topic的分区。

发明内容

为了解决上述问题,本发明提出了一种基于kafka的堆积数据消费方法、终端设备及存储介质。

具体方案如下:

一种基于kafka的堆积数据消费方法,包括以下步骤:

S1:在每个单位时间内轮询topic的每个分区下的最新偏移量和当前偏移量,计算最新偏移量与当前偏移量的差值并存储,根据最新偏移量与当前偏移量的差值与预设的最大消息堆积阈值的关系判断topic是否为延迟状态,并对处于延迟状态的topic进行标注;

S2:当接收到对topic的消费请求时,根据topic的标注情况判断topic是否处于延迟状态,如果是,进入S3;否则,正常消费;

S3:创建topic对应的多个下游topic,并将topic中堆积的待消费数据平均分发至所有下游topic内;

S4:查询每个下游topic的各分区对应的最新偏移量与当前偏移量,将各分区对应的最新偏移量与当前偏移量的差值作为各分区对应的剩余未消费偏移量;

S5:将总线程数与每个下游topic包含的分区个数的比值作为每个下游topic包含的各分区对应的消费线程数;

S6:将各分区剩余未消费偏移量与消费线程数的比值作为各分区对应的单个线程消费偏移量步长,将各分区剩余未消费偏移量按单个线程消费偏移量步长进行切分后,分配给各线程进行消费。

进一步的,设定最新偏移量与当前偏移量的差值大于最大消息堆积阈值的topic为处于延迟状态的topic。

进一步的,设定连续多个单位时间内的最新偏移量与当前偏移量的差值的均值或中位数的值大于最大消息堆积阈值的topic为处于延迟状态的topic。

进一步的,当正常消费时,还包括查询topic下是否包含下游topic,如果包含,则将所有下游topic进行删除。

进一步的,将topic中堆积的待消费数据平均分发至所有下游topic内的过程包括:将所有下游topic初始化为顺时针闭环,topic中堆积的待消费数据经过哈希一致性分发到各topic初始化的顺时针闭环内。

进一步的,消费线程数的数据格式采用java类型中int类型。

一种基于kafka的堆积数据消费终端设备,包括处理器、存储器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现本发明实施例上述的方法的步骤。

一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现本发明实施例上述的方法的步骤。

本发明采用如上技术方案,并具有有效效果:

1)弹性提升topic分区数且提升业务高峰期数据吞吐量。

2)自适应监控数据堆积情况并调整算法快速消费堆积数据,避免数据堆积对线上业务的影响。

3)可解决低资源环境下避免增加扩展kafka节点或者消费节点数据量消费堆积数据,提高数据吞吐能力。

附图说明

图1所示为本发明实施例一方法的流程图。

图2所示为该实施例中方法的流程示意图。

图3所示为该实施例中顺时针闭环模式下的下游topic示意图。

具体实施方式

为进一步说明各实施例,本发明提供有附图。这些附图为本发明揭露内容的一部分,其主要用以说明实施例,并可配合说明书的相关描述来解释实施例的运作原理。配合参考这些内容,本领域普通技术人员应能理解其他可能的实施方式以及本发明的优点。

现结合附图和具体实施方式对本发明进一步说明。

实施例一:

本发明实施例提供了一种基于kafka的堆积数据消费方法,如图1和图2所示,所述方法包括以下步骤:

S1:在每个单位时间内轮询topic的每个分区(Partition)下的最新偏移量(offset_latest)和当前偏移量(offset_current),计算最新偏移量与当前偏移量的差值并存储,根据最新偏移量与当前偏移量的差值与预设的最大消息堆积阈值的关系判断topic是否为延迟状态,并对处于延迟状态的topic进行标注。

该实例中设定最新偏移量与当前偏移量的差值大于最大消息堆积阈值的topic为处于延迟状态的topic。为了提高判断的准确度,进一步设定连续多个单位时间内(如连续三个单位时间内)的最新偏移量与当前偏移量的差值的均值或中位数的值大于最大消息堆积阈值的topic为处于延迟状态的topic。

单位时间和最大消息堆积阈值的大小本领域技术人员可以根据需求进行设定,在此不做限制。

S2:当接收到消费者(consumer)对topic的消费请求时,根据topic的标注情况判断topic是否处于延迟状态,如果是,进入S3;否则,正常消费。

进一步的,该实施例中当正常消费时(即topic不为延迟状态时),还包括查询topic下是否包含下游topic,如果包含,则将所有下游topic进行删除。

S3:创建topic对应的多个下游topic,并将topic中堆积的待消费数据平均分发至所有下游topic内。

该实施例中将topic中堆积的待消费数据平均分发至所有下游topic内的过程采用哈希(HASH)一致性算法,即将所有下游topic初始化为顺时针闭环,如图3所示,topic中堆积的待消费数据经过哈希一致性分发到各topic初始化的顺时针闭环内后,数据实现了平均分发。

创建的多个下游topic的具体数量本领域技术人员可以根据需求进行设定,通常至少包括两个,该实施例中设定为三个。

S4:查询每个下游topic的各分区对应的最新偏移量与当前偏移量,将各分区对应的最新偏移量与当前偏移量的差值作为各分区对应的剩余未消费偏移量offset_earliest。

S5:将总线程数T与每个下游topic包含的分区个数P的比值作为每个下游topic包含的各分区对应的消费线程数NT:NT=T/P。

消费线程数的取值为正整数,该实施例中采用java类型中int类型保证最终取值为正整数。消费线程数决定剩余未消费偏移量被切分的份数。

S6:将各分区剩余未消费偏移量offset_earliest与消费线程数NT的比值作为各分区对应的单个线程消费偏移量步长N,将各分区剩余未消费偏移量按单个线程消费偏移量步长N进行切分后,分配给各线程进行消费。

如线程1将消费当前偏移量至(N-1)偏移量数据,线程2将消费N至2N-1偏移量数据,以此类推。

下面以一个具体例子进行说明:

总线程数为T=120个,某个topic下有P=30个分区,每个分区下堆积有20w数据,当前偏移量offset_current为0,最新偏移量为200000,最新偏移量-当前偏移量得到堆积的偏移量为200000-0=200000。由T/P=NT得NT=120/30=4,200000/4=50000,得到单个分区下消费线程数为4个,单线程消费数据为5w,偏移量步长数据为50000,线程thread_0消费0至(50000-1)偏移量数据,thread_1消费50000至(100000-1)偏移量数据,以此类推,直至数据消费完成。

本发明实施例可以在kafka分布式下自适应根据topic分区下数据堆积监控,达到监控的阈值则触发本发明实施例方法,快速消费堆积的数据,当堆积数据低于阈值的1/3时则恢复正常消费程序,无需操作kafka服务层业务,可以自适应解决下游数据堆积问题。

采用本实施例方法后仅需引用jar包设置好初始化数据即可工作。相比扩展kafka节点、消费数据节点等常规措施更具优势,提升消费速度可达N*M*T的倍数增长,可以减少机器扩展、节点扩展、开发运维人员操作等工作量及成本。

实施例二:

本发明还提供一种基于kafka的堆积数据消费终端设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现本发明实施例一的上述方法实施例中的步骤。

进一步地,作为一个可执行方案,所述基于kafka的堆积数据消费终端设备可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。所述基于kafka的堆积数据消费终端设备可包括,但不仅限于,处理器、存储器。本领域技术人员可以理解,上述基于kafka的堆积数据消费终端设备的组成结构仅仅是基于kafka的堆积数据消费终端设备的示例,并不构成对基于kafka的堆积数据消费终端设备的限定,可以包括比上述更多或更少的部件,或者组合某些部件,或者不同的部件,例如所述基于kafka的堆积数据消费终端设备还可以包括输入输出设备、网络接入设备、总线等,本发明实施例对此不做限定。

进一步地,作为一个可执行方案,所称处理器可以是中央处理单元(CentralProcessing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital SignalProcessor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,所述处理器是所述基于kafka的堆积数据消费终端设备的控制中心,利用各种接口和线路连接整个基于kafka的堆积数据消费终端设备的各个部分。

所述存储器可用于存储所述计算机程序和/或模块,所述处理器通过运行或执行存储在所述存储器内的计算机程序和/或模块,以及调用存储在存储器内的数据,实现所述基于kafka的堆积数据消费终端设备的各种功能。所述存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据手机的使用所创建的数据等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如硬盘、内存、插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)、至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。

本发明还提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现本发明实施例上述方法的步骤。

所述基于kafka的堆积数据消费终端设备集成的模块/单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)以及软件分发介质等。

尽管结合优选实施方案具体展示和介绍了本发明,但所属领域的技术人员应该明白,在不脱离所附权利要求书所限定的本发明的精神和范围内,在形式上和细节上可以对本发明做出各种变化,均为本发明的保护范围。

相关技术
  • 一种基于kafka的堆积数据消费方法、终端设备及存储介质
  • 使用KAFKA的数据消费方法、装置、终端设备及介质
技术分类

06120114737304