一种基于Kafka大消息可靠传输方法及系统与流程

文档序号:16900021发布日期:2019-02-19 17:53阅读:813来源:国知局
一种基于Kafka大消息可靠传输方法及系统与流程

本发明属于分布式系统节点间通信技术领域,具体涉及一种基于kafka大消息可靠传输方法及系统。



背景技术:

kafka是一种分布式发布-订阅消息系统,最初由linkedin公司开发,使用scala语言编写,之后成为apache项目的一部分。kafka消息系统主要由生产者、代理者和消费者组成。生产者负责产生消息发送给代理者,代理者对消息做暂时存储,之后转发给消费者,消费者接收并处理消息。为保证传输消息的可靠性,即消息传输过程中不会出现内容错误或者漏传,kafka使用crc循环校验检验消息是否有误。在不通过crc循环校验时,消息会被重新传输,直至消息准确无误。

在这种消息传输模式下,kafka传输较小消息时效率较高,官方文档显示10kb左右消息时,效率最高。但是在一些需要传输大消息的应用场景下,如传输视频、大型归档文件,很多网络资源浪费在重传上,导致消息传输效率低下,kafka不能完全满足数据发布与订阅需求。



技术实现要素:

针对上述存在的问题,本发明提出一种基于kafka大消息可靠传输方法及系统,以解决现有kafka传输大消息时效率低下的问题。

为实现上述目的,本发明具体技术方案如下:一种基于kafka大消息可靠传输方法,包括以下步骤:

1)发送方创建消息分片器;

2)发送方发送原始消息到消息分片器;

3)消息分片器创建生产者;

4)消息分片器将原始消息分解为小消息;

5)消息分片器将小消息经生产者发送给kafka集群;

6)kafka集群对分片消息进行分布式存储;

7)接收方创建消息组成器;

8)消息组成器创建消费者;

9)消费者向kafka集群订阅消息;

10)kafka集群将小消息发送给消费者;

11)消息组成器从消费者接收小消息;

12)消息组成器将小消息拼接成原始消息;

13)消息组成器将原始消息发送给接收方。

进一步地,上述步骤4)中,将原始消息分解为小消息包括以下步骤:

4.1)消息分片器利用md5消息摘要算法计算消息标识码;

4.2)消息分片器将原始消息分割为分片消息;如果原始消息大于分片阈值n将原始消息按照分片阈值n分成多个分片消息,如果原始消息小于或等于分片阈值n则原始消息直接作为分片消息;

4.3)消息分片器为每一个分片消息生成消息头;

4.4)消息分片器将消息头拼接到分片消息之前,得到小消息。

进一步地,上述步骤12)中,将小消息拼接成原始消息包括以下步骤:

12.1)消息组成器拆分小消息,即将小消息拆分为消息头和分片消息;

12.2)识别消息头分片标志字段,如果消息头分片标志字段值为0,分片消息就是原始消息转步骤13);如果消息头分片标志字段值为1,转步骤12.3);

12.3)识别消息头标识字段,根据标识字段的值查询分片消息映射表,如果存在该标识字段的值对应的分片消息链表,转步骤12.4),如果不存在则新建分片消息链表,转步骤12.4);

12.4)识别消息头片偏移字段;根据片偏移字段的值将分片消息插入到分片消息链表的对应位置;

12.5)识别消息头结束标志字段;如果结束标志字段值为1,将该分片消息的片偏移字段的值加1记录在分片个数映射表中;

12.6)判断分片消息链表的大小是否等于原始消息分片数,如果相等,转步骤12.7),如果不等,转步骤11);

12.7)按分片消息链表中分片消息的排列顺序拼接分片消息链表中的分片消息,还原成原始消息。

进一步地,上述步骤4.3)中,所述消息头包含标识、分片标志、片偏移、结束标志4个字段;其中,标识字段用于标识分片消息与原始消息的对应关系,同一原始消息的各分片的标识字段相同,值为原始消息的消息标识码;分片标志字段用于标识原始消息是否进行过分片;结束标志字段用于标识该分片是否是原始消息的最后一个分片;片偏移字段用于标识该分片是原始消息的第几个分片。

进一步地,上述步骤12.3)中所述分片消息映射表为一个标识码对应一个分片消息链表的结构,用于存储不同原始消息对应的分片消息;分片消息链表为多个分片消息按顺序首尾相接的结构,用于存储同一原始消息下的各个分片消息。

进一步地,上述步骤12.5)中所述分片个数映射表为一个标识码对应一个分片个数的结构,用于记录每一个原始消息的分片个数。

本发明还提供一种基于kafka的大消息可靠传输系统,包括消息分片器、生产者、kafka集群、消费者和消息组成器;其中,消息分片器由发送方创建,用于将发送方发送的原始消息分解为小消息、创建生产者以及将小消息发送给生产者;生产者由消息分片器创建,用于接收消息分片器的小消息并发送给kafka集群;kafka集群用于分布式存储生产者发送来的小消息、响应消费者请求并将小消息发送给消费者;消费者由消息组成器创建,用于从kafka集群接收小消息并将小消息发送到消息组成器;消息组成器由接收方创建,用于创建消费者、从消费者接收小消息并将小消息拼接为原始消息。

与现有技术相比,本发明具备海量实时通信能力;在传输大消息时,避免了消息出错导致的大量重传,节约了网络资源浪费,极大的提高了kafka对大消息的吞吐率;在传输较小消息时和现有kafka系统吞吐率一致;同时保证了消息传输的可靠性,即发送的消息不会丢失,接收的消息不会出错。

