CN114253747B - 一种分布式消息管理系统和方法 - Google Patents

一种分布式消息管理系统和方法 Download PDF

Info

Publication number
CN114253747B
CN114253747B CN202111614756.1A CN202111614756A CN114253747B CN 114253747 B CN114253747 B CN 114253747B CN 202111614756 A CN202111614756 A CN 202111614756A CN 114253747 B CN114253747 B CN 114253747B
Authority
CN
China
Prior art keywords
message
target
queue
sub
feign
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
Application number
CN202111614756.1A
Other languages
English (en)
Other versions
CN114253747A (zh
Inventor
叶刚
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Yusys Technologies Group Co ltd
Original Assignee
Beijing Yusys Technologies Group Co ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Yusys Technologies Group Co ltd filed Critical Beijing Yusys Technologies Group Co ltd
Priority to CN202111614756.1A priority Critical patent/CN114253747B/zh
Publication of CN114253747A publication Critical patent/CN114253747A/zh
Application granted granted Critical
Publication of CN114253747B publication Critical patent/CN114253747B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/546Message passing systems or structures, e.g. queues
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/54Indexing scheme relating to G06F9/54
    • G06F2209/548Queue

Abstract

本发明提供一种分布式消息管理系统和方法,系统包括:生产端,用于从目标消息中获取分片关键字,根据分片关键字和消息代理的数量,确定feign的索引号,根据索引号确定目标消息代理,向其发送目标消息;目标消息代理接收目标消息,从目标消息中获取分片关键字,根据分片关键字和消息队列中的子消息队列数量,确定目标子消息队列,向其发送目标消息;消息队列中的目标子消息队列接收目标消息,从目标消息中获取分片关键字,根据分片关键字和消费端中用于存储有序消息的内存工作队列的数量,确定消费端中的目标内存工作队列,向其发送目标消息;消费端的目标内存工作队列对应的目标线程对目标消息进行消费。该系统可确保消息的顺序性。

Description

一种分布式消息管理系统和方法
技术领域
本发明涉及异步消息处理的技术,具体涉及一种分布式消息管理系统和方法。
背景技术
在为用户提供基于分布式消息的发布/订阅场景的产品时,需要采用某种消息队列中间件产品作为基础架构的一部分,来支持业务的需要。消息队列的技术复杂性高,特别对大数据量和高并发场景,要求更高,这可能限制交付进度和损害产品质量。另外,有些项目方由于历史原因实际维护了多套消息队列中间件产品,这导致维护工作量较大。
在实现本发明过程中,发明人发现现有技术中至少存在如下问题:当前在异步消息通信场景下,在分布式消息管理系统中无法确保消息的顺序性。
发明内容
有鉴于此,本发明实施例的目的在于提供一种分布式消息管理系统和方法,以实现消息有序消费。
第一方面,本发明实施例提供了一种分布式消息管理系统,所述系统包括:
生产端,用于从目标消息中获取分片关键字,根据所述分片关键字和消息代理的数量,确定feign的索引号,根据所述feign的索引号确定目标消息代理,向所述目标消息代理发送所述目标消息;
消息代理集群,其包括多个消息代理,其中,多个消息代理中的所述目标消息代理接收所述目标消息,从所述目标消息中获取所述分片关键字,根据所述分片关键字和消息队列中的子消息队列数量,确定目标子消息队列,向所述目标子消息队列发送所述目标消息;
消息队列,其包括多个子消息队列,其中,多个子消息队列中的所述目标子消息队列接收所述目标消息,从所述目标消息中获取所述分片关键字,根据所述分片关键字和消费端中用于存储有序消息的内存工作队列的数量,确定消费端中的目标内存工作队列,向所述目标内存工作队列发送目标消息;
消费端,其包括多个内存工作队列和多个线程,其中,多个内存工作队列中的所述目标内存工作队列对应的目标线程对所述目标消息进行消费。
在一些可能的实施方式中,所述目标消息的报文格式包括:消息标识字段,用于唯一地标识一项交易业务;分片关键字字段,用于确定所述分片关键字,所述分片关键字包括:借据号或客户号;队列名字段,用于确定消息队列的队列名;消息体字段,用于记载所述目标消息的消息体;
所述生产端,用于从目标消息的所述分片关键字字段中获取分片关键字;
所述目标消息代理,用于从目标消息的所述分片关键字字段中获取分片关键字;
所述目标子消息队列,用于从目标消息的所述分片关键字字段中获取分片关键字。
在一些可能的实施方式中,所述生产端,具体用于将所述借据号对消息代理的数量进行取模运算获得第一模值,将所述第一模值作为feign的索引号,根据所述feign的索引号确定目标消息代理,向所述目标消息代理发送所述目标消息。
在一些可能的实施方式中,所述目标消息代理,具体用于将所述借据号对消息队列中的子消息队列数量进行取模运算获得第二模值,根据所述第二模值确定目标子消息队列,向所述目标子消息队列发送所述目标消息。
在一些可能的实施方式中,所述目标子消息队列,具体用于根据所述借据号对消费端中用于存储有序消息的内存工作队列的数量进行取模运算获得第三模值,根据所述第三模值,确定消费端中的目标内存工作队列,向所述目标内存工作队列发送目标消息。
第二方面,本发明实施例提供了一种分布式消息管理方法,所述方法包括:
生产端从目标消息中获取分片关键字,根据所述分片关键字和消息代理的数量,确定feign的索引号,根据所述feign的索引号确定目标消息代理,向所述目标消息代理发送所述目标消息;
所述目标消息代理接收所述目标消息,从所述目标消息中获取所述分片关键字,根据所述分片关键字和消息队列中的子消息队列数量,确定目标子消息队列,向所述目标子消息队列发送所述目标消息;
所述目标子消息队列接收所述目标消息,从所述目标消息中获取所述分片关键字,根据所述分片关键字和消费端中用于存储有序消息的内存工作队列的数量,确定消费端中的目标内存工作队列,向所述目标内存工作队列发送目标消息;
所述目标内存工作队列对应的目标线程对所述目标消息进行消费。
在一些可能的实施方式中,所述目标消息的报文格式包括:
消息标识字段,用于唯一地标识一项交易业务;
分片关键字字段,用于确定所述分片关键字,所述分片关键字包括:借据号或客户号;
队列名字段,用于确定消息队列的队列名;
消息体字段,用于记载所述目标消息的消息体;
所述生产端从目标消息的所述分片关键字字段中获取分片关键字;
所述目标消息代理从所述目标消息的所述分片关键字字段中获取分片关键字;
所述目标子消息队列从目标消息的所述分片关键字字段中获取分片关键字。
在一些可能的实施方式中,所述生产端将所述借据号对消息代理的数量进行取模运算获得第一模值,将所述第一模值作为feign的索引号,根据所述feign的索引号确定目标消息代理,向所述目标消息代理发送所述目标消息。
在一些可能的实施方式中,所述目标消息代理将所述借据号对消息队列中的子消息队列数量进行取模运算获得第二模值,根据所述第二模值确定目标子消息队列,向所述目标子消息队列发送所述目标消息。
在一些可能的实施方式中,所述目标子消息队列根据所述借据号对消费端中用于存储有序消息的内存工作队列的数量进行取模运算获得第三模值,根据所述第三模值,确定消费端中的目标内存工作队列,向所述目标内存工作队列发送目标消息。
在一些可能的实施方式中,所述消息代理的部署模式包括:
所述消息代理的部署模式一:所述消息代理包括处于单个分区中的多台机器,多台机器具有共同的服务器标识,每台机器上运行克隆实例,当一台机器上的克隆实例失效后,切换至由本分区内的另一台机器上的克隆实例继续消费;或者,
所述消息代理的部署模式二:所述消息代理包括多个分区,每个分区中具有一台机器,每台机器的服务器标识均不相同,当任意一个分区中的机器宕机时,将待处理消息分流到其他正常的分区内的机器上;或者,
所述消息代理的部署模式三:所述消息代理包括多个分区,在至少一个分区中仅配置一台机器,在至少一个分区中配置多台机器,并且在配置多台机器的分区中,多台机器具有共同的服务器标识且运行相应的克隆实例,当任意一个分区中的机器宕机时,将待处理消息分流到其他正常的分区内的克隆实例未失效的机器上。
第三方面,提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如上所述的任意一种分布式消息管理方法。
上述技术方案具有如下有益效果:
上述技术方案通过根据所述分片关键字和消息代理的数量,确定feign的索引号,根据所述feign的索引号确定目标消息代理,向所述目标消息代理发送所述目标消息;以及,根据所述分片关键字和消息队列中的子消息队列数量,确定目标子消息队列,向所述目标子消息队列发送所述目标消息;以及,根据所述分片关键字和消费端中用于存储有序消息的内存工作队列的数量,确定消费端中的目标内存工作队列,向所述目标内存工作队列发送目标消息;从而可以实现:确保请求被分发到正确的消息代理上;确保消息被分配到正确的消息队列的子队列上;确保消息被分配到正确的内存工作队列上;最终实现消息的有序消费。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是消息被破坏有序性的场景的示例图;
图2是本发明实施例的分布式消息管理系统的功能框图;
图3是本发明实施例的分布式消息管理系统中消息代理可伸缩性设计的部署示意图;
图4是本发明实施例的分布式消息管理方法的流程图;
图5是本发明实施例的计算机可读存储介质的功能框图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例涉及异步消息处理的技术,主要应用于消费金融领域,用于解决在异步消息通信场景下如何快速发布、接收消,以及如何确保消息的顺序性等问题。
以下首先对本发明实施例中用到的技术术语进行定义:
RM,是Reliable Message,可靠的消息管理系统的简称。
Broker,消息代理,对RM来说,由消息代理Broker组件完成对mq技术栈的封装,broker就是RM的消息代理。
内存工作队列,指的是在单节点下通过多线程技术完成并发计算,提升处理速度。其中,Job,是一个工作队列数据结构;Worker,是一个线程的封装;Worker Manager,是一个处理类,负责为指定的job动态分配和回收worker。
数据分区,其将数据根据散列算法进行分类,达到数据始终稳定的归属与某个分区之内。
消息有序性,消息处理始终按照时间发生的顺序处理,通常指的是消息发送顺序与消息消费顺序一致。
分片关键字,在核算系统中,通过借据号或客户号来定义参与分片的算法参数。在RM系统中,由生产端通过指定分片关键字,然后对分片关键字进行计算,从而获取feign的索引号,找到调用指定的消息代理。feign是spring-cloud微服务开源框架的一个技术组件,用于包装http请求细节并与注册中心配合使用,实现多机器部署环境下的熔断、限流、负载均衡等。
Worker是一种数据结构,用于模拟真实世界参与生产的工人,体现的是业务架构设计机制一部分。
线程(Thread)是计算机中逻辑处理单元组件在处理任务时由CPU为该任务划分的一个时间片,它是操作系统调度资源的最小单位,它体现的是操作系统内部实现机制的一部分。
图1是消息被破坏有序性的场景的示例图。如图1所示,在该分布式部署结构中,包含基本的三个计算节点:生产端、消息代理和消费端。在确保有序性要求的部署环境下,一个消费端必须仅支持监听一个消息队列,并且一个消息队列必须仅能被一个消费端消费。
以下具体解释被固定的消费端消费:
假设生产端具有2个设备(p1、p2),消息代理服务部署3台机器(例如broker0、broker1、broker2),每台机器负责一部分数据的消息转发,消息队列包括多个子消息队列(例如queue_0、queue_1、queue_2、queue_3)。如果消息消费端也部署超过2台机器(例如c0、c1、c2、c3),那么本实施例期望,由生产端发送的data1、data2数据按时间顺序在消费端应该始终被固定的消费端来处理。由图1所示,生产端p2按顺序发送了data1、data2,为了确保消费的顺序性,在消费端c1上处理并且必须在线程1(thread1)上也按data1、data2的顺序进行处理。
以下结合图1解释消息可能会被破坏有序性的原因,这种破坏性可能在如下三种场景下发生:
场景一:生产端将data1发送到broker0,将data2请求发送到broker1;
场景二:数据按data2、data1的顺序被投递到相同的消息队列;
场景三:消费端的内存工作区的线程1处理data1数据,线程2处理data2数据。
基于上述消息的投递具有无序性,本发明实施例提出如下基本技术构思:(1)确保请求被分发到正确的消息代理的URL上;(2)确保消息被分配到正确的消息队列的子队列上;(3)确保消息被分配到正确的内存工作队列上。
图2是本发明实施例的分布式消息管理系统的功能框图。如图2所示,该系统包括:
生产端,用于从目标消息中获取分片关键字,根据分片关键字和消息代理的数量,确定feign的索引号,根据feign的索引号确定目标消息代理,向目标消息代理发送目标消息;
消息代理集群,其包括多个消息代理,其中,多个消息代理中的目标消息代理接收目标消息,从目标消息中获取分片关键字,根据分片关键字和消息队列中的子消息队列数量,确定目标子消息队列,向目标子消息队列发送目标消息;
消息队列,其包括多个子消息队列,其中,多个子消息队列中的目标子消息队列接收目标消息,从目标消息中获取分片关键字,根据分片关键字和消费端中用于存储有序消息的内存工作队列的数量,确定消费端中的目标内存工作队列,向目标内存工作队列发送目标消息;
消费端,其包括多个内存工作队列和多个线程,其中,多个内存工作队列中的目标内存工作队列对应的目标线程对目标消息进行消费。
在一些实施例中,目标消息的报文格式包括:消息标识字段,用于唯一地标识一项交易业务;分片关键字字段,用于确定分片关键字,分片关键字包括:借据号或客户号;队列名字段,用于确定消息队列的队列名;消息体字段,用于记载目标消息的消息体;
生产端,用于从目标消息的分片关键字字段中获取分片关键字;
目标消息代理,用于从目标消息的分片关键字字段中获取分片关键字;
目标子消息队列,用于从目标消息的分片关键字字段中获取分片关键字。
在一些实施例中,生产端,具体用于将借据号对消息代理的数量进行取模运算获得第一模值,将第一模值作为feign的索引号,根据feign的索引号确定目标消息代理,向目标消息代理发送目标消息。
在一些实施例中,目标消息代理,具体用于将借据号对消息队列中的子消息队列数量进行取模运算获得第二模值,根据第二模值确定目标子消息队列,向目标子消息队列发送目标消息。
在一些实施例中,目标子消息队列,具体用于根据借据号对消费端中用于存储有序消息的内存工作队列的数量进行取模运算获得第三模值,根据第三模值,确定消费端中的目标内存工作队列,向目标内存工作队列发送目标消息。
以下描述定义消息具备有序性的声明:
消息报文的定义:
Figure BDA0003436104940000071
属性说明:
messageId,其是消息的唯一标识,可以自动生成,也可以由业务系统指定,属于必填项,一般填写交易流水号等代表业务唯一标识的信息,如果不填,配合testEnable:true,业务系统会为其指定一个唯一值,用于生产端和消费端联调测试时使用;该messageId字段还用于进行分片信息,以便决定路由到哪个消息代理Broker、拆分子消息队列的索引下标、内存队列Map的分配等。对于消息顺序性场景,由生产端确保发送的顺序,即消费顺序与发送顺序保持一致。消息发送需要带入交易流水号,并填入消息体的message_id字段,该值将作为唯一业务发生标识,供消费端使用,未来也可以根据该值进行数据核对。在一个可能示例中,假设消息代理服务器部署了3台机器,用于处理生产端发来的消息。假设在交易场景不要求顺序处理时,可以选择使用messageId作为分片依据来均衡地将请求分配到这3台机器上。其实现思路如下:
假设messageId经过哈希后取模:
哈希(messageId)%3=0;
表示该请求应该被分配到编号为0的机器上执行。
shardingKey,其是分片关键字,必填项,特别是在交易场景要求顺序处理的时候,需要使用该分片关键字进行有序消费,配合sequenceRequired为true来实现,来确定使用哪个值作为分片关键字,一般是借据号或客户号。ShardingKey可以是任何值,一般是被指定为有业务含义的信息,例如借据号、客户号等。
消费者队列consumerQueue,必填项,其是生产端发送的消息中间件的目标队列,如果该目标队列没有在消费端的apollo(阿波罗配置中心,其是一款开源中间件)中配置,作为消费端是无法监听到消息的。消费者队列的队列名是自定义的,可以是字母数字的组合。consumerQueue这个字段是指明一个消息队列的名字,例如A;那么消息中间件运行时,会创建并监控A这个队列,一旦消息到达,消息中间件就会将该消息转发给订阅了该消息队列的消费端。
sequenceRequired,选填项,表示该笔交易要求顺序性,如果不填默认为false;该字段需要持久化,以便补偿操作时仍然保持其有序性处理。
messageBody,必填项,其是消息的主体信息,通常是业务的主要信息。在消息消费端获取到消息报文后,会将messageDody解析出来交给业务端去执行。
以下描述实现消息的顺序性的具体技术方案,该技术方案针对于上面提到的破坏有序性的多个场景。
具体的技术方案如下:
1、确保请求被分发到正确的消息代理上。
假设以借据号loanNo作为分片关键字,那么计算消息请求实例feign接口的算法如下:
S11、FeignInstance<数字>=loanNo%rm.broker.deploy.size。
其中,rm.broker.deploy.size是参数配置,表示消息代理的数量。feignInstance代表指向的某一个消息代理的服务访问链接,相当于feign的索引号。借据号是一个字符串,其可以是数字、数字与字母的组合、或者数字、字母和特殊符号三者的组合。当借据号是数字时,直接以借据号对消息代理的数量进行取模运算,获得feign的索引号。当借据号是数字与字母两者的组合,或者数字、字母和特殊符号三者的组合时,可通过现有技术中多种字符串转换成数字的转换方法,将其转换为数字。在一个举例中,可对作分片关键字的借据号基于散列算法进行处理得到哈希值,然后以该哈希值对消息代理的数量进行取模运算得到feign的索引号。
S12、feign实例工厂中获取指定数字下标的feign实例。
具体地,S12的具体处理过程举例如下:
在一个具体技术实现的案例中,只要知道到feign是对消息代理的访问的引用即可,即获取到feign0,表示拿到了访问消息代理0这台机器的访问链接;获取到feign1,表示拿到了访问消息代理1这台机器的访问链接;依次类推。
具体实现过程如下:
步骤1、例如启动3个消息代理,分别标记为broker0、broker1、broker2;
步骤2、生产端代码编写三个分别指向broker0,broker1、broker2的feign0、feign1、feign2的类实例。
步骤3、当生产端接收到客户请求后,根据分片关键字,通过哈希算法和取模计算(针对消息代理的部署数量进行取模)后获得一个数字值,该数字值必在{0,1,2}中的某一个数字值。然后根据索引标号(即经过取模后得到的数字值)找到对应的feign的实例,即可实现访问某台机器的目的。
S13、通过该feign实例与相应的消息代理broker通信。即实现了与步骤2计算得到的机器编号的那台机器通信。
2、确保消息被分配到正确的子队列上。
rm.service.queueSubSize是参数配置,表示子队列数量,一个子队列对应一个消费端。配置的队列名分片数量(子队列数量)决定消费端节点数量。计算子队列位置的算法如下:
S21、loanNo%rm.queue.sub.size=>数字;
其中,loanNo表示借据号,是分片关键字;rm.queue.sub.size是子队列数量,表示分区不能超过这个数量。
S22、确定子队列名:sub:<数字>。
3、确保消息被分配到消费端的正确的内存工作队列上。
rm.job.queue.group.size=10;
rm.job.queue.group.seq.size=3;
rm.job.queue.minWorkers=3;
rm.job.queue.maxWorkers=10。
以上参数配置表示,内存工作队列JobQueue组配置为10个,其是一个Map集合,内部有10个内存工作对队列JobQueue对象。
其中,Map里的前三个KEY 0、1、2是存放有序消息的内存工作队列。
每个内存工作队列在系统初始化时至少分配一个Worker(工人)对内存工作队列JobQueue里的任务或工作项Job进行处理。在本实施例中,每个消息被包装成一个Job,然后由多个Worker(工人)抢着执行,当Job大量堆积时,开启多个worker,可以提升单位时间的吞吐量。
计算内存工作队列组位置的算法如下:
JobQueue_<数字>=loanNo%rm.map.job.queue.group.seq.size。
上述技术方案的优点在于:当前在异步消息通信场景下,在分布式消息管理系统中确保消息的顺序性。
以下描述本发明实施例的可伸缩性设计:
可伸缩性设计的目的是解决大数据高并发场景下,通过横向扩展解决处理的并发性和单位时间的数量的问题。为了提升处理消息的机器数量,将消息处理的机器进行分区,每个分区处理一部分数据,一般按message_id进行散列算法,这样处理的消息可以均衡地分散在不同的区上。分区数量越多,处理消息的机器越多,并行处理的能力越强。本实施例中的散列算法,又称为路由算法,即对message_id先散列,得到一个不会重复的数字,然后根据消息代理部署的数量,取模得到一个0~n-1的数字编号,该编号即为消息代理的机器编号。
例如:message_id值为“fdfserdfef”;
Hash(message_id),得到一个数字,例如得到:12343;
12343%3,得到1,该值即为消息代理的编号。
由于单分区一旦宕机,将导致所有分流到该分区的消息都无法得到处理,所以必须设计在分区内克隆实例,以确保当某个实例失效后会由另一个实例继续消费,实例数量越多,可用性越高,一般至少设置2个实例。每个实例建议部署在独立的机器上,最好跨机房部署。
如果某一分区的所有实例全部宕机,则能够动态识别并将消息分流到其他正常的分区上。这一过程完全动态进行,无需人工干预。
图3是本发明实施例的可伸缩性设计的部署示意图。如图3所示,消息代理的部署模式包括:
如图3的(a)部分所示,消息代理的部署模式一,在该模式中具有相同的serverId,进行实例克隆,具体包括:消息代理包括处于单个分区中的多台机器,多台机器具有共同的服务器标识,每台机器上运行克隆实例,当一台机器上的克隆实例失效后,切换至由本分区内的另一台机器上的克隆实例继续消费;或者,
如图3的(b)部分所示,消息代理的部署模式二,在该模式中具有不相同的serverId,做流量分区,具体包括:消息代理包括多个分区,每个分区中具有一台机器,每台机器的服务器标识均不相同,当任意一个分区中的机器宕机时,将待处理消息分流到其他正常的分区内的机器上;或者,
如图3的(c)部分所示,消息代理的部署模式三,在该模式中具有不相同的serverId,某一serverId存在多份部署:消息代理包括多个分区,在至少一个分区中仅配置一台机器,在至少一个分区中配置多台机器,并且在配置多台机器的分区中,多台机器具有共同的服务器标识且运行相应的克隆实例,当任意一个分区中的机器宕机时,将待处理消息分流到其他正常的分区内的克隆实例未失效的机器上。
本发明实施例可实现RM的可伸缩性,这主要体现在实例克隆、数据分区、监控、告警、容器化运行等,这是RM非常重要的运维特性,解决这类问题能够让开发人员从中解放出来,真正把精力投入到业务设计和开发上来。
图4是本发明实施例提供的一种分布式消息管理方法。如图4所示,该方法包括:
S110、生产端从目标消息中获取分片关键字,根据分片关键字和消息代理的数量,确定feign的索引号,根据feign的索引号确定目标消息代理,向目标消息代理发送目标消息;
具体地,本步骤可以包括:生产端从目标消息的消息报文的分片关键字字段中获取分片关键字。
S120、目标消息代理接收目标消息,从目标消息中获取分片关键字,根据分片关键字和消息队列中的子消息队列数量,确定目标子消息队列,向目标子消息队列发送目标消息;
在一些实施例中,根据目标消息的消息报文中的队列名字段consumerQueue,确定消息队列中的队列名。例如假设consumerQueue字段中记载的队列名是A,则向消息队列A中相应的子消息队列发送目标消息。消息队列的数量可以是一个或多个。
S130、目标子消息队列接收目标消息,从目标消息中获取分片关键字,根据分片关键字和消费端中用于存储有序消息的内存工作队列的数量,确定消费端中的目标内存工作队列,向目标内存工作队列发送目标消息;
S140、目标内存工作队列对应的目标线程对目标消息进行消费。
在一些实施例中,目标消息的报文格式包括:
消息标识字段,用于唯一地标识一项交易业务;
分片关键字字段,用于确定分片关键字,分片关键字包括:借据号或客户号;
队列名字段,用于确定消息队列的队列名;
消息体字段,用于记载目标消息的消息体;
生产端从目标消息的分片关键字字段中获取分片关键字;
目标消息代理从目标消息的分片关键字字段中获取分片关键字;
目标子消息队列从目标消息的分片关键字字段中获取分片关键字。
在一些实施例中,生产端将借据号对消息代理的数量进行取模运算获得第一模值,将第一模值作为feign的索引号,根据feign的索引号确定目标消息代理,向目标消息代理发送目标消息。
在一些实施例中,目标消息代理将借据号对消息队列中的子消息队列数量进行取模运算获得第二模值,根据第二模值确定目标子消息队列,向目标子消息队列发送目标消息。
在一些实施例中,目标子消息队列根据借据号对消费端中用于存储有序消息的内存工作队列的数量进行取模运算获得第三模值,根据第三模值,确定消费端中的目标内存工作队列,向目标内存工作队列发送目标消息。
本发明实施例是一种建立在分布式网络系统之上的数据最终一致性处理方案。从适用场合上看,现有技术是异步通信,即消息从发起到响应的非实时处理的场景,它关注消息本身的堆积、分发、顺序等特性,聚焦于消息中间件本身的管控。而本发明实施例应用于分布式消息处理的一致性的场景,多用于金融领域和实时业务处理的场景,它关注的是业务数据在分布式微服务系统框架的一致性和完整性的管控。
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将所述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。实施例中的各功能单元、模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中,上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本申请的保护范围。上述系统中单元、模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
虽然本申请提供了如实施例或流程图的方法操作步骤,但基于常规或者无创造性的劳动可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的装置或客户端产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境)。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
图5是本发明实施例的计算机可读存储介质的功能框图。如图5所示,本发明实施例还提供了一种计算机可读存储介质200,计算机可读存储介质200内存储有计算机程序210,计算机程序210被处理器执行时实现上述分布式消息管理方法的各步骤。
所述集成的模块/单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。当然,还有其他方式的可读存储介质,例如量子存储器、石墨烯存储器等等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
本发明中应用了具体实施例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

