CN115328664A - 一种消息消费方法、装置、设备及介质 - Google Patents
一种消息消费方法、装置、设备及介质 Download PDFInfo
- Publication number
- CN115328664A CN115328664A CN202211237370.8A CN202211237370A CN115328664A CN 115328664 A CN115328664 A CN 115328664A CN 202211237370 A CN202211237370 A CN 202211237370A CN 115328664 A CN115328664 A CN 115328664A
- Authority
- CN
- China
- Prior art keywords
- message
- target
- component
- partition
- preset
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/547—Remote procedure calls [RPC]; Web services
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/54—Indexing scheme relating to G06F9/54
- G06F2209/547—Messaging middleware
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/54—Indexing scheme relating to G06F9/54
- G06F2209/548—Queue
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- General Factory Administration (AREA)
Abstract
本申请公开了一种消息消费方法、装置、设备及介质,涉及智能平台技术领域,该方法包括:利用预设消费者组件从预设消息发布***中拉取第一目标消息,并将第一目标消息发送至第一目标消息所属的目标分区唯一对应的目标分区工作者组件;控制目标分区工作者组件利用预设的业务执行者组件对第一目标消息进行处理,并在第一目标消息处理完成后,将所述目标分区工作者组件的运行状态标记为完成状态,并记录所述目标分区工作者组件的位移量;当预设消费者组件监测到目标分区工作者组件的运行状态为完成状态,则获取目标分区工作者组件的位移量,将位移量手动提交至预设消息发布***。本发明自定义消费者类组件,实现消息处理与消息处理管理的解耦。
Description
技术领域
本发明涉及智能平台技术领域,特别涉及一种消息消费方法、装置、设备及介质。
背景技术
在日常的开发中,开发往往使用单线程去处理kafka(一种高吞吐量的分布式发布订阅消息***)的消息,在单线程中处理消息的好处是实现简单,位移的提交交由kafka管理(主动提交位移),但弊端也很明显,由于是单线程,消息处理的能力受到并发的限制,往往不能适用于大批量消息的处理场景。若在单线程拉取消息的前提下,使用多线程去处理消息,则使用主动提交位移会导致消息位移提交的不准确。所以在此基础上,提出,使用单线程拉取消息,多线程并行处理消息,并手动处理位移的提交。同样的,为了简化消息处理的逻辑,通常会在消费者拉取消息之后直接使用业务逻辑去处理消息,这样一来,消息的获取逻辑与业务的处理逻辑便糅合到了一起,两者便互相耦合了,在消息处理逻辑的变更的情况下,很有可能会导致原先的消息获取的逻辑被不小心改动,导致bug的产生。
由上可见,在消息消费过程中,如何避免出现由于单线程消息处理且消息的获取逻辑与业务的处理逻辑耦合性强导致主动提交位移时消息位移提交的不准确的情况是本领域有待解决的问题。
发明内容
有鉴于此,本发明的目的在于提供一种消息消费方法、装置、设备及介质,能够自定义消费者类组件,实现高吞吐量,手动提交位移,与业务低耦合,消息消费准确性高,消息处理逻辑与消息的处理管理解耦,多线程异步处理消息。其具体方案如下:
第一方面,本申请公开了一种消息消费方法,包括:
利用预设的消费者组件从预设消息发布***中拉取第一目标消息,并将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件;
控制所述目标分区工作者组件利用预设的业务执行者组件对所述第一目标消息进行处理;
在所述第一目标消息处理完成后,将所述目标分区工作者组件的运行状态标记为完成状态,并记录所述目标分区工作者组件的位移量;
当所述预设的消费者组件监测到所述目标分区工作者组件的运行状态为完成状态,则获取所述目标分区工作者组件的位移量,并将所述位移量手动提交至所述预设消息发布***。
可选的,所述将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件,包括:
确定所述第一目标消息的消息标识,并基于所述消息标识中的所述第一目标消息所属的目标主题与分区标识确定目标分区;
将所述第一目标消息发送至所述目标分区唯一对应的目标分区工作者组件。
可选的,所述将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件,包括:
将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件的消息队列中;
相应的,所述控制所述目标分区工作者组件利用预设的业务执行者组件对所述第一目标消息进行处理,并在所述第一目标消息处理结束后,将所述目标分区工作者组件的运行状态标记为完成状态,并记录所述目标分区工作者组件的位移量,包括:
控制所述目标分区工作者组件利用预设的业务执行者组件对所述消息队列中的第一目标消息进行处理,并在所述消息队列中全部消息处理完成后将所述目标分区工作者组件的运行状态标记为完成状态,并记录所述目标分区工作者组件的位移量。
可选的,所述控制所述目标分区工作者组件利用预设的业务执行者组件对所述消息队列中的第一目标消息进行处理,并在所述消息队列中全部消息处理完成后将所述目标分区工作者组件的运行状态标记为完成状态,并记录所述目标分区工作者组件的位移量,包括:
控制所述目标分区工作者组件调用预设的业务执行者组件中预先定义的第一方法对所述目标分区工作者组件对应的消息队列中的消息进行处理,并监测所述目标分区工作者组件对应的消息队列中是否存在未处理消息;
若所述目标分区工作者组件对应的消息队列中不存在未处理消息,则将所述目标分区工作者组件的运行状态标记为完成状态;
调用所述预设的业务执行者组件中预先定义的第二方法对目标功能接口进行调用,并记录所述目标分区工作者组件的位移量。
可选的,所述消息消费方法,还包括:
当所述预设的消费者组件监测到所述目标分区工作者组件的运行状态为未完成状态,则获取并记录所述目标分区工作者组件的位移量,并禁止执行所述将所述位移量手动提交至所述预设消息发布***的步骤。
可选的,所述利用预设的消费者组件从预设消息发布***中拉取第一目标消息,并将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件之后,还包括:
调用所述预设消息发布***中的预设应用程序编程接口控制所述预设的消费者组件下次拉取消息时跳过所述目标分区,以从所述目标分区的下一分区拉取消息;
相应的,所述在所述第一目标消息处理结束之后,还包括:
调用所述预设消息发布***中的预设应用程序编程接口控制所述预设的消费者组件从所述目标分区拉取第二目标消息,并将所述第二目标消息发送至所述第二目标消息所属的目标分区唯一对应的目标分区工作者组件。
可选的,所述控制所述预设的消费者组件从所述目标分区拉取第二目标消息,并将所述第二目标消息发送至所述第二目标消息所属的目标分区唯一对应的目标分区工作者组件,包括:
将所述目标分区中所述目标分区工作者组件的位移量的下一位置确定为目标消息拉取位置,并控制所述预设的消费者组件从所述目标消息拉取位置拉取第二目标消息,然后将所述第二目标消息发送至所述第二目标消息所属的目标分区唯一对应的目标分区工作者组件。
第二方面,本申请公开了一种消息消费装置,包括:
消息拉取模块,用于利用预设的消费者组件从预设消息发布***中拉取第一目标消息,并将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件;
分区工作者组件工作模块,用于控制所述目标分区工作者组件利用预设的业务执行者组件对所述第一目标消息进行处理,并在所述第一目标消息处理完成后,将所述目标分区工作者组件的运行状态标记为完成状态,并记录所述目标分区工作者组件的位移量;
位移量提交模块,用于当所述预设的消费者组件监测到所述目标分区工作者组件的运行状态为完成状态,则获取所述目标分区工作者组件的位移量,并将所述位移量手动提交至所述预设消息发布***。
第三方面,本申请公开了一种电子设备,包括:
存储器,用于保存计算机程序;
处理器,用于执行所述计算机程序,以实现前述的消息消费方法。
第四方面,本申请公开了一种计算机存储介质,用于保存计算机程序;其中,所述计算机程序被处理器执行时实现前述公开的消息消费方法的步骤。
本申请利用预设的消费者组件从预设消息发布***中拉取第一目标消息,并将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件;控制所述目标分区工作者组件利用预设的业务执行者组件对所述第一目标消息进行处理;在所述第一目标消息处理完成后,将所述目标分区工作者组件的运行状态标记为完成状态,并记录所述目标分区工作者组件的位移量;当所述预设的消费者组件监测到所述目标分区工作者组件的运行状态为完成状态,则获取所述目标分区工作者组件的位移量,并将所述位移量手动提交至所述预设消息发布***。这样一来,本发明通过将消费者类组件划分为消费者组件、分区工作者组件以及业务执行者组件,实现了消息处理逻辑与消息的处理管理解耦,多线程异步处理消息,实现了消息高吞吐量,手动提交位移,并且本发明与业务低耦合,消息消费准确性高。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请提供的一种消息消费方法流程图;
图2为本申请提供的一种消费者类组件工作结构示意图;
图3为本申请提供的一种具体的消息消费方法流程图;
图4为本申请提供的一种消息处理的结构示意图;
图5为本申请提供的一种消费者组件工作流程示意图
图6为本申请提供的一种消息消费装置结构示意图;
图7为本申请提供的一种电子设备结构图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
现有技术中采用单线程消息处理,且消息的获取逻辑与业务的处理逻辑耦合性强导致主动提交位移时消息位移提交的不准确且运行中易产生bug。本发明能够自定义消费者类组件,实现高吞吐量,手动提交位移,与业务低耦合,消息消费准确性高,消息处理逻辑与消息的处理管理解耦,多线程异步处理消息。
本发明实施例公开了一种消息消费方法,参见图1所述,该方法包括:
步骤S11:利用预设的消费者组件从预设消息发布***中拉取第一目标消息,并将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件。
本实施例中,所述利用预设的消费者组件从预设消息发布***中拉取第一目标消息,可以包括:利用预设的消费者组件从kafka中拉取第一目标消息;相应的,所述将所述位移量手动提交至所述预设消息发布***,可以包括:将所述位移量手动提交至kafka。也即,本实施例中所述预设消息发布***可以是kafka。
本实施例中将消息消费的消费者类组件分为三个组件执行,即消费者组件TurboKafkaConsumer(也可称为TurboKafka消费者)、分区工作者组件PartitionWorker(也可称为分区工作线程)、业务执行者组件BusinessExecutor(也可称为业务执行单元)。一个消费者类组件中包括一个consumer、多个PartitionWorker、还有一个对应的业务执行者组件BusinessExecutor。
具体的,消费者组件TurboKafkaConsumer主要职责为获取消息,并根据消息的所属分区,将其交由专属的分区工作线程处理该消息,同时根据消息处理线程的处理结果,来决定是否要提交该分区的位移。同时TurboKafkaConsumer会维护一个注册表,即由分区id与分区对应的PartitionWorker构成的注册表;PartitionWorker为分区消息的工作线程,每个分区均对应各自的PartitionWorker,PartitionWorker的数量取决于分区数量,具体用于处理分区的消息;BusinessExecutor为业务逻辑的抽象,用于连接具体业务功能的接口,业务在处理消息的时候只需要实现此接口,实现具体的消息处理逻辑即可。需要指出的是,BusinessExecutor是实现消息处理逻辑与消息处理管理的解耦的关键,通过这个接口的抽象便可实现消费者与业务逻辑的绑定。如图2为本申请提出的一种消费者类组件工作结构示意图,图中kafka与本发明中自定义消费者类组件即消费者组件TurboKafkaConsumer、分区工作者组件PartitionWorker、业务执行者组件BusinessExecutor相连,并且所述业务执行者组件BusinessExecutor与外部功能接口连接,与外部功能接口进行交互实现调用。
在具体的实施过程中,TurboKafkaConsumer类的主要作用是从kafka中拉取消息,获取消息之后会分为三步:(1)分发消息:每条消息都有其所属的分区的标记,所以在获取到消息之后便可以根据消息的分区将该消息投递到对应的PartitionWorker中,在这之后,会调用kafka的一个api,使得消费者下次拉取消息的时候路过当前处理的分区;(2)检查PartitionWorker的状态:检查在工作中的PartitionWorker的状态,若当前的PartitionWorker的状态为已完成状态,则获取其最新的位移并缓存,并恢复当前分区的消息的获取;(3)根据上一步缓存的分区的位移信息,手动提交分区的位移信息。
本实施例中,所述利用预设的消费者组件从预设消息发布***中拉取第一目标消息,并将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件之后,还包括:调用所述预设消息发布***中的预设应用程序编程接口控制所述预设的消费者组件下次拉取消息时跳过所述目标分区,以从所述目标分区的下一分区拉取消息;相应的,所述在所述第一目标消息处理结束之后,还包括:调用所述预设消息发布***中的预设应用程序编程接口控制所述预设的消费者组件从所述目标分区拉取第二目标消息,并将所述第二目标消息发送至所述第二目标消息所属的目标分区唯一对应的目标分区工作者组件。也即,所述预设的消费者组件在获取到消息之后便可以根据消息的分区将该消息投递到对应的PartitionWorker中,在这之后,会调用kafka的预设API,使得消费者下次拉取消息的时候路过当前处理的分区,当目标分区工作者组件对应的消息全部处理完毕后,这个API会允许消费者下次从目标分区拉取消息。
本实施例中的具体实施方式中,消费者在拉取第一目标消息,并将第一目标消息发送至目标分区工作者后,可以调用kafka的预设API将当前的消息拉取状态设置为禁止拉取状态,在目标分区工作者组件的运行状态为完成状态时会调用kafka的预设API将所述目标分区的消息拉取状态设置为允许拉取状态,此时会从目标分区开始拉取第二目标消息,开始新一轮的消息处理。
本步骤中完成的是上述利用TurboKafkaConsumer类从预设消息发布***中拉取消息,并对批量消息进行分发的过程。
步骤S12:控制所述目标分区工作者组件利用预设的业务执行者组件对所述第一目标消息进行处理,并在所述第一目标消息处理完成后,将所述目标分区工作者组件的运行状态标记为完成状态,并记录所述目标分区工作者组件的位移量。
本实施例的具体实施过程中,所述分区工作者组件PartitionWorker会利用预设的业务执行者组件BusinessExecutor对当前的消息进行处理,并标记自身运行状态,确定并记录所述目标分区工作者组件的位移量。
步骤S13:当所述预设的消费者组件监测到所述目标分区工作者组件的运行状态为完成状态,则获取所述目标分区工作者组件的位移量,并将所述位移量手动提交至所述预设消息发布***。
本实施例中,所述TurboKafkaConsumer会监测PartitionWorker的状态,当其监测到PartitionWorker的状态为完成状态时,则获取其最新的位移并缓存,并利用预设消息发布***中的预设API恢复当前分区的消息的获取。
本实施例中,所述的消息消费方法,还可以包括:当所述预设的消费者组件监测到所述目标分区工作者组件的运行状态为未完成状态,则获取并记录所述目标分区工作者组件的位移量,并禁止执行所述将所述位移量手动提交至所述预设消息发布***的步骤。
本实施例中,若所述TurboKafkaConsumer监测PartitionWorker的状态为未完成状态时,则也会获取并记录所述目标分区工作者组件的位移量,但不会执行所述将所述位移量手动提交至所述预设消息发布***的步骤,即仅将位移量进行记录,并不会手动提交。
本实施例中,所述控制所述预设的消费者组件从所述目标分区拉取第二目标消息,并将所述第二目标消息发送至所述第二目标消息所属的目标分区唯一对应的目标分区工作者组件,包括:将所述目标分区中所述目标分区工作者组件的位移量的下一位置确定为目标消息拉取位置,并控制所述预设的消费者组件从所述目标消息拉取位置拉取第二目标消息,然后将所述第二目标消息发送至所述第二目标消息所属的目标分区唯一对应的目标分区工作者组件。也即,所述预设消费者组件每次拉取消息时,会从当前分区对应的分区工作所所记录的位移量的下一位置进行拉取。拉取消息后,同样会将消息发送至对应的分区工作者组件,然后将对应的分区工作者组件的运行状态标记为未完成状态。
本实施例中,利用预设的消费者组件从预设消息发布***中拉取第一目标消息,并将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件;控制所述目标分区工作者组件利用预设的业务执行者组件对所述第一目标消息进行处理,并在所述第一目标消息处理完成后,将所述目标分区工作者组件的运行状态标记为完成状态,并记录所述目标分区工作者组件的位移量;当所述预设的消费者组件监测到所述目标分区工作者组件的运行状态为完成状态,则获取所述目标分区工作者组件的位移量,并将所述位移量手动提交至所述预设消息发布***。这样一来,本发明通过将消费者类组件划分为消费者组件、分区工作者组件以及业务执行者组件,实现了消息处理逻辑与消息的处理管理解耦,多线程异步处理消息,实现了消息高吞吐量,手动提交位移,并且本发明与业务低耦合,消息消费准确性高。
图3为本申请实施例提供的一种具体的消息消费方法流程图。参见图3所示,该方法包括:
步骤S21:利用预设的消费者组件从预设消息发布***中拉取第一目标消息,并确定所述第一目标消息的消息标识,然后基于所述消息标识中的所述第一目标消息所属的目标主题与分区标识确定目标分区,并将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件的消息队列中。
本实施例中,各个消息均包含其对应的消息标识,消息表示中包括消息所属主题(即topic),所属分区,本步骤中基于所属主题与所述分区的分区ID便可确定目标分区,并基于本地的注册表确定目标分区对应的目标工区工作者组件,然后将第一目标消息发送至所述目标工区工作者组件进行处理。
本实施例中,目标分区工作者组件ParitionWorker对第一目标消息进行处理。具体地,每一分区线程中的消息以队列形式进行存储,队列中的消息可以通过BusinessExecutor中定义的方法与外部功能接口进行交互实现调用。如图4为本申请提出的一种消息处理的结构示意图,即消费者将消息分发至分区工作线程,分区工作线程将接收到的消息存放至各自对应的消息队列中进行处理。
本实施例中,所述控制所述目标分区工作者组件利用预设的业务执行者组件对所述第一目标消息进行处理,并在所述第一目标消息处理结束后,将所述目标分区工作者组件的运行状态标记为完成状态,包括:控制所述目标分区工作者组件利用预设的业务执行者组件对所述消息队列中的第一目标消息进行处理,并在所述消息队列中全部消息处理完成后将所述目标分区工作者组件的运行状态标记为完成状态。也即,所述目标分区工作者组件处理消息时,会对当前对应的消息队列中的消息进行处理。
步骤S22:控制所述目标分区工作者组件调用预设的业务执行者组件中预先定义的第一方法对所述目标分区工作者组件对应的消息队列中的消息进行处理,并监测所述目标分区工作者组件对应的消息队列中是否存在未处理消息。
本实施例中,所述控制所述目标分区工作者组件调用预设的业务执行者组件中预先定义的第一方法对所述第一目标消息进行处理,可以包括:控制所述目标分区工作者组件调用预设的业务执行者组件中预先定义的第一方法从所述目标分区工作者组件对应的消息队列中确定待处理消息,并对所述待处理消息进行处理;在对所述待处理消息处理结束后,将当前所述待处理消息从所述消息队列中剔除,并重新确定待处理消息,然后执行所述对所述待处理消息进行处理的步骤。
在具体的实施过程中,BusinessExecutor定义了两个主要的方法,即第一方法execute(ConsumerRecord record)和第二方法afterExecute(),前者是用于处理具体的单条的消息的,后者是用于在处理完这些消息之后被执行的接口方法,业务在使用时只需在afterExecute中定义具体的业务逻辑。
在具体的实施过程中,PartitionWorker是实际处理消息的类,内部主要调用BusinessExecutor的两个方法,由于消费者单次拉取的消息会有很多,所以一个分区工作线程会对消息进行批处理,BusinessExecutor的execute方法在PartitionWorker批处理消息的循环中,每有一条消息就会被调用一次,会监测消息队列中是否还有未处理信息,当所有消息都被处理完之后,会调用BusinessExecutor的afterExecute方法,可以定义在所有消息都处理完之后的处理逻辑,当所有的消息都处理完毕之后,ParitionWorker的状态会标记成完成,并且记录当次消息处理的最新的位移。
步骤S23:若所述目标分区工作者组件对应的消息队列中不存在未处理消息,则将所述目标分区工作者组件的运行状态标记为完成状态。
本步骤中,当目标分区工作者组件对应的消息队列中不存在未处理信息时,表明消息队列中所有消息均已处理完成,则将所述目标分区工作者组件的运行状态标记为完成状态。
步骤S24:调用所述预设的业务执行者组件中预先定义的第二方法对目标功能接口进行调用,并记录所述目标分区工作者组件的位移量。
本实施例中,目标分区工作者组件将所述目标分区工作者组件的运行状态标记为完成状态后,会调用第二方法afterExecute,定义在所有消息都处理完之后的处理逻辑,主要用于对目标功能接口进行调用。
本发明实施例中,功能接口可以为用于实现时间记录功能的接口方法,此时通过本技术方案消费存储在在kafka中的时间数据。
调用目标功能接口后,目标分区工作者组件会记录所述目标分区工作者组件的位移量。
步骤S25:当所述预设的消费者组件监测到所述目标分区工作者组件的运行状态为完成状态,则获取所述目标分区工作者组件的位移量,并将所述位移量手动提交至所述预设消息发布***。
在本实施例中的一种具体的实施方式中,若一个kafka设有4个分区,则对应的自定义消费者类组件中则设有4个分区工作者组件PartitionWorker,若通过消费者组件一次性拉取800条消息,依照每条消息的消息结构存入对应的目标分区线程实现多线程并发处理时,分区0一次处理100条,分区1一次处理200条,分区2一次处理200条,分区3一次处理300条。每个分区存入消息后直至处理完毕前消费者组件不再从kafka拉取该分区的消息。每一分区的每一条消息通过业务处理单元的execute(ConsumerRecord record)方法实现与外部接口的功能调用,通过业务处理单元的afterExecute()方法实现在处理完这些消息之后被执行的接口方法。当所有的消息都处理完毕之后,对应分区的ParitionWorker的运行状态会标记成完成状态,并将相应分区的消息拉取状态置为允许拉取状态,以恢复当前分区的消息的获取,并且记录当次消息处理的最新的位移。
并且,消费者组件会定期检查各ParitionWorker的状态,如将分区0的运行状态标记为完成,记录位移量100条,恢复从kafka中拉取对应的分区0的消息;分区1未标记完成,记录位移量130条……此时消费者组件提交位移时,只上报处理完成的分区0,下一次拉取消息时,kafka的消息拉取则从分区0的第101条开始拉取数据,进行新一轮的消息处理。分配至各ParitionWorker的线程存有的消息通过不同的功能接口或流向不同的业务请求中,实现了消息和业务的解耦。
图5为本申请中提出的一种消费者组件工作流程示意图,图中由消费者组件向kafka拉取各分区的消息,并将消息转发至各分区对应的线程中进行处理,各个业务执行者并发持续地从与各线程对应的各个阻塞队列中执行消费。并且,预先设置的分区偏移管理中保存有各个分区的偏移信息,并向kafka提交偏移量。
本实施例中,通过自定义消费者类组件将kafka中拉取的数据经过不同的分区工作者进行处理,并通过不同的功能接口或流向不同的业务请求中,实现了消息和业务的解耦,并在此同时实现了多线程异步处理消息下的高吞吐量,并且本方法中消息消费准确性更高。
参见图6所示,本申请实施例公开了一种消息消费装置,具体可以包括:
消息拉取模块11,用于利用预设的消费者组件从预设消息发布***中拉取第一目标消息,并将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件;
分区工作者组件工作模块12,用于控制所述目标分区工作者组件利用预设的业务执行者组件对所述第一目标消息进行处理,并在所述第一目标消息处理完成后,将所述目标分区工作者组件的运行状态标记为完成状态,并记录所述目标分区工作者组件的位移量;
位移量提交模块13,用于当所述预设的消费者组件监测到所述目标分区工作者组件的运行状态为完成状态,则获取所述目标分区工作者组件的位移量,并将所述位移量手动提交至所述预设消息发布***。
本申请利用预设的消费者组件从预设消息发布***中拉取第一目标消息,并将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件;控制所述目标分区工作者组件利用预设的业务执行者组件对所述第一目标消息进行处理,并在所述第一目标消息处理完成后,将所述目标分区工作者组件的运行状态标记为完成状态,并记录所述目标分区工作者组件的位移量;当所述预设的消费者组件监测到所述目标分区工作者组件的运行状态为完成状态,则获取所述目标分区工作者组件的位移量,并将所述位移量手动提交至所述预设消息发布***。这样一来,本发明通过将消费者类组件划分为消费者组件、分区工作者组件以及业务执行者组件,实现了消息处理逻辑与消息的处理管理解耦,多线程异步处理消息,实现了消息高吞吐量,手动提交位移,并且本发明与业务低耦合,消息消费准确性高。
进一步的,本申请实施例还公开了一种电子设备,图7是根据示例性实施例示出的电子设备20结构图,图中的内容不能认为是对本申请的使用范围的任何限制。
图7为本申请实施例提供的一种电子设备20的结构示意图。该电子设备20,具体可以包括:至少一个处理器21、至少一个存储器22、电源23、显示屏24、输入输出接口25、通信接口26和通信总线27。其中,所述存储器22用于存储计算机程序,所述计算机程序由所述处理器21加载并执行,以实现前述任一实施例公开的消息消费方法中的相关步骤。另外,本实施例中的电子设备20具体可以为电子计算机。
本实施例中,电源23用于为电子设备20上的各硬件设备提供工作电压;通信接口26能够为电子设备20创建与外界设备之间的数据传输通道,其所遵循的通信协议是能够适用于本申请技术方案的任意通信协议,在此不对其进行具体限定;输入输出接口25,用于获取外界输入数据或向外界输出数据,其具体的接口类型可以根据具体应用需要进行选取,在此不进行具体限定。
另外,存储器22作为资源存储的载体,可以是只读存储器、随机存储器、磁盘或者光盘等,其上所存储的资源可以包括操作***221、计算机程序222及虚拟机数据223等,虚拟机数据223可以包括各种各样的数据。存储方式可以是短暂存储或者永久存储。
其中,操作***221用于管理与控制电子设备20上的各硬件设备以及计算机程序222,其可以是Windows Server、Netware、Unix、Linux等。计算机程序222除了包括能够用于完成前述任一实施例公开的由电子设备20执行的消息消费方法的计算机程序之外,还可以进一步包括能够用于完成其他特定工作的计算机程序。
进一步的,本申请还公开了一种计算机可读存储介质,这里所说的计算机可读存储介质包括随机存取存储器(Random Access Memory,RAM)、内存、只读存储器(Read-OnlyMemory,ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、磁碟或者光盘或技术领域内所公知的任意其他形式的存储介质。其中,所述计算机程序被处理器执行时实现前述公开的消息消费方法。关于该方法的具体步骤可以参考前述实施例中公开的相应内容,在此不再进行赘述。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上对本发明所提供的消息消费方法、装置、设备、存储介质进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (10)
1.一种消息消费方法,其特征在于,包括:
利用预设的消费者组件从预设消息发布***中拉取第一目标消息,并将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件;
控制所述目标分区工作者组件利用预设的业务执行者组件对所述第一目标消息进行处理;
在所述第一目标消息处理完成后,将所述目标分区工作者组件的运行状态标记为完成状态,并记录所述目标分区工作者组件的位移量;
当所述预设的消费者组件监测到所述目标分区工作者组件的运行状态为完成状态,则获取所述目标分区工作者组件的位移量,并将所述位移量手动提交至所述预设消息发布***。
2.根据权利要求1所述的消息消费方法,其特征在于,所述将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件,包括:
确定所述第一目标消息的消息标识,并基于所述消息标识中的所述第一目标消息所属的目标主题与分区标识确定目标分区;
将所述第一目标消息发送至所述目标分区唯一对应的目标分区工作者组件。
3.根据权利要求1所述的消息消费方法,其特征在于,所述将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件,包括:
将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件的消息队列中;
相应的,所述控制所述目标分区工作者组件利用预设的业务执行者组件对所述第一目标消息进行处理,并在所述第一目标消息处理结束后,将所述目标分区工作者组件的运行状态标记为完成状态,并记录所述目标分区工作者组件的位移量,包括:
控制所述目标分区工作者组件利用预设的业务执行者组件对所述消息队列中的第一目标消息进行处理,并在所述消息队列中全部消息处理完成后将所述目标分区工作者组件的运行状态标记为完成状态,并记录所述目标分区工作者组件的位移量。
4.根据权利要求3所述的消息消费方法,其特征在于,所述控制所述目标分区工作者组件利用预设的业务执行者组件对所述消息队列中的第一目标消息进行处理,并在所述消息队列中全部消息处理完成后将所述目标分区工作者组件的运行状态标记为完成状态,并记录所述目标分区工作者组件的位移量,包括:
控制所述目标分区工作者组件调用预设的业务执行者组件中预先定义的第一方法对所述目标分区工作者组件对应的消息队列中的消息进行处理,并监测所述目标分区工作者组件对应的消息队列中是否存在未处理消息;
若所述目标分区工作者组件对应的消息队列中不存在未处理消息,则将所述目标分区工作者组件的运行状态标记为完成状态;
调用所述预设的业务执行者组件中预先定义的第二方法对目标功能接口进行调用,并记录所述目标分区工作者组件的位移量。
5.根据权利要求1所述的消息消费方法,其特征在于,还包括:
当所述预设的消费者组件监测到所述目标分区工作者组件的运行状态为未完成状态,则获取并记录所述目标分区工作者组件的位移量,并禁止执行所述将所述位移量手动提交至所述预设消息发布***的步骤。
6.根据权利要求1至5任一项所述的消息消费方法,其特征在于,所述利用预设的消费者组件从预设消息发布***中拉取第一目标消息,并将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件之后,还包括:
调用所述预设消息发布***中的预设应用程序编程接口控制所述预设的消费者组件下次拉取消息时跳过所述目标分区,以从所述目标分区的下一分区拉取消息;
相应的,所述在所述第一目标消息处理结束之后,还包括:
调用所述预设消息发布***中的预设应用程序编程接口控制所述预设的消费者组件从所述目标分区拉取第二目标消息,并将所述第二目标消息发送至所述第二目标消息所属的目标分区唯一对应的目标分区工作者组件。
7.根据权利要求6所述的消息消费方法,其特征在于,所述控制所述预设的消费者组件从所述目标分区拉取第二目标消息,并将所述第二目标消息发送至所述第二目标消息所属的目标分区唯一对应的目标分区工作者组件,包括:
将所述目标分区中所述目标分区工作者组件的位移量的下一位置确定为目标消息拉取位置,并控制所述预设的消费者组件从所述目标消息拉取位置拉取第二目标消息,然后将所述第二目标消息发送至所述第二目标消息所属的目标分区唯一对应的目标分区工作者组件。
8.一种消息消费装置,其特征在于,包括:
消息拉取模块,用于利用预设的消费者组件从预设消息发布***中拉取第一目标消息,并将所述第一目标消息发送至所述第一目标消息所属的目标分区唯一对应的目标分区工作者组件;
分区工作者组件工作模块,用于控制所述目标分区工作者组件利用预设的业务执行者组件对所述第一目标消息进行处理,并在所述第一目标消息处理完成后,将所述目标分区工作者组件的运行状态标记为完成状态,并记录所述目标分区工作者组件的位移量;
位移量提交模块,用于当所述预设的消费者组件监测到所述目标分区工作者组件的运行状态为完成状态,则获取所述目标分区工作者组件的位移量,并将所述位移量手动提交至所述预设消息发布***。
9.一种电子设备,其特征在于,包括处理器和存储器;其中,所述处理器执行所述存储器中保存的计算机程序时实现如权利要求1至7任一项所述的消息消费方法。
10.一种计算机可读存储介质,其特征在于,用于存储计算机程序;其中,所述计算机程序被处理器执行时实现如权利要求1至7任一项所述的消息消费方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211237370.8A CN115328664B (zh) | 2022-10-11 | 2022-10-11 | 一种消息消费方法、装置、设备及介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211237370.8A CN115328664B (zh) | 2022-10-11 | 2022-10-11 | 一种消息消费方法、装置、设备及介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115328664A true CN115328664A (zh) | 2022-11-11 |
CN115328664B CN115328664B (zh) | 2023-03-24 |
Family
ID=83914829
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211237370.8A Active CN115328664B (zh) | 2022-10-11 | 2022-10-11 | 一种消息消费方法、装置、设备及介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115328664B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116643870A (zh) * | 2023-07-24 | 2023-08-25 | 北方健康医疗大数据科技有限公司 | 一种长时任务分发处理方法、***、装置及可读存储介质 |
CN117290122A (zh) * | 2023-02-28 | 2023-12-26 | 北京荣大科技股份有限公司 | 一种基于Kafka的多环境有序性生产消费的方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20180217882A1 (en) * | 2017-01-27 | 2018-08-02 | International Business Machines Corporation | Batch processing of messages |
CN108874562A (zh) * | 2018-06-21 | 2018-11-23 | 北京顺丰同城科技有限公司 | 分布式高并发消息队列推送*** |
CN111078422A (zh) * | 2019-11-19 | 2020-04-28 | 泰康保险集团股份有限公司 | 消息处理方法、消息处理装置、可读存储介质、电子设备 |
CN111314422A (zh) * | 2020-01-17 | 2020-06-19 | 平安医疗健康管理股份有限公司 | 基于kafka的消息处理方法、***、存储介质及计算机设备 |
US20210064450A1 (en) * | 2019-08-30 | 2021-03-04 | Chicago Mercantile Exchange Inc. | Distributed threaded streaming platform reader |
-
2022
- 2022-10-11 CN CN202211237370.8A patent/CN115328664B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20180217882A1 (en) * | 2017-01-27 | 2018-08-02 | International Business Machines Corporation | Batch processing of messages |
CN108874562A (zh) * | 2018-06-21 | 2018-11-23 | 北京顺丰同城科技有限公司 | 分布式高并发消息队列推送*** |
US20210064450A1 (en) * | 2019-08-30 | 2021-03-04 | Chicago Mercantile Exchange Inc. | Distributed threaded streaming platform reader |
CN111078422A (zh) * | 2019-11-19 | 2020-04-28 | 泰康保险集团股份有限公司 | 消息处理方法、消息处理装置、可读存储介质、电子设备 |
CN111314422A (zh) * | 2020-01-17 | 2020-06-19 | 平安医疗健康管理股份有限公司 | 基于kafka的消息处理方法、***、存储介质及计算机设备 |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117290122A (zh) * | 2023-02-28 | 2023-12-26 | 北京荣大科技股份有限公司 | 一种基于Kafka的多环境有序性生产消费的方法 |
CN116643870A (zh) * | 2023-07-24 | 2023-08-25 | 北方健康医疗大数据科技有限公司 | 一种长时任务分发处理方法、***、装置及可读存储介质 |
CN116643870B (zh) * | 2023-07-24 | 2023-11-10 | 北方健康医疗大数据科技有限公司 | 一种长时任务分发处理方法、***、装置及可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN115328664B (zh) | 2023-03-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN115328664B (zh) | 一种消息消费方法、装置、设备及介质 | |
US9740522B2 (en) | Controlled interruption and resumption of batch job processing | |
CN106844198B (zh) | 一种分布式调度自动化测试平台及方法 | |
US9135093B2 (en) | Event-driven approach for collecting monitoring data of messaging systems | |
CN101645022B (zh) | 用于多个集群的作业调度管理***及方法 | |
CN103425462B (zh) | 一种工作流数据持久化的方法和装置 | |
US8538793B2 (en) | System and method for managing real-time batch workflows | |
CN111258565B (zh) | 小程序的生成方法、***、服务器及存储介质 | |
CN110716793B (zh) | 一种分布式事务的执行方法、装置、设备及存储介质 | |
US8769086B2 (en) | Component independent process integration message monitoring | |
CN107908488B (zh) | 消息请求接***互方法、装置、计算机设备及存储介质 | |
CN113254010A (zh) | 一种可视化dag工作流任务调度***及其运行方法 | |
CN113760716A (zh) | 接口测试的方法和工具、服务编排流程引擎及存储介质 | |
CN113032125A (zh) | 作业调度方法、装置、计算机***和计算机可读存储介质 | |
US20100274621A1 (en) | Method and System for Integration of Systems Management with Project and Portfolio Management | |
JP4516594B2 (ja) | メッセージ送信制御方法、メッセージ送信制御装置、及びメッセージ送信制御プログラム | |
CN115984022B (zh) | 分布式支付***统一对账方法和装置 | |
CN103914286A (zh) | 用户界面中标签页的管理方法和管理器 | |
CN107741885B (zh) | 基于cs架构的事务与业务关联方法、关联*** | |
CN107911442B (zh) | 接收响应接***互方法、装置、计算机设备及存储介质 | |
CN107329819A (zh) | 一种作业管理方法及装置 | |
EP4024761A1 (en) | Communication method and apparatus for multiple management domains | |
CN114371874A (zh) | 一种物联网设备的配置方法、***、装置及介质 | |
CN112416980A (zh) | 数据业务处理方法、装置及设备 | |
CN112732415B (zh) | 基于资源交换代理***的事务处理方法、装置和设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |