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

一种基于Kafka的消息分类和访问控制方法及系统

文献发布时间:2024-04-18 19:58:53


一种基于Kafka的消息分类和访问控制方法及系统

技术领域

本发明涉及数据处理技术领域,尤其涉及一种基于Kafka的消息分类和访问控制方法及系统。

背景技术

Kafka是一种分布式流处理平台,能够处理大量实时数据流,可作为同步消息系统在多应用间传输数据,解决数据分发问题。Kafka在角色上分为producer(生产者)、broker(Kafka server)、consumer(消费者),生产者可以对数据进行发布,由broker进行数据队列存储,而消费者则通过向broker订阅数据,有序接收生产者发布的数据。在Kafka中,设置了Topic的概念进行数据分类,不同Topic之间的数据无关联,生产者和消费者可自由选择向哪些Topic发布数据和从哪些Topic中订阅数据。Kafka的使用和控制过程通常由应用根据自身业务情况配置定义Topic数据分类,对于Kafka目前流行的版本而言,通过第三方的zookeeper组件维护元数据,Topic过多时可能导致性能严重下降的问题。Kafka数据发送支持基本类型和字符串数据,而在应用开发时通常需要使用具备数据结构的数据类型,这就要求应用使用Kafka必须实现一种消息格式定义和解析机制,如JSON、Protobuf等。

现有消息格式定义和解析机制存在性能较差、接入难度和成本较高、数据结构变更后难以实现不同应用统一变更等问题。因此,对于跨语言、跨平台场景下复杂系统的多应用架构,有必要构建一种先进的消息分类和访问控制机制,实现数据格式统一定义和变更、数据结构统一管理和维护以及多应用间数据消息高效、准确分发。

发明内容

有鉴于此,为解决跨语言、跨平台的复杂系统架构下,应用之间使用Kafka通信时,通信性能低且数据分类、数据类型、发布订阅消息等难以统一管理维护的问题,有必要实现复杂系统架构下的应用快速集成和统一维护,提高应用间通信时数据消息吞吐量和性能。

本发明是通过以下技术方案得以实现的:

一种基于Kafka的消息分类和访问控制方法,包括以下步骤:

S1:通过定义长度描述字段和动态长度数组实现对动态长度数据消息的定义,同时实现对语言数据结构定义;

S2:根据所述语言数据结构定义,对所述数据消息的数组长度进行二进制编码生成二进制序列,即编码消息;

S3:对划分到Kafka Topic的数据类型通过二级分类方式对所述编码消息进行分类,产生分类消息;

S4:根据选定的读取长度,对所述分类消息进行解码。

进一步地,所述步骤S1,进一步包括:

所述语言数据结构定义通过对至少一种计算机语言的数据类型的底层二进制存储内容的关系整理,形成所述数据类型的固定映射关系和计算机语言兼容。

进一步地,所述步骤S2,进一步包括:

根据所述语言数据结构定义,对所述数据消息的所述数据类型进行逐个字段解析,根据所述字段进行二进制数据编码后,再对所述二进制数据编码进行组装,对于复杂嵌套数据结构定义,进行循环递归解析,所述组装数据紧密排列为二进制序列。

进一步地,所述步骤S3,进一步包括:

通过将所述编码消息划分到一个以上的Kafka Topic中实现数据一级分类;

对于划分到同一Kafka Topic下的消息,根据所述数据类型先进行消息包头定义,再使用二进制位控制进行数据二级分类。

进一步地,所述步骤S4,进一步包括:

选定的读取长度,根据所述读取长度计算所述分类消息的数组总长度,再按所述数组总长度逐个字节读取进行解码。

一种基于Kafka的消息分类和访问控制系统,包括:

数据消息写入模块,用于生产者在所述系统中初始化SDK,注册发送消息类型,生产者根据所述消息类型的业务逻辑,将数据写入结构体后调用消息发送API,所述SDK收到所述数据后,对所述数据进行包括分类、编码、标记、转换、压缩在内的操作,生成所述编码后的二进制数据,对所述二进制数据进行分类,产生分类消息;

数据消息发布订阅访问控制模块,用于消费者在启动时调用所述初始化SDK,注册需要消费的数据类型,与Kafka建立通讯连接,同时订阅需要消费的Topic,在所述数据到达所述SDK端时,所述SDK对所述分类消息,即所述二进制序列化数据进行解码,输出解码消息,同时根据不同Topic来源对所述解码消息进行结构化转换,通过回调将所述转换后的所述解码消息传入最终消费者;