Claims (5)

1.一种分布式消息管理系统,其特征在于,所述系统应用于实时业务处理的场景中,以实现消息有序性,所述消息有序性是指消息发送顺序与消息消费顺序一致,所述系统包括:
生产端,用于从目标消息的分片关键字字段中获取分片关键字,所述分片关键字包括:借据号,对所述借据号基于散列算法进行处理得到哈希值,以所述哈希值对消息代理的数量进行取模运算得到第一模值,将所述第一模值作为代表消息代理的服务访问链接的feign的索引号,根据所述feign的索引号从feign实例工厂中获取对应的feign实例,根据所述feign的索引号确定目标消息代理,通过所述feign实例与相应的目标消息代理通信,向所述目标消息代理发送所述目标消息;所述feign是spring-cloud微服务开源框架的一个技术组件;
消息代理集群,其包括多个消息代理,其中,多个消息代理中的所述目标消息代理接收所述目标消息,从所述目标消息的所述分片关键字字段中获取所述分片关键字,将所述借据号对消息队列中的子消息队列数量进行取模运算获得第二模值,根据所述第二模值确定目标子消息队列,向所述目标子消息队列发送所述目标消息;
消息队列,其包括多个子消息队列,其中,多个子消息队列中的所述目标子消息队列接收所述目标消息,从所述目标消息的所述分片关键字字段中获取所述分片关键字,根据所述分片关键字和消费端中用于存储有序消息的内存工作队列的数量,确定消费端中的目标内存工作队列,向所述目标内存工作队列发送目标消息;
消费端,其包括多个内存工作队列和多个线程,其中,多个内存工作队列中的所述目标内存工作队列对应的目标线程对所述目标消息进行消费;
其中,所述目标消息的报文格式包括:
消息标识字段,用于唯一地标识一项交易业务,被配置为交易流水号;
分片关键字字段,用于确定所述分片关键字;
队列名字段,用于确定消息队列的队列名;
消息体字段,用于记载所述目标消息的消息体;
其中,所述消息代理的部署模式包括:
所述消息代理包括多个分区,在至少一个分区中仅配置一台机器,在至少一个分区中配置多台机器,并且在配置多台机器的分区中,多台机器具有共同的服务器标识且运行相应的克隆实例,当任意一个分区中的机器宕机时,将待处理消息分流到其他正常的分区内的克隆实例未失效的机器上。
2.根据权利要求1所述的系统,其特征在于,所述目标子消息队列,具体用于根据所述借据号对消费端中用于存储有序消息的内存工作队列的数量进行取模运算获得第三模值,根据所述第三模值,确定消费端中的目标内存工作队列,向所述目标内存工作队列发送目标消息。
3.一种分布式消息管理方法,其特征在于,所述方法应用于实时业务处理的场景中,以实现消息有序性,所述消息有序性是指消息发送顺序与消息消费顺序一致,所述方法包括:
生产端从目标消息的分片关键字字段中获取分片关键字,所述分片关键字包括:借据号,对所述借据号基于散列算法进行处理得到哈希值,以所述哈希值对消息代理的数量进行取模运算得到第一模值,将所述第一模值作为代表消息代理的服务访问链接的feign的索引号,根据所述feign的索引号从feign实例工厂中获取对应的feign实例,根据所述feign的索引号确定目标消息代理,通过所述feign实例与相应的目标消息代理通信,向所述目标消息代理发送所述目标消息;所述feign是spring-cloud微服务开源框架的一个技术组件;
所述目标消息代理接收所述目标消息,从所述目标消息的所述分片关键字字段中获取所述分片关键字,将所述借据号对消息队列中的子消息队列数量进行取模运算获得第二模值,根据所述第二模值确定目标子消息队列,向所述目标子消息队列发送所述目标消息;
所述目标子消息队列接收所述目标消息,从所述目标消息的所述分片关键字字段中获取所述分片关键字,根据所述分片关键字和消费端中用于存储有序消息的内存工作队列的数量,确定消费端中的目标内存工作队列,向所述目标内存工作队列发送目标消息;
所述目标内存工作队列对应的目标线程对所述目标消息进行消费;
其中,所述目标消息的报文格式包括:
消息标识字段,用于唯一地标识一项交易业务,被配置为交易流水号;
分片关键字字段,用于确定所述分片关键字;
队列名字段,用于确定消息队列的队列名;
消息体字段,用于记载所述目标消息的消息体;
其中,所述消息代理的部署模式包括:
所述消息代理包括多个分区,在至少一个分区中仅配置一台机器,在至少一个分区中配置多台机器,并且在配置多台机器的分区中,多台机器具有共同的服务器标识且运行相应的克隆实例,当任意一个分区中的机器宕机时,将待处理消息分流到其他正常的分区内的克隆实例未失效的机器上。
4.根据权利要求3所述的方法,其特征在于,所述目标子消息队列根据所述借据号对消费端中用于存储有序消息的内存工作队列的数量进行取模运算获得第三模值,根据所述第三模值,确定消费端中的目标内存工作队列,向所述目标内存工作队列发送目标消息。
5.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求3或4所述的分布式消息管理方法。
CN202111614756.1A 2021-12-27 2021-12-27 一种分布式消息管理系统和方法 Active CN114253747B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111614756.1A CN114253747B (zh) 2021-12-27 2021-12-27 一种分布式消息管理系统和方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111614756.1A CN114253747B (zh) 2021-12-27 2021-12-27 一种分布式消息管理系统和方法