附图说明

图1基于kafka的大消息可靠传输系统结构示意图。

图2大消息可靠传输方法流程图。

图3消息头字段结构示意图。

图4小消息拼接成原始消息示意图。

具体实施方式

下面结合附图以及具体实施例对本发明作进一步的说明,需要指出的是,下面仅以一种最优化的技术方案对本发明的技术方案以及设计原理进行详细阐述,但本发明的保护范围并不限于此。

所述实施例为本发明的优选的实施方式,但本发明并不限于上述实施方式,在不背离本发明的实质内容的情况下,本领域技术人员能够做出的任何显而易见的改进、替换或变型均属于本发明的保护范围。

图1所示是基于kafka的大消息可靠传输系统示意图,系统包括消息分片器、生产者、kafka集群、消费者和消息组成器;

其中,消息分片器由发送方创建,用于将发送方发送的原始消息分解为小消息、创建生产者以及将小消息发送给生产者;

生产者由消息分片器创建,用于接收消息分片器的小消息并发送给kafka集群;

kafka集群用于分布式存储生产者发送来的小消息、响应消费者请求并将小消息发送给消费者;

消费者由消息组成器创建,用于从kafka集群接收小消息并将小消息发送到消息组成器;

消息组成器由接收方创建,用于创建消费者、从消费者接收小消息并将小消息拼接为原始消息;

图2所示为大消息可靠传输方法流程图;发送方发送消息到接收方接收消息的过程包括如下步骤:

1)发送方创建消息分片器;

2)发送方发送原始消息到消息分片器;

3)消息分片器创建生产者;

4)消息分片器将原始消息分解为小消息;将原始消息分解为小消息包括以下步骤:

4.1)消息分片器利用md5消息摘要算法计算消息标识码;本发明具体实施中,消息标识码使用md5码,md5码由md5消息摘要算法计算得到,为32位;

4.2)消息分片器将原始消息分割为分片消息;如果原始消息大于分片阈值n将原始消息按照分片阈值n分成多个分片消息,如果原始消息小于或等于分片阈值n则原始消息直接作为分片消息;本发明具体实施例中,分片阈值n为10kb;

4.3)消息分片器为每一个分片消息生成消息头;消息头包含标识、分片标志、片偏移、结束标志4个字段;其中,标识字段用于标识分片消息与原始消息的对应关系,同一原始消息的各分片的标识字段相同,值为原始消息的消息标识码;分片标志字段用于标识原始消息是否进行过分片;结束标志字段用于标识该分片是否是原始消息的最后一个分片;片偏移字段用于标识该分片是原始消息的第几个分片;

本发明具体实施中消息头为48位,消息头结构如图3所示;消息头的第0到第13位是片偏移字段,片偏移字段的值为分片消息的开始字节的序号除以分片阈值n;消息头第14位是结束标志字段,如果结束标志字段值为1表示该分片是原始消息的最后一个分片,此时,该分片的偏移字段值加1表示了原始消息的分片个数,如果结束标志字段值为0表示该分片之后还有其余分片;消息头第15位是分片标志字段,如果该字段值为0表示该分片就是原始消息,如果为1表示原始消息还有其它分片;消息头第16位到第47位是标识字段,标识字段的值是原始消息的消息标识码;

4.4)消息分片器将消息头拼接到分片消息之前,得到小消息;

5)消息分片器将小消息经生产者发送给kafka集群;

6)kafka集群对分片消息进行分布式存储;

7)接收方创建消息组成器;

8)消息组成器创建消费者;

9)消费者向kafka集群订阅消息;

10)kafka集群将小消息发送给消费者;

11)消息组成器从消费者接收小消息;

12)消息组成器将小消息拼接成原始消息;拼接操作的示意图如图4所示;其中,小消息拼接成原始消息包括以下步骤:

12.1)消息组成器拆分小消息,即将小消息拆分为消息头和分片消息;在具体实施例中,拆分操作是将小消息的前48位提取为消息头,其余部分提取为分片消息;

12.2)识别消息头分片标志字段,如果消息头分片标志字段值为0,分片消息就是原始消息转步骤13);如果消息头分片标志字段值为1,转步骤12.3);

12.3)识别消息头标识字段,根据标识字段的值查询分片消息映射表,如果存在该标识字段的值对应的分片消息链表,转步骤12.4),如果不存在则新建分片消息链表,转步骤12.4);其中,分片消息映射表为一个标识码对应一个分片消息链表的结构,用于存储不同原始消息对应的分片消息;分片消息链表为多个分片消息按顺序首尾相接的结构,用于存储同一原始消息下的各个分片消息;

12.4)识别消息头片偏移字段;根据片偏移字段的值将分片消息插入到分片消息链表的对应位置;

12.5)识别消息头结束标志字段;如果结束标志字段值为1,将该分片消息的片偏移字段的值加1记录在分片个数映射表中;分片个数映射表为一个标识码对应一个分片个数的结构,用于记录每一个原始消息的分片个数;

12.6)判断分片消息链表的大小是否等于原始消息分片数;如果相等,转步骤12.7),如果不等,转步骤11);

12.7)拼接分片消息链表中的分片消息,还原成原始消息;拼接操作按分片消息链表中分片消息的排列顺序执行;

13)消息组成器将原始消息发送给接收方。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1