集群代理偏斜重平衡模块,用于通过捕获所述Kafka集群的现有配置和偏斜代理执行重分配过程。

进一步地,所述数据消息发布订阅访问控制模块,进一步包括:

所述消费者通过订阅Kafka Topic,解析所述分类消息的二进制包头,读取并解析所述分类消息的数据类型,实现对不同类型数据消息的解析和消费。

进一步地,所述数据消息发布订阅访问控制模块,进一步包括:

通过对所述数据消息发布和订阅访问模块的定义和封装,实现一种消息发布订阅访问控制SDK,应用通过集成所述SDK,并访问所述SDK的所述API,实现所述结构化数据的访问和订阅。

进一步地,所述数据消息发布订阅访问控制模块,进一步包括:

所述一种消息发布订阅访问控制SDK,用于对所述应用的数据进行校验、阈值控制、统计监控、数据持久化和流量控制,实现所述应用间数据传输处理和对快速迭代应用中的数据结构和API统一更新维护管理。

进一步地,所述集群代理偏斜重平衡方法,进一步包括:

通过捕获Kafka集群的现有配置和偏斜代理,用于获取每个代理的分区情况,计算所述每个代理的最佳分区数,然后迭代计算形成重新分配分区的路径,并根据所述路径执行重分配过程。

与现有技术相比,本发明的有益效果是:

(1)本发明通过对数据消息定义消息包头,实现了数据消息的二级分类,解决了单一级别的分类在消息类型过多的情况下可能导致的潜在性能问题。

(2)通过对多语言数据类型进行二进制的编码解码,实现了多语言应用间通信时复杂数据结构、动态长度数据结构编码解析方法,解决了多语言应用消息通信时使用JSON等数据结构性能较低的问题。

(3)通过定义多种数据发送、订阅访问方法,并封装为多语言的消息通信SDK,实现了多语言应用的快速集成SDK,并通过SDK进行消息的访问控制和统一管理维护,解决了应用直接集成Kafka后可能导致复杂系统架构下难以进行统一的管理控制、维护升级的问题。

(4)通过设计代理偏斜重平衡方法,实现了捕获Kafka集群配置根据配置情况迭代计算分区重平衡路径,降低Kafka代理负载压力,避免潜在的性能问题,提高消息吞吐量。

附图说明

通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方案的目的,而并不认为是对本发明的限制。

图1为本发明的一种基于Kafka的消息分类和访问控制方法及系统的流程图;

图2为本发明的一种SDK对结构化数据序列化为二进制数据和反解析为结构对象的方法示意图;

图3为本发明的一种的应用进行数据发布和数据订阅接收的流程示意图;

图4为本发明的一种消息包头定义图;

图5为本发明的一种代理偏斜重平衡方法的流程示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。

第一实施例

请参阅图1所示,本实施例提供的一种基于Kafka的消息分类和访问控制方法的具体实施例,包括以下步骤:

S1:通过定义长度描述字段和动态长度数组实现对动态长度数据消息的定义,同时实现对语言数据结构定义,具体地,在本实施例中通过定义长度描述字段和动态长度数组,能够进一步实现动态长度基础类型和复杂结构体数组的数据消息的定义,数据消息的数据结构由整型(short、int、long)、浮点型(float、double)、布尔型(bool)、字符型(char)等基本结构组成,由这些结构可以组成array(数组,可以认为是固定长度的数据集合)、vector(变长的数据集合);

S2:根据语言数据结构定义,对数据消息的数组长度进行二进制编码生成二进制序列,即编码消息;

S3:对划分到Kafka Topic的数据类型通过二级分类方式对编码消息进行分类,产生分类消息,具体地,在本实施例中,采用二级分类方式对多应用间通信消息进行分类,即多应用间通信数据消息二级分类方法采用了二级分类的方式,将消息划分到多个不同的一级分类下,同时对于一级分类后的消息再进行细分,实现应用数据消息的二级分类,使得消息在传输和消费过程中更具有针对性和可靠性,保证消息在运输和消费过程中给更具有针对性和可靠性;

S4:根据选定的读取长度,对分类消息进行解码。

进一步地,步骤S1,进一步包括:

语言数据结构定义通过对至少一种计算机语言的数据类型的底层二进制存储内容的关系整理,形成数据类型的固定映射关系和计算机语言兼容,具体地,在本实施例中,通过对C++、JAVA、C#等多语言基础类型关系整理,形成固定映射关系,实现基础数据类型不同语言的兼容。

进一步地,步骤S2,进一步包括:

