CN110213371B - 消息消费方法、装置、设备及计算机存储介质 - Google Patents
消息消费方法、装置、设备及计算机存储介质 Download PDFInfo
- Publication number
- CN110213371B CN110213371B CN201910479100.XA CN201910479100A CN110213371B CN 110213371 B CN110213371 B CN 110213371B CN 201910479100 A CN201910479100 A CN 201910479100A CN 110213371 B CN110213371 B CN 110213371B
- Authority
- CN
- China
- Prior art keywords
- message
- consumption
- thread
- queue
- current
- 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.)
- Active
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/10—Protocols in which an application is distributed across nodes in the network
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/50—Network services
- H04L67/51—Discovery or management thereof, e.g. service location protocol [SLP] or web services
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
- Debugging And Monitoring (AREA)
- Financial Or Insurance-Related Operations Such As Payment And Settlement (AREA)
Abstract
本发明公开了一种消息消费方法,涉及金融科技领域,该方法包括:获取分布式协调服务zookeeper的服务注册目录中的目标节点,并基于所述目标节点监听预设数量的消息队列,确定各所述消息队列中是否存在首次监听的新消息队列;若存在首次监听的新消息队列,则依次遍历所述新消息队列中的消息,获取当前遍历的当前消息,并基于预设特征识别算法确定所述当前消息对应的目标线程;将所述当前消息传递至所述目标线程进行消费,直至所述新消息队列中的消息遍历完成。本发明还公开了一种消息消费装置、设备和一种计算机存储介质。本发明解决了如何实现高并发高可用的消息有序消费的技术问题。
Description
技术领域
本发明涉及金融科技(Fintech)的大数据技术领域,尤其涉及消息消费方法、装置、设备及计算机存储介质。
背景技术
随着计算机技术的发展,越来越多的技术(大数据、分布式、区块链Blockchain、人工智能等)应用在金融领域,传统金融业正在逐步向金融科技(Fintech)转变,但由于金融行业的安全性、实时性要求,也对技术提出了更高的要求。而目前在大数据统计过程中,针对大数据量的数据进行消息的产生、消息的消费,其中,消息的产生是由消息生产者将消息传输给消息服务器的,消息的消费是由消费者线程对消息服务器的消息进行的消费操作。
在消息的消费过程中,现有技术一般存在单线程消费和多线程消费,单线程消费是采用单一线程监听消息队列,消费线程一旦获取到一个新的消息,需要完成将这个消息投递到所有本地其它服务的过程后,才能进行下一个消息的消费,但是这个方式在性能方面存在严重的缺陷。多线程消费是采用多线程同时监听同一个消息队列,只要队列中出现新的消息,就会有随机的线程去获取,进而独立完成向本地其它服务的投递过程,但是这个方式无法保障消息被消费的有序性,且在对消息状态迁移的有序性有需求的场景下无法适用,对消息消费的可用范围造成很大的影响,使得可用范围变小。因此,如何实现高并发高可用的消息有序消费成为了目前亟待解决的技术问题。
发明内容
本发明的主要目的在于提出一种消息消费方法、装置、设备及计算机存储介质,旨在解决如何实现高并发高可用的消息有序消费的技术问题。
为实现上述目的,本发明提供一种消息消费方法,所述消息消费方法包括如下步骤:
获取分布式协调服务zookeeper的服务注册目录中的目标节点,并基于所述目标节点监听预设数量的消息队列,确定各所述消息队列中是否存在首次监听的新消息队列;
若存在首次监听的新消息队列,则依次遍历所述新消息队列中的消息,获取当前遍历的当前消息,并基于预设特征识别算法确定所述当前消息对应的目标线程;
将所述当前消息传递至所述目标线程进行消费,直至所述新消息队列中的消息遍历完成。
可选地,所述基于预设特征识别算法确定所述当前消息对应的目标线程的步骤,包括:
在所述当前消息对应的顶层接口接收所述当前消息对应的特征信息,并基于预设特征识别算法识别所述当前消息中的特征信息;
根据所述特征信息确定所述当前消息对应的目标线程。
可选地,所述根据所述特征信息确定所述当前消息对应的目标线程的步骤,包括:
获取所述目标节点对应的线程池,根据所述线程池的容量和所述特征信息做取余操作,在所述线程池中获取具有取余结果标记的第一线程,并检测所述第一线程是否处于异常状态;
若所述第一线程处于异常状态,则启用所述线程池中的备用线程,并将所述备用线程作为所述当前消息对应的目标线程;
若所述第一线程处于正常状态,则将所述第一线程作为所述当前消息对应的目标线程。
可选地,所述确定各所述消息队列中是否存在首次监听的新消息队列的步骤之后,包括:
若不存在首次监听的新消息队列,则检测各所述消息队列中是否存在新消息节点;
若存在新消息节点,则获取所述新消息节点中的新消息,并将所述新消息传递至所述新消息节点对应的第二线程进行消费。
可选地,所述将所述新消息传递至所述新消息对应的第二线程进行消费的步骤之后,包括:
获取zookeeper中的总消息队列,并定时确定所述总消息队列中的各消息节点中,是否存在消费完成的已消费消息节点,其中,所述总消息队列包括消息队列;
若存在,则提取所述已消费消息节点中的重要信息进行保存,并清理所述总消息队列中的已消费消息节点。
可选地,所述将所述当前消息传递至所述目标线程进行消费的步骤之后,包括:
检测所述当前消息在所述目标线程中是否消费成功;
若所述当前消息在所述目标线程中未消费成功,则获取所述当前消息对应的描述version值,并根据所述version值进行补偿消费。
可选地,所述version值包括本地version值和队列version值,所述获取所述当前消息对应的version值,并根据所述version值进行补偿消费的步骤包括:
获取所述当前消息在所述消息队列中的队列version值,和所述当前消息在所述zookeeper中的本地version值,并计算所述本地version值和所述队列version值之间的差值是否大于预设值;
若所述本地version值和所述队列version值之间的差值大于预设值,则根据所述差值对所述当前消息进行补偿消费。
此外,为实现上述目的,本发明还提供一种消息消费装置,所述消息消费装置包括:
获取模块,用于获取zookeeper服务注册目录中的目标节点,并基于所述目标节点监听预设数量的消息队列,确定各所述消息队列中是否存在首次监听的新消息队列;
确定模块,用于若存在首次监听的新消息队列,则依次遍历所述新消息队列中的消息,获取当前遍历的当前消息,并基于预设特征识别算法确定所述当前消息对应的目标线程;
传递模块,用于将所述当前消息传递至所述目标线程进行消费,直至所述新消息队列中的消息遍历完成。
此外,为实现上述目的,本发明还提供一种消息消费设备,所述消息消费设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的消息消费程序,所述消息消费程序被所述处理器执行时实现如上所述的消息消费方法的步骤。
此外,为实现上述目的,本发明还提供一种计算机存储介质,所述计算机存储介质上存储有消息消费程序,所述消息消费程序被处理器执行时实现如上所述的消息消费方法的步骤。
本发明通过获取zookeeper的服务注册目录中的目标节点,并基于所述目标节点监听预设数量的消息队列,确定各所述消息队列中是否存在首次监听的新消息队列;若存在首次监听的新消息队列,则依次遍历所述新消息队列中的消息,获取当前遍历的当前消息,并基于预设特征识别算法确定所述当前消息对应的目标线程;将所述当前消息传递至所述目标线程进行消费,直至所述新消息队列中的消息遍历完成。通过根据zookeeper中的目标节点来监听预设数量的消息队列,并在发现存在首次监听的新消息队列时,会依次对新消息队列中的消息进行遍历消费,从而保障了消息被有序的消费,让消息被消费的顺序与其在队列中的顺序一致,并且由于是先根据消息来确定目标线程,然后将消息传递到目标线程进行消费的,从而也实现了高并发高可用的消息有序消费的效果。
附图说明
图1是本发明实施例方案涉及的硬件运行环境的设备结构示意图;
图2为本发明消息消费方法第一实施例的流程示意图;
图3为本发明消息消费装置的装置模块示意图;
图4为本发明消息消费方法中zookeeper的节点结构示意图;
图5为本发明消息消费方法中消息流转流程图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
如图1所示,图1是本发明实施例方案涉及的硬件运行环境的设备结构示意图。
本发明实施例消息消费设备可以是PC机或服务器设备,其上运行有Java虚拟机。
如图1所示,该消息消费设备可以包括:处理器1001,例如CPU,网络接口1004,用户接口1003,存储器1005,通信总线1002。其中,通信总线1002用于实现这些组件之间的连接通信。用户接口1003可以包括显示屏(Display)、输入单元比如键盘(Keyboard),可选用户接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如WI-FI接口)。存储器1005可以是高速RAM存储器,也可以是稳定的存储器(non-volatile memory),例如磁盘存储器。存储器1005可选的还可以是独立于前述处理器1001的存储装置。
本领域技术人员可以理解,图1中示出的设备结构并不构成对设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
如图1所示,作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及消息消费程序。
在图1所示的设备中,网络接口1004主要用于连接后台服务器,与后台服务器进行数据通信;用户接口1003主要用于连接客户端(用户端),与客户端进行数据通信;而处理器1001可以用于调用存储器1005中存储的消息消费程序,并执行下述消息消费方法中的操作。
基于上述硬件结构,提出本发明消息消费方法实施例。
参照图2,图2为本发明消息消费方法第一实施例的流程示意图,所述方法包括:
步骤S10,获取分布式协调服务zookeeper的服务注册目录中的目标节点,并基于所述目标节点监听预设数量的消息队列,确定各所述消息队列中是否存在首次监听的新消息队列;
Zookeeper(分布式协调服务),即一个开源的分布式协调服务。分布式应用程序可以基于Zookeeper实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。消息队列可以为存储机制负责消息的有序存放。新消息队列可以是在当前时刻之前没有被临时节点对应的消息消费者所监听的消息队列,而消息消费者则可以作为客户端负责从消息服务器获取消息,消息服务器是作为服务端提供消息核心服务。目标节点可以是消息消费者在zookeeper的服务注册目录下创建的代表自身的节点,并且目标节点的类型可以有多种,在本实施例中仅以目标节点为临时节点为例进行说明,但不代表目标节点只局限于临时节点这一种类型的节点。
本实施例通过在zookeeper下建立目录来作为消息队列,并利用zookeeper提供的监听机制来实现消息的广播机制。并且每个消息消费者在初始化阶段,均会在zookeeper的服务注册目录下建立一个代表自身的临时节点(即目标节点),因此需要先获取zookeeper的服务注册目录中的临时节点(临时节点在消息消费者与zookeeper失去联接后会自动删除),并根据该临时节点来监听预设数量(用户提前设置的任意数量,可以是一个,也可以是多个)的消息队列,以确定在监听的各个消息队列中是否存在首次监听的新消息队列,若存在首次监听的新消息队列时,则消息消费者会获取该队列中现存的所有消息并按顺序进行消费。若不存在首次监听的新消息队列,则会继续检测在被监听的消息队列中是否存在新的消息节点生成,并根据检测结果执行不同的操作。
其中,当获取到的临时节点存在多个时,则可以分别根据各个临时节点来监听不同的消息队列,也就是可以同时让各个临时节点监听各自对应的消息队列。例如,如图4所示,当在zookeeper的服务注册目录中的临时节点存在3个时,即服务1、服务2、服务3,并且消息队列存在两个时,即队列1和队列2,在队列1中包括消息1、消息2、消息3和消息4,在队列2中同样也包括有消息1、消息2、消息3和消息4。假设服务1和服务2均需要监听队列1中的消息1时,可以让服务1和服务2同时获取队列1中的消息1进行消费,并在消费完成后,会在消息1下面的子节点生成临时子节点服务1和服务2,假设服务2除了在队列1中的消息1进行监听外,还对队列1中的消息2和队列2中的消息1进行监听时,同样的,在消息消费完成后,分别在队列1中的消息2和队列2的消息1的子节点生成临时子节点服务1。
需要说明的是,在zookeeper中的节点可以划分为四种节点类型,分别是持久节点、持久顺序节点、临时节点和临时顺序节点。其中,持久节点在创建后,会一直存在,直到有删除操作来主动清除这个节点,而在本实施例中,消息队列所在的目录就可以采用此节点。持久顺序节点的基本特性和持久节点是一致的,相对于持久节点,持久顺序节点额外的特性是每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序,而在本实施例中可以利用此节点,实现消息体的承载,并利用其天然的有序性来实现消息在队列中的有序存放,其中,消息体可以是作为载体承载消息的内容,一般为根据协议进行编码的数据包。临时节点在客户端和zookeeper失去连接后会自动删除,在本实施例中可以利用此节点的自动清除功能,来保证发生异常的消费者不会影响消息的清理,减少消息的堆积。临时顺序节点的基本特性和临时节点是一致的,相对于临时节点,临时顺序节点额外的特性是每个父节会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序,在本实施例中可以利用该节点来实现分布式的锁,消息生产者(即为客户端负责将消息传输给消息服务器)能够通过创建这种节点来实现对同一个锁的排队机制,并在锁获得释放的时候被实时通知。
步骤S20,若存在首次监听的新消息队列,则依次遍历所述新消息队列中的消息,获取当前遍历的当前消息,并基于预设特征识别算法确定所述当前消息对应的目标线程;
当前消息可以是新消息队列中正在遍历的消息。线程可以是操作系统能够进行运算调度的最小单位。当经过判断发现存在首次监听的消息队列时,则可以依次遍历新消息队列中的各个消息,并在各个消息中获取当前遍历的当前消息,然后在根据预设的特征识别算法来确定当前消息对应的目标线程。需要说明的是,若存在首次监听的新消息队列存在两个及两个以上时,则可以同时对各个新消息队列分别进行遍历,以进行消息的消费。
其中,特征识别算法是为了确保同一类别的消息能够在本地被分发到同一线程进行有序消费。用户在定义消息时,可以选择消息中的部分字段作为特征识别的基础,若这些字段的值是一致的,则可以认为是同一类型的消息,也就是需要对每一种类型的消息赋予一个确保不会重复的数字来作为特征信息。当消息消费者在接收到消息时,将会读取该特征信息,并根据本地消费线程池的容量来做取余操作,将消息置入取余结果标记的线程中。其中,特征识别算法将结合线程池当前的异常监测结果,在线程处理顺序得懂啊同步的前提下,调整线程的标记,以防止某个种类消息数量达到峰值是消费延时过大。
步骤S30,将所述当前消息传递至所述目标线程进行消费,直至所述新消息队列中的消息遍历完成。
当获取到目标线程后,则可以直接将当前消息传递到目标线程以进行消费,并且在当前消息通过目标线程进行消费时,消息消费者会有单独的监控线程,去轮询每个分发线程的健壮性,如果发现某个线程处于异常状态,会立即启用备用线程,从而保证消费的稳定性。并在当前消息在目标线程中消费完成后,会继续对新消息队列中的各个消息进行遍历,直到各个消息遍历完成。
为了辅助理解对消息的消费,下面进行举例说明。
例如,如图5所示,当消息生产者(例如与银行等金融机构有业务交互的业务方,其中,业务包括但不限于贷款业务、存款业务等)在zookeeper的目录下建立消息节点来往对应的消息队列发送消息时,会触发zookeeper的监听机制,zookeeper会向监听该目录的所有消息消费者发送通知,消息消费者(如银行等金融机构)在接收到通知后,会根据通知的内容来获取消息节点中的消息。其中,由于消息消费者是通过一个有序的线程池管理所有负责本地分发消息的线程,因此,在收到消息时,会根据特征识别算法来解析该消息的特征,并结合线程池的大小,判定该消息应当进入哪个分发线程,以保证特征相同的消息总能被有序的消费。并且消息消费者会有单独的监控线路来检测每个分发线程,假设线程池中存在消费线程1、消费线程2、消费线程3和消费线程4,并且此时消息消费者通过监控器监测线程池中各个消费线程,以后获取监测信息,并根据监测信息发现消费线程4处于异常状态时,会立即启用备用线程,也就是在备用线程1和备用线程2中选择备用线程1和消费线程4进行异常切换。其中,在zookeeper中会定时对各个消息节点进行检测,并在确定有消息节点已被所有消息消费者消费后,则可以对该消息节点中的消息进行消息清理。
本实施例通过获取zookeeper的服务注册目录中的目标节点,并基于所述目标节点监听预设数量的消息队列,确定各所述消息队列中是否存在首次监听的新消息队列;若存在首次监听的新消息队列,则依次遍历所述新消息队列中的消息,获取当前遍历的当前消息,并基于预设特征识别算法确定所述当前消息对应的目标线程;将所述当前消息传递至所述目标线程进行消费,直至所述新消息队列中的消息遍历完成。通过根据zookeeper中的目标节点来监听预设数量的消息队列,并在发现存在首次监听的新消息队列时,会依次对新消息队列中的消息进行遍历消费,从而保障了消息被有序的消费,让消息被消费的顺序与其在队列中的顺序一致,并且由于是先根据消息来确定目标线程,然后将消息传递到目标线程进行消费的,从而也实现了高并发高可用的消息有序消费的效果。
进一步地,基于本发明消息消费方法第一实施例,提出本发明消息消费方法第二实施例。本实施例是本发明第一实施例的步骤S20,基于预设特征识别算法确定所述当前消息对应的目标线程的步骤的细化,包括:
步骤S21,在所述当前消息对应的顶层接口接收所述当前消息对应的特征信息,并基于预设特征识别算法识别所述特征信息;
在当前消息对应的顶层接口中可以接收用户定义的当前消息对应的特征信息,并在用户定义消息时,可以选择消息中的部分字段作为特征识别的基础,这些字段的值可以作为特征信息。在消息消费者接收到当前消息时,可以通过预设特征识别算法来识别还原当前消息中的特征信息,以便根据该特征信息来确定该消息应该被哪个线程消费,保证具有相同特征的消息必定有序的被消费。
步骤S22,根据所述特征信息确定所述当前消息对应的目标线程。
由于同一类型的消息的特征信息是相同的,不同类型的消息的特征信息是不同的,因此可以在获取到当前信息对应的特征信息后,可以在线程池中确定哪个线程消耗的消息的特征信息和当前消息的特征信息相同,即确定目标线程。
在本实施例中,通过根据预设特征识别算法获取当前消息的特征信息,并根据特征信息确定目标线程,从而保障了当前消息获取到合适的线程进行消费,保障了消息消费的效率。
具体地,根据所述特征信息确定所述当前消息对应的目标线程的步骤,包括:
步骤S221,获取所述目标节点对应的线程池,根据所述线程池的容量和所述特征信息做取余操作,在所述线程池中获取具有取余结果标记的第一线程,并检测所述第一线程是否处于异常状态;
线程池可以是具有所有线程的集合。在获取到当前消息对应的特征信息后,还需要获取目标节点对应的线程池,并确定线程池的容量,再根据线程池的容量和特征信息做取余操作,以确定线程池中哪条线程消耗的消息的特征信息和当前消息的特征信息相同,且容量最大,则可以将其作为具有取余结果标记的第一线程。并在获取到第一线程后,还需要检查确定第一线程是否处于异常状态(也就是检查第一线程能不能正常地进行消耗消息的操作),并根据检查结果执行不同的操作。
步骤S222,若所述第一线程处于异常状态,则启用所述线程池中的备用线程,并将所述备用线程作为所述当前消息对应的目标线程;
当经过判断发现第一线程处于异常状态时,则会触发应急机制,该机制回使用提前初始化的备用线程替换异常线程,并根据异常范围回滚本地状态,再继续进行消费,此时替换的备用线程就是当前消息对应的目标线程。需要说明的是,在本实施例中,消息消费的每个步骤均回受到监控,一旦有某个环节失败、超时或吞吐量低于阈值,均会触发应急机制,不局限于在检测到第一线程处于异常状态时才触发。
步骤S223,若所述第一线程处于正常状态,则将所述第一线程作为所述当前消息对应的目标线程。
当经过判断发现第一线程处于正常状态时,则可以直接将第一线程作为当前消息对应的目标线程,将当前消息传递到目标线程进行消费。
在本实施例中,通过在确定第一线程后,检测第一线程是否处于异常状态,并根据不同的检测结果执行不同的操作,从而保障了消息消费的稳定性。
进一步地,在本发明第一至第二实施例任意一个的基础上,提出了本发明消息消费方法的第三实施例,本实施例是在本发明第一实施例的步骤S10,确定各所述消息队列中是否存在首次监听的新消息队列的步骤之后,包括:
步骤S50,若不存在首次监听的新消息队列,则检测各所述消息队列中是否存在新消息节点;
当经过判断发现不存在首次监听的新消息队列时,则需要再次检测各个消息队列中是否存在新消息节点生成,也就是确定是否有消息的生产者在消息队列中创建新的消息节点,并基于不同的检测结果执行不同的操作。
步骤S60,若存在新消息节点,则获取所述新消息节点中的新消息,并将所述新消息传递至所述新消息节点对应的第二线程进行消费。
当经过判断发现存在新消息节点生成时,则会触发zookeeper的监听机制,zookeeper会向监听该新消息节点所在的消息队列的所有消费者发送通知,消息消费者在收到通知后,将会根据通知的内容从zookeeper拉取新消息节点中的新消息,并通过预设特征识别算法来计算确定新消息节点对应的第二线程,并将新消息传递到第二线程进行消费。其中,新消息可以是新消息节点所携带的消息。第二线程可以是新消息将要进行消费所采用的线程。
在本实施例中,通过检测是否存在新消息节点生成,并在确定新消息节点生成时,则会直接获取新消息,并通过第二线程进行消费,从而保障了消息消费的效率。
具体地,将所述新消息传递至所述新消息对应的第二线程进行消费的步骤之后,包括:
步骤S70,获取zookeeper中的总消息队列,并定时确定所述总消息队列中的各消息节点中,是否存在消费完成的已消费消息节点,其中,所述总消息队列包括消息队列;
总消息队列可以是zookeeper中的所有消息队列。预设时间段可以是用户设置的任意时间段。已消费消息节点可以是消息已被各个消息消费者消费完成的消息节点。
由于消息的消费不具有强事务性。现有的技术均无法保证消息能够百分百被消费,且消费后失败后无保护措施,这就使得现有技术无法应对对状态同步准确性要求高的场景,而由于消息体本身会提供判断过期与否的状态信息,因此可以将处于过渡状态的消息进行及时清理,并提供消息合并机制,经过期消息中部分重要信息能够被单独抽取并放入持久状态的消息中。
获取zookeeper中的所有消息队列,并在每间隔预设时间段会有定时任务对各个消息队列中的所有消息节点中的消息进行检查,即检查消息的状态性质,在本实施例中通过将消息定义为“起始”、“过渡”和“终止”等状态,以实现对不同性质的消息的区别对待,而消息状态的识别方式可以通过用户自主定义或者中间件自动识别的方式进行识别。用户自主定义是中间件的用户在定义消息时,可以通过继承接口字段的方式来为消息赋予状态。而中间件自动识别是在消息清理的过程中,主动分析同一类消息的字段值,判断该消息是否已经被其它消息合并,若合并了其它消息携带的信息时,智能判断该消息的状态信息,以确保即使用户定义的状态信息有误差的情况下,仍然能得到修正,保持消息清理的有效性。其中,过渡状态的消息,将会在确认被完全消费后及时清理,因此需要确定各个消息节点是否为无需持久化保存的过渡消息,若经过判断发现存在消息节点为过渡消息,则会比对该消息节点下的临时子节点与服务注册目录下的临时节点,若两者一致,则证明该消息节点中的消息已被所有消息消费者消费,也就可以认为总消息队列的各个消息节点中,存在消费完成的已消费消息节点,此时就可以对该消息节点中的消息进清理。其中,临时子节点可以是消息消费者在接收到消息节点中的消息后,在该消息节点下创建的一个代表自身的临时子节点,作为消息已送达的依据。
步骤S80,若存在,则提取所述已消费消息节点中的重要信息进行保存,并清理所述总消息队列中的已消费消息节点。
当经过判断发现存在总消息队列中的已消费消息节点,也就是可以默认已被所有监听该消息节点的消息消费者所消费,此时该消息节点中的消息就处于过渡状态,则对该过渡消息中的重要消息进行提取,并可以根据zookeeper中的消息合并机制将重要信息保存在持久状态的消息中,以便用户后期想要查看重要信息时,能及时方便地查询到,在提取并保存完已消费消息节点中的重要信息时,可以清理该已消费消息节点。其中,若在zookeeper中不存在持久状态的消息,则可以自行创建一个持久节点,以便保存重要信息。当经过判断发现存在总消息队列中的消息节点未被消费完成时,则继续保持消息节点中的消息不变。
在本实施例中,通过检测总消息队列中是否存在已消费消息节点,若存在,则对该已消费消息节点进行清理,从而提高了消息清理的效率,提高了用户的使用体验感。
进一步地,在本发明第一实施例的基础上,提出了本发明消息消费方法的第四实施例,本实施例是在本发明第一实施例的步骤S30,将所述当前消息传递至所述目标线程进行消费的步骤之后,包括:
步骤A10,检测所述当前消息在所述目标线程中是否消费成功;
当将当前消息传递到目标线程进行消费后,还需要检查当前消息在目标线程中是否消费成功,若消费成功,则执行下一个消息的消费,若未消费成功,则会触发恢复机制,进行补偿消费。
步骤A20,若所述当前消息在所述目标线程中未消费成功,则获取所述当前消息对应的version值,并根据所述version值进行补偿消费。
当经过判断发现当前消息在目标线程中未消费成功,则会启动消息消费失败后的恢复机制,由于每个消费队列的目录节点均有一个version(描述)值,并当消息队列中的消息产生变化时,zookeeper自身的机制会对消费队列目录节点的version值做增量操作。因此可以先获取当前消息对应的version值,再根据version值来计算出错失的消息数量,从而进行补偿消费,直到消费成功。
在本实施例中,通过检测当前消息是否消费成功,并在消费未成功时,进行补偿消费,直到消费成功,从而避免了消费失败对整个系统逻辑的影响。
具体地,获取所述当前消息对应的version值,并根据所述version值进行补偿消费的步骤包括:
步骤A21,获取所述当前消息在所述消息队列中的队列version值,和所述当前消息在所述zookeeper中的本地version值,并计算所述本地version值和所述队列version值之间的差值是否大于预设值;
在本实施例中,version值包括本地version值和队列version值。
消息消费者在每次消费消息后,均会记录当前消息队列的version值,并且在每次消费消息前,也会将zookeeper中的本地version值和消息队列中的version值进行比较,若发现两者之间的差值大于预设值,则进行补偿操作,若两者之间的差值小于或等于预设值,则继续当前的消息消费操作。其中,预设值可以是用户设置的任意值,如1。
步骤A22,若所述本地version值和所述队列version值之间的差值大于预设值,则根据所述差值对所述当前消息进行补偿消费。
当经过判断发现本地version值和队列version值之间的差值大于预设值时,就会根据该差值来推算出错失的消息数量,并进行补偿消费,直到消费成功。
在本实施例中,通过计算本地version值和队列version值之间的差值是否大于预设值,并在差值大于预设值时,进行补偿消费,从而提高了消息消费的成功率。
本发明还提供一种消息消费装置,参照图3,所述消息消费装置包括:
获取模块,用于获取zookeeper服务注册目录中的目标节点,并基于所述目标节点监听预设数量的消息队列,确定各所述消息队列中是否存在首次监听的新消息队列;
确定模块,用于若存在首次监听的新消息队列,则依次遍历所述新消息队列中的消息,获取当前遍历的当前消息,并基于预设特征识别算法确定所述当前消息对应的目标线程;
传递模块,用于将所述当前消息传递至所述目标线程进行消费,直至所述新消息队列中的消息遍历完成。
进一步地,所述确定模块,还用于:
在所述当前消息对应的顶层接口接收所述当前消息对应的特征信息,并基于预设特征识别算法识别所述特征信息;
根据所述特征信息确定所述当前消息对应的目标线程。
进一步地,所述确定模块,还用于:
获取所述目标节点对应的线程池,根据所述线程池的容量和所述特征信息做取余操作,在所述线程池中获取具有取余结果标记的第一线程,并检测所述第一线程是否处于异常状态;
若所述第一线程处于异常状态,则启用所述线程池中的备用线程,并将所述备用线程作为所述当前消息对应的目标线程;
若所述第一线程处于正常状态,则将所述第一线程作为所述当前消息对应的目标线程。
进一步地,所述消息消费装置,还包括:
若不存在首次监听的新消息队列,则检测各所述消息队列中是否存在新消息节点;
若存在新消息节点,则获取所述新消息节点中的新消息,并将所述新消息传递至所述新消息节点对应的第二线程进行消费。
进一步地,所述消息消费装置,还包括:
获取zookeeper中的总消息队列,并定时确定所述总消息队列中的各消息节点中,是否存在消费完成的已消费节点,其中,所述总消息队列包括消息队列;
若存在,则提取所述已消费消息节点中的重要信息进行保存,并清理所述总消息队列中的已消费消息节点。
进一步地,所述消息消费装置,还包括:
检测所述当前消息在所述目标线程中是否消费成功;
若所述当前消息在所述目标线程中未消费成功,则获取所述当前消息对应的描述version值,并根据所述version值进行补偿消费。
进一步地,所述version值包括本地version值和队列version值,所述消息消费装置,还包括:
获取所述当前消息在所述消息队列中的队列version值,和所述当前消息在所述zookeeper中的本地version值,并计算所述本地version值和所述队列version值之间的差值是否大于预设值;
若所述本地version值和所述队列version值之间的差值大于预设值,则根据所述差值对所述当前消息进行补偿消费。
上述各程序模块所执行的方法可参照本发明消息消费方法各个实施例,此处不再赘述。
本发明还提供一种计算机存储介质。
本发明计算机存储介质上存储有消息消费程序,所述消息消费程序被处理器执行时实现如上所述的消息消费方法的步骤。
其中,在所述处理器上运行的消息消费程序被执行时所实现的方法可参照本发明消息消费方法各个实施例,此处不再赘述。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
Claims (10)
1.一种消息消费方法,其特征在于,所述消息消费方法包括如下步骤:
获取分布式协调服务zookeeper的服务注册目录中的目标节点,并基于所述目标节点监听预设数量的消息队列,确定各所述消息队列中是否存在首次监听的新消息队列;所述目标节点为消息消费者在所述zookeeper的服务注册目录下创建的代表自身的节点;所述消息消费者用于作为客户端获取消息;
若存在首次监听的新消息队列,则依次遍历所述新消息队列中的消息,获取当前遍历的当前消息,并基于预设特征识别算法确定所述当前消息对应的目标线程;
将所述当前消息传递至所述目标线程进行消费,直至所述新消息队列中的消息遍历完成。
2.如权利要求1所述的消息消费方法,其特征在于,所述基于预设特征识别算法确定所述当前消息对应的目标线程的步骤,包括:
在所述当前消息对应的顶层接口接收所述当前消息对应的特征信息,并基于预设特征识别算法识别所述特征信息;
根据所述特征信息确定所述当前消息对应的目标线程。
3.如权利要求2所述的消息消费方法,其特征在于,所述根据所述特征信息确定所述当前消息对应的目标线程的步骤,包括:
获取所述目标节点对应的线程池,根据所述线程池的容量和所述特征信息做取余操作,在所述线程池中获取具有取余结果标记的第一线程,并检测所述第一线程是否处于异常状态;
若所述第一线程处于异常状态,则启用所述线程池中的备用线程,并将所述备用线程作为所述当前消息对应的目标线程;
若所述第一线程处于正常状态,则将所述第一线程作为所述当前消息对应的目标线程。
4.如权利要求1所述的消息消费方法,其特征在于,所述确定各所述消息队列中是否存在首次监听的新消息队列的步骤之后,包括:
若不存在首次监听的新消息队列,则检测各所述消息队列中是否存在新消息节点;
若存在新消息节点,则获取所述新消息节点中的新消息,并将所述新消息传递至所述新消息节点对应的第二线程进行消费。
5.如权利要求4所述的消息消费方法,其特征在于,所述将所述新消息传递至所述新消息对应的第二线程进行消费的步骤之后,包括:
获取zookeeper中的总消息队列,并定时确定所述总消息队列的各消息节点中,是否存在消费完成的已消费消息节点,其中,所述总消息队列包括消息队列;
若存在,则提取所述已消费消息节点中的重要信息进行保存,并清理所述总消息队列中的已消费消息节点。
6.如权利要求1-5任一项所述的消息消费方法,其特征在于,所述将所述当前消息传递至所述目标线程进行消费的步骤之后,包括:
检测所述当前消息在所述目标线程中是否消费成功;
若所述当前消息在所述目标线程中未消费成功,则获取所述当前消息对应的描述version值,并根据所述version值进行补偿消费。
7.如权利要求6所述的消息消费方法,其特征在于,所述version值包括本地version值和队列version值,
所述获取所述当前消息对应的version值,并根据所述version值进行补偿消费的步骤包括:
获取所述当前消息在所述消息队列中的队列version值,和所述当前消息在所述zookeeper中的本地version值,并计算所述本地version值和所述队列version值之间的差值是否大于预设值;
若所述本地version值和所述队列version值之间的差值大于预设值,则根据所述差值对所述当前消息进行补偿消费。
8.一种消息消费装置,其特征在于,所述消息消费装置包括:
获取模块,用于获取zookeeper服务注册目录中的目标节点,并基于所述目标节点监听预设数量的消息队列,确定各所述消息队列中是否存在首次监听的新消息队列;所述目标节点为消息消费者在所述zookeeper的服务注册目录下创建的代表自身的节点;所述消息消费者用于作为客户端获取消息;
确定模块,用于若存在首次监听的新消息队列,则依次遍历所述新消息队列中的消息,获取当前遍历的当前消息,并基于预设特征识别算法确定所述当前消息对应的目标线程;
传递模块,用于将所述当前消息传递至所述目标线程进行消费,直至所述新消息队列中的消息遍历完成。
9.一种消息消费设备,其特征在于,所述消息消费设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的消息消费程序,所述消息消费程序被所述处理器执行时实现如权利要求1至7中任一项所述的消息消费方法的步骤。
10.一种计算机存储介质,其特征在于,所述计算机存储介质上存储有消息消费程序,所述消息消费程序被处理器执行时实现如权利要求1至7中任一项所述的消息消费方法的步骤。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910479100.XA CN110213371B (zh) | 2019-05-31 | 2019-05-31 | 消息消费方法、装置、设备及计算机存储介质 |
PCT/CN2020/080930 WO2020238365A1 (zh) | 2019-05-31 | 2020-03-24 | 消息消费方法、装置、设备及计算机存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910479100.XA CN110213371B (zh) | 2019-05-31 | 2019-05-31 | 消息消费方法、装置、设备及计算机存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110213371A CN110213371A (zh) | 2019-09-06 |
CN110213371B true CN110213371B (zh) | 2023-05-12 |
Family
ID=67790518
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910479100.XA Active CN110213371B (zh) | 2019-05-31 | 2019-05-31 | 消息消费方法、装置、设备及计算机存储介质 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN110213371B (zh) |
WO (1) | WO2020238365A1 (zh) |
Families Citing this family (23)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110213371B (zh) * | 2019-05-31 | 2023-05-12 | 深圳前海微众银行股份有限公司 | 消息消费方法、装置、设备及计算机存储介质 |
CN111078422B (zh) * | 2019-11-19 | 2023-09-12 | 泰康保险集团股份有限公司 | 消息处理方法、消息处理装置、可读存储介质、电子设备 |
CN111784329B (zh) * | 2020-06-30 | 2024-04-05 | 京东科技控股股份有限公司 | 业务数据的处理方法和装置、存储介质、电子装置 |
CN112181683A (zh) * | 2020-09-27 | 2021-01-05 | 中国银联股份有限公司 | 消息中间件的并发消费方法以及装置 |
CN112613912B (zh) * | 2020-12-27 | 2023-06-16 | 浙江融象数科控股有限公司 | 高并发场景下的优惠券领取系统设计 |
CN112817745A (zh) * | 2021-01-14 | 2021-05-18 | 内蒙古蒙商消费金融股份有限公司 | 一种任务处理方法及装置 |
CN112882846B (zh) * | 2021-02-19 | 2024-02-09 | 深圳市云网万店科技有限公司 | 消息队列的数据处理方法、装置、计算机设备和存储介质 |
CN113312189A (zh) * | 2021-03-26 | 2021-08-27 | 统信软件技术有限公司 | 一种消息处理方法、计算设备及储存介质 |
CN113010295B (zh) * | 2021-03-30 | 2024-06-11 | 中信银行股份有限公司 | 流式计算方法、装置、设备以及存储介质 |
CN112882853B (zh) * | 2021-03-31 | 2024-07-05 | 中国工商银行股份有限公司 | 一种数据处理方法、装置及设备 |
CN113515391A (zh) * | 2021-05-14 | 2021-10-19 | 北京字节跳动网络技术有限公司 | 消息处理的方法、装置、电子设备和计算机可读存储介质 |
CN113342898B (zh) * | 2021-06-29 | 2022-10-04 | 杭州数梦工场科技有限公司 | 数据同步方法及装置 |
CN114490112B (zh) * | 2021-12-20 | 2024-09-20 | 阿里巴巴(中国)有限公司 | 消息处理方法、设备及系统 |
CN114567664B (zh) * | 2022-03-04 | 2023-08-11 | 苏州浪潮智能科技有限公司 | 消息处理结果监控方法、装置、计算机设备和存储介质 |
CN115333942B (zh) * | 2022-08-10 | 2023-10-27 | 北京搜房科技发展有限公司 | 事件重试方法及装置、存储介质及电子设备 |
CN116009465B (zh) * | 2022-09-08 | 2024-01-30 | 上海繁易信息科技股份有限公司 | 分布式数据采集方法及相关装置 |
CN116185665A (zh) * | 2023-02-28 | 2023-05-30 | 北京字跳网络技术有限公司 | 一种消息处理方法、装置、设备及介质 |
CN115865791B (zh) * | 2023-03-02 | 2023-05-09 | 北京天弛网络有限公司 | 骨干网络故障的路径切换方法、系统、介质及电子设备 |
CN116108110B (zh) * | 2023-04-17 | 2023-08-15 | 南方电网数字电网研究院有限公司 | 一种Kafka消息消费补偿方法、系统和介质 |
CN116887222B (zh) * | 2023-06-28 | 2024-08-20 | 赛力斯汽车有限公司 | 车载ota模块异步接口超时回复方法、装置、设备和介质 |
CN117370457B (zh) * | 2023-09-26 | 2024-07-09 | 浪潮智慧科技有限公司 | 一种多线程数据实时同步方法、设备及介质 |
CN117093387B (zh) * | 2023-10-20 | 2024-02-13 | 腾讯科技(深圳)有限公司 | 消息处理方法、装置、电子设备和存储介质 |
CN117608877B (zh) * | 2023-11-29 | 2024-10-01 | 广州方舟信息科技有限公司 | 一种数据传输方法、装置、设备及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106201696A (zh) * | 2016-07-15 | 2016-12-07 | 东软集团股份有限公司 | 用于线程的方法和装置 |
CN107818484A (zh) * | 2016-09-14 | 2018-03-20 | 北京京东尚科信息技术有限公司 | 管理开票规则的方法和系统 |
CN108874562A (zh) * | 2018-06-21 | 2018-11-23 | 北京顺丰同城科技有限公司 | 分布式高并发消息队列推送系统 |
CN108965461A (zh) * | 2018-08-03 | 2018-12-07 | 华数传媒网络有限公司 | 服务治理方法、装置及dubbo服务系统 |
CN109714409A (zh) * | 2018-12-21 | 2019-05-03 | 优估(上海)信息科技有限公司 | 一种消息的管理方法和系统 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104092767B (zh) * | 2014-07-21 | 2017-06-13 | 北京邮电大学 | 一种增加消息队列模型的发布/订阅系统及其工作方法 |
US10262032B2 (en) * | 2016-02-24 | 2019-04-16 | Salesforce.Com, Inc. | Cache based efficient access scheduling for super scaled stream processing systems |
US10409650B2 (en) * | 2016-02-24 | 2019-09-10 | Salesforce.Com, Inc. | Efficient access scheduling for super scaled stream processing systems |
CN109714239B (zh) * | 2018-12-27 | 2021-04-27 | 新华三技术有限公司 | 一种管理消息的下发方法、vnfm设备和服务器 |
CN110213371B (zh) * | 2019-05-31 | 2023-05-12 | 深圳前海微众银行股份有限公司 | 消息消费方法、装置、设备及计算机存储介质 |
-
2019
- 2019-05-31 CN CN201910479100.XA patent/CN110213371B/zh active Active
-
2020
- 2020-03-24 WO PCT/CN2020/080930 patent/WO2020238365A1/zh active Application Filing
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106201696A (zh) * | 2016-07-15 | 2016-12-07 | 东软集团股份有限公司 | 用于线程的方法和装置 |
CN107818484A (zh) * | 2016-09-14 | 2018-03-20 | 北京京东尚科信息技术有限公司 | 管理开票规则的方法和系统 |
CN108874562A (zh) * | 2018-06-21 | 2018-11-23 | 北京顺丰同城科技有限公司 | 分布式高并发消息队列推送系统 |
CN108965461A (zh) * | 2018-08-03 | 2018-12-07 | 华数传媒网络有限公司 | 服务治理方法、装置及dubbo服务系统 |
CN109714409A (zh) * | 2018-12-21 | 2019-05-03 | 优估(上海)信息科技有限公司 | 一种消息的管理方法和系统 |
Non-Patent Citations (1)
Title |
---|
高速公路收费及管理系统中分布式消息系统的应用;方瑜庆;《中国交通信息化》;20160115(第01期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
WO2020238365A1 (zh) | 2020-12-03 |
CN110213371A (zh) | 2019-09-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110213371B (zh) | 消息消费方法、装置、设备及计算机存储介质 | |
US8886796B2 (en) | Load balancing when replicating account data | |
US7886295B2 (en) | Connection manager, method, system and program product for centrally managing computer applications | |
CN106506490B (zh) | 一种分布式计算控制方法以及分布式计算系统 | |
US20090328054A1 (en) | Adapting message delivery assignments with hashing and mapping techniques | |
US9413588B2 (en) | Resource tracking | |
US20080288812A1 (en) | Cluster system and an error recovery method thereof | |
CN109766198B (zh) | 流式处理方法、装置、设备及计算机可读存储介质 | |
JP6615761B2 (ja) | 分散データグリッドにおいて非同期呼出をサポートするためのシステムおよび方法 | |
CN113537268A (zh) | 一种故障检测方法、装置、计算机设备及存储介质 | |
CN105049509A (zh) | 一种集群调度方法、负载均衡器以及集群系统 | |
US10802896B2 (en) | Rest gateway for messaging | |
CN104753987B (zh) | 一种分布式会话管理方法及系统 | |
CN109495543B (zh) | 一种ceph集群中监视器的管理方法及装置 | |
CN110825505B (zh) | 任务调度方法、装置、计算机设备及存储介质 | |
CN111756778B (zh) | 一种服务器磁盘清理脚本推送的方法、装置和存储介质 | |
US8127305B1 (en) | Rerouting messages to parallel queue instances | |
JP2002108817A (ja) | 共用データベースによるアベイラビリティ・モニタリング方法 | |
CN106790610A (zh) | 一种云系统消息分发方法,装置和系统 | |
CN112615901B (zh) | 一种客户端发送用户请求的方法和存储系统 | |
US8077699B2 (en) | Independent message stores and message transport agents | |
US7647401B1 (en) | System and method for managing resources of a network load balancer via use of a presence server | |
CN116455830A (zh) | 实现存储网关高可用分布式qos的方法 | |
CN114007111A (zh) | 资源分发方法、装置、电子设备及存储介质 | |
US20190068471A1 (en) | Dynamic asynchronous communication management |
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 |