Publications (2)

Publication Number Publication Date
CN114253747A CN114253747A (zh) 2022-03-29
CN114253747B true CN114253747B (zh) 2023-04-28

Family

ID=80795253

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111614756.1A Active CN114253747B (zh) 2021-12-27 2021-12-27 一种分布式消息管理系统和方法

Country Status (1)

Country Link
CN (1) CN114253747B (zh)

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110851525A (zh) * 2018-07-24 2020-02-28 华为技术有限公司 一种数据分片方法、相关设备及计算机存储介质
CN111258723A (zh) * 2019-12-05 2020-06-09 东软集团股份有限公司 分布式系统的事务处理方法、装置、系统、介质及设备
CN113505012A (zh) * 2021-09-13 2021-10-15 北京宇信科技集团股份有限公司 一种消息队列的处理方法、介质、设备和系统
CN113760498A (zh) * 2021-01-15 2021-12-07 北京京东拓先科技有限公司 消息消费方法、装置、电子设备和计算机可读介质

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104468330B (zh) * 2014-12-03 2018-09-18 北京国双科技有限公司 分布式消息队列系统的数据处理方法和装置
CN109885410B (zh) * 2019-01-09 2021-04-13 广州视源电子科技股份有限公司 消息发送方法、装置、计算机设备和存储介质
CN112416614A (zh) * 2020-10-28 2021-02-26 网宿科技股份有限公司 基于消息队列的数据处理方法、系统及服务器
CN112988423A (zh) * 2021-03-19 2021-06-18 北京京东拓先科技有限公司 消息消费、消息分发方法、装置、服务器及存储介质

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110851525A (zh) * 2018-07-24 2020-02-28 华为技术有限公司 一种数据分片方法、相关设备及计算机存储介质
CN111258723A (zh) * 2019-12-05 2020-06-09 东软集团股份有限公司 分布式系统的事务处理方法、装置、系统、介质及设备
CN113760498A (zh) * 2021-01-15 2021-12-07 北京京东拓先科技有限公司 消息消费方法、装置、电子设备和计算机可读介质
CN113505012A (zh) * 2021-09-13 2021-10-15 北京宇信科技集团股份有限公司 一种消息队列的处理方法、介质、设备和系统