根据语言数据结构定义,对数据消息的数据类型进行逐个字段解析,根据字段进行二进制数据编码后,再对二进制数据编码进行组装,对于复杂嵌套数据结构定义,进行循环递归解析,组装数据紧密排列为二进制序列,具体地,在本实施例中,根据数据结构体的定义,逐个字段解析基础类型数据,并进行二进制的数据组装,对于复杂的嵌套数据结构定义,进行循环递归解析,在数据编码过程中对基础数据类型统一字节序,确保一个基础类型编码为二进制后必然是固定的二进制序列,由于不同平台,不同语言环境下可能存在原生而大小端、字节长度差异,因此该方法以统一的大小端标准和统一的字节长度对基础类型进行编码,同时在二进制中进行紧密的字节编排组织;该方法进行数据解析的过程是基于已知的数据结构,逐字段按固定长度去二进制数据中读取定长的数据,再解析映射为对应的基础数据类型、动态长度数组等结构。

进一步地,步骤S3,进一步包括:

通过将编码消息划分到一个以上的Kafka Topic中实现数据一级分类;

对于划分到同一Kafka Topic下的消息,根据数据类型先进行消息包头定义,再使用二进制位控制进行数据二级分类。

优选地,在数据生产者根据消息类型、消息特征、消息数据量大小和消息发送频率等因素,将数据消息划分到多个不同的Kafka Topic中实现数据的一级分类,对于划分到同一Kafka Topic下的消息,根据消息类型先进行消息包头定义,再使用二进制位控制进行数据二级分类,在数据消费端,通过订阅Kafka Topic,解析消息的二进制包头,读取并解析消息的数据类型,实现对不同类型数据消息的解析和消费。

进一步地,步骤S4,进一步包括:

选定的读取长度,根据读取长度计算分类消息的数组总长度,再按数组总长度逐个字节读取进行解码,具体地,在本实施例中,通过对不同语言基础数据类型底层二进制存储内容整理映射,实现多语言基础类型的编码解析,进而实现对复杂数据结构、动态长度数组封装和编码解析,在数据解码过程中对基础数据类型统一字节序,其他语言可从二进制序列中使用固定长度在固定的偏移位置反向解析为基础数据,从而确保能够被其他语言正确解析。

第二实施例

本实施例还提供了一种基于Kafka的消息分类和访问控制系统,用于执行以上第一实施例中的方法,具体包括:

数据消息写入模块,用于生产者在系统中初始化SDK,注册发送消息类型,生产者根据消息类型的业务逻辑,将数据写入结构体后调用消息发送API,SDK收到数据后,对数据进行包括分类、编码、标记、转换、压缩在内的操作,生成编码后的二进制数据,对二进制数据进行分类,产生分类消息;

数据消息发布订阅访问控制模块,用于消费者在启动时调用初始化SDK,注册需要消费的数据类型,与Kafka建立通讯连接,同时订阅需要消费的Topic,在数据到达SDK端时,SDK对分类消息,即二进制序列化数据进行解码,输出解码消息,同时根据不同Topic来源对解码消息进行结构化转换,通过回调将转换后的解码消息传入最终消费者;

优选地,同一个一级分类的消息中会有多种类型的数据,因此消息的数据长度、数据结构都会存在差异,而消费端接收到数据消息后,需要解析数据类型,并根据数据类型进行结构化解析操作。为实现数据的类型定义和识别,该方法设计了数据类型映射表,并基于映射表对应用消息体进行进一步包装,通过定长的消息包头定义该消息的数据类型和数据的属性。

参考图2、图3所示,通过SDK实现数据写入具体为:

1、消息的生产者(如应用A)在系统中初始化SDK,注册需要发送的消息类型;

2、生产者根据业务逻辑,产生数据将数据写入相应结构体中;

3、生产者调用消息发送API;

4、SDK收到生产者发送的数据后,进行分类、编码、标记、转换、压缩等一系列操作后,最终形成一个编码后的二进制的数据;

5、SDK根据消息的具体类型,计算其所属的一级分类,并根据一级分类获取相应映射的Kafka Topic;

6、SDK根据消息的具体类型,计算其所属的二级分类,然后组装消息包头;

7、SDK将6中的消息包头数据和4中的二进制数据写入消息对应的Kafka Topic,完成数据写入。

参考图3所示,通过SDK实现数据消息发布订阅接收流程具体为:

1、数据消费方在系统中初始化SDK,注册需要消费的数据类型;

2、消费方根据自身业务需求,实现对应数据的回调函数,在回调函数中需要实现其对回调数据的处理逻辑;

3、消费方在系统中调用SDK的API,注册该回调函数;

4、消费方启动SDK;

5、SDK收到Kafka的消息后,计算当前消息所属的一级分类;

6、SDK根据读取消息的包头,计算其二级分类类型;

7、SDK根据消息的二级分类类型进行消息的解压缩、类型解析、数据分类、解码、数据结构化等操作,最终将消息转换封装为对应数据结构数据对象;

8、SDK调用消费方在3中的注册的回调函数,将数据结构对象发送给回调函数;

9、进入业务回调逻辑,业务在回调函数中对数据进行处理;

10、SDK继续监听Kafka的消息。

参考图4所示,包头共10字节,消费端在接收到数据消息后,会首先解析消息的包头结构,然后根据包头中的Type和SubType去调用不同类型的消息解析函数,从而完成数据的二级分类。

集群代理偏斜重平衡模块,用于通过捕获Kafka集群的现有配置和偏斜代理执行重分配过程。

进一步地,数据消息发布订阅访问控制模块,进一步包括:

消费者通过订阅Kafka Topic,解析分类消息的二进制包头,读取并解析分类消息的数据类型,实现对不同类型数据消息的解析和消费。

进一步地,数据消息发布订阅访问控制模块,进一步包括:

通过对数据消息发布和订阅访问模块的定义和封装,实现一种消息发布订阅访问控制SDK,应用通过集成SDK,并访问SDK的API,实现结构化数据的访问和订阅,具体地,在本实施例中,通过多种数据发布和订阅访问方法的定义和封装,实现一种消息发布订阅访问控制SDK,可快速便捷地发布和订阅结构化的数据对象。

进一步地,数据消息发布订阅访问控制模块,进一步包括:

一种消息发布订阅访问控制SDK,用于对应用的数据进行校验、阈值控制、统计监控、数据持久化和流量控制,实现应用间数据传输处理和对快速迭代应用中的数据结构和API统一更新维护管理具体地,在本实施例中,通过SDK对应用数据进行校验、阈值控制、统计监控、数据持久化和流量控制,实现多应用间数据传输处理,保证数据传输处理过程安全、准确和高效,同时,通过SDK实现统一的数据结构更新、API更新操作,解决快速迭代的应用系统数据结构难以统一维护管理的问题,提升系统可维护性和开发效率。

更优地,多语言消息发布和订阅访问控制模块设计了基于Kafka的多语言跨平台SDK,将结构化数据对象的发布和订阅、数据校验、加解密、持久化、流量控制等操作集成到一个框架中,为应用提供一种简单易用的数据访问控制方法,并实现了对数据的全面管理和控制。SDK实现了对数据的统一定义、编码和解析,统一基础数据类型、动态长度的数组的按字节编码和解析方法,因此通过跨语言的算法实现可以完成消息跨语言的解析,故具有较好的跨平台、跨语言兼容性;同时,SDK实现统一的数据结构更新、API更新操作,解决快速迭代的应用系统数据结构难以统一维护管理的问题,提升系统可维护性和开发效率。

进一步地,集群代理偏斜重平衡模块,进一步包括:

通过捕获Kafka集群的现有配置和偏斜代理,用于获取每个代理的分区情况,计算每个代理的最佳分区数,然后迭代计算形成重新分配分区的路径,并根据路径执行重分配过程,降低Kafka代理负载压力,避免潜在的性能问题,提高消息吞吐量。

参考图5所示,代理偏斜重平衡模块实现的流程,具体为:

1、从用户处获取必须重新平衡的Topic的输入;

2、捕获Kafka集群的现有配置,并确定特定Topic偏离的代理,这些信息应该包括每个代理的分区数(NOP)、分区和Leader分区的数量;

3、计算每个代理的最佳分区数(ONOP),根据最佳分区数=所有代理的分区总数/代理的总数进行计算;

4、迭代形成重新分配分区的路径,使分区从NOP>ONOP的代理移动到NOP

5、将信息输出到一个JSON文件中,并将该文件作为Kafka提供的分区分配工具的输入,执行分区重新分配。

SDK提供跨语言跨平台应用的能力,包括几个方面:

SDK实现方面,SDK实现了多语言多平台的版本,包括Java、C#、C++语言遗迹Linux、Windows平台;消息通信方面,SDK实现了对数据的统一定义、编码和解析,统一基础数据类型、动态长度的数组的按字节编码和解析方法,因此通过跨语言的算法实现可以完成消息跨语言的解析。

最后应说明的是:以上仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

技术分类

06120116510946