Also Published As

Publication number Publication date
CN114253747A (zh) 2022-03-29

Similar Documents

Publication Publication Date Title
CN107087019B (zh) 一种基于端云协同计算架构的任务调度方法及装置
CN102469033B (zh) 一种消息订阅系统以及消息发送方法
CN107172187B (zh) 一种负载均衡系统和方法
CN111190714B (zh) 一种基于区块链的云计算任务调度系统及方法
EP2321937B1 (en) Load balancing for services
CN110677277B (zh) 数据处理方法、装置、服务器和计算机可读存储介质
CN111182025B (zh) 一种报文处理方法、装置、服务器及存储介质
US8135785B2 (en) System and method for processing messages using pluggable protocol processors in a service-oriented pipeline architecture
US8606908B2 (en) Wake-up server
CN114710571B (zh) 数据包处理系统
CN113259415B (zh) 一种网络报文处理方法、装置及网络服务器
CN110213338A (zh) 一种基于加密运算的集群化加速计算方法及系统
CN108055296B (zh) 一种基于微服务架构的事务处理方法及装置
CN109327321B (zh) 网络模型业务执行方法、装置、sdn控制器及可读存储介质
CN113556359B (zh) 一种通讯协议转换方法、设备、系统及网关设备
CN114185582A (zh) 基于quic协议的汽车软件在线升级系统及方法
CN113971098A (zh) 一种RabbitMQ消费管理方法及系统
CN114253747B (zh) 一种分布式消息管理系统和方法
CN111988283A (zh) 数据传输方法、系统、装置及计算机可读存储介质
CN108259527B (zh) 基于代理的业务处理方法、装置及网元设备
CN117014445B (zh) 一种基于区块链的数据处理方法、装置、设备及存储介质
CN115509709B (zh) 任务分配方法、装置、电子设备及计算机存储介质
US20230153159A1 (en) Hardware Accelerator Service Aggregation
CN117633102A (zh) 区块链的数据整合方法、装置、计算机设备及存储介质
CN113485811A (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