一种消息处理装置和方法与流程

文档序号:12600481阅读:196来源:国知局
一种消息处理装置和方法与流程

本发明涉及计算机数据处理的技术领域,特别涉及一种消息处理装置和方法。



背景技术:

Kafka是一种高吞吐量的分布式发布订阅消息系统。如图1所示,现有的基于Kafka的消息处理系统,包括由多个消息生产者(Producer)组成的消息生产者集群、由多个服务器(Broker)组成的Kafka集群、由多个消费者(Consumer)组成的消费者集群,每个消息生产者向一个或多个Broker服务器推送(push)消息,每个Broker服务器按照一定的主题(Topic)存储消息,每个消费者向一个或多个Broker服务器拉取(pull)订阅的消息,通过Zookeeper(管理员)节点管理Broker服务器与消费者的动态加入与离开。同一主题内部的消息按照一定的key和算法被分区(Partition)存储在不同的Broker服务器上,针对一个主题,Kafka消息日志中采用偏移量(Offset)信息来标注已读取的消息的位置,消费者通过Offset信息,来判断下次读取的消息在消息日志里的起始位置。

另外,在Kafka系统中,每个主题创建时,需要固定该主题的分区数。在某一时刻,一个分区只能被一个消费者线程来消费,这就会限制消费速率。为了提高吞吐量,消费者需要采用多线程处理。采用多线程处理时,每个消费者通常由一个主线程读取一批消息并执行分组操作,然后,由多个子线程处理相应的分组消息,各个子线程处理完相应的分组消息后,分别上报偏移量信息。但是,消费者可能存在宕机、断电、程序异常等等造成处理消息失败的情况,此时,需要重启消费者应用,重新从Broker服务器读取消息,这样,不仅会产生重复消费数据的问题,还会产生子线程重复提交或覆盖提交Offset信息的问题。



技术实现要素:

为了解决上述技术问题,本发明提供了一种消息处理装置和方法,能够提高Kafka系统中,消费者消息处理的准确性,提高消费者客户端的吞吐量。

为了达到本发明目的,本发明实施例的技术方案是这样实现的:

本发明实施例提供了一种消息处理装置,包括读取模块、备份模块、上报模块和处理模块;其中,

读取模块,用于读取消费者从服务器订阅的消息;复制读取的消息并存储至备份模块,并通知上报模块;

备份模块,用于存储读取模块读取的消息;

上报模块,用于接收到来自读取模块的通知,上报偏移量信息并通知处理模块;

处理模块,其中设置有多个子线程;用于接收到来自上报模块的通知,读取备份模块中未处理的消息,将未处理的消息分派到各个子线程中;通过各个子线程处理完分派的消息,将已处理的消息从备份模块中删除或在备份模块中为已处理的消息设置已处理标识。

进一步地,还包括检测模块,用于检测到消费者重启时,检查所述备份模块中是否有未处理的消息;如果有未处理的消息,将未处理的消息提交给所述处理模块进行处理。

进一步地,所述备份模块通过日志文件或数据库存储读取模块读取的消息。

进一步地,所述备份模块预先设置其存储容量最大值。

进一步地,所述读取模块预先设置每次读取的消息数量和每条消息的最大字节数。

本发明实施例提供了一种消息处理方法,包括如下步骤:

读取消费者从服务器订阅的消息;复制并存储读取的消息;

上报偏移量信息;

将存储的消息中未处理的消息分配给预先设置的多个子线程进行处理,并删除或标识出已处理的消息。

进一步地,如果消费者重启,检测所述存储的消息中是否有未处理的信息,如果有,对未处理的消息进行处理。

进一步地,预先设置每次读取的消息数量和每条消息的最大字节数。

进一步地,通过日志文件或数据库存储所述读取的消息。

进一步地,预先设置所述存储的消息的存储容量最大值。

本发明提供的消息处理装置和方法,在消费者读取完消息后,先将所读取的消息复制到备份消息中,然后向Zookeeper节点上报偏移量信息;然后再创建多个子线程,并将所读取的消息分派到各个子线程中,由各个子线程处理所读取的消息;子线程处理完消息后,在备份消息中记录处理结果。本发明在消费者宕机、断电、程序异常等造成消费者处理消息失败的情况下,由于主线程在各子线程处理消息之前,已经向Zookeeper节点上报偏移量信息,该消费者重启后或者新的消费者不会读取该消费者已经读取的消息,且子线程不负责上报偏移量信息,因此不会产生消费者重复消费数据、子线程重复提交Offset信息或覆盖提交Offset信息的问题;另外通过多线程处理,提高了消费者客户端的吞吐量。

进一步地,每次消费者重启,都会检测备份消息中是否有未处理的信息,如果有未处理的消息,对未处理的消息进行处理。由于消费者每次重启后,都会检测备份消息中的消息处理情况,因此不会造成有消息永远没有被处理到的情况,提高了消费者消息处理的精准度。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1为现有的基于Kafka的消息处理系统的结构示意图;

图2为本发明的消息处理装置的第一实施例的结构示意图;

图3为本发明的消息处理装置的第二实施例的结构示意图;

图4为本发明的一种消息处理方法的流程示意图。

具体实施方式

下面将结合附图及实施例对本发明的技术方案进行更详细的说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

如图2所示,根据本发明的第一种基于Kafka的消息处理装置,包括读取模块、备份模块、上报模块和处理模块;

其中,读取模块,用于读取消费者从服务器订阅的消息;复制读取的消息并存储至备份模块,并通知上报模块;

备份模块,用于存储读取模块读取的消息;

上报模块,用于接收到来自读取模块的通知,向Zookeeper节点上报偏移量信息并通知处理模块;

处理模块,其中设置有多个子线程;用于接收到来自上报模块的通知,读取备份模块中未处理的消息,将备份模块中未处理的消息分派到各个子线程中;通过各个子线程对分派的消息进行处理,并将已处理的消息从备份模块中删除,或在备份模块中为已处理的消息设置已处理标识。

可选地,备份模块可以通过日志文件或数据库存储读取模块读取的消息。

可选地,读取模块每次读取的消息数量和每条消息的最大字节数,可以预先设置。

作为优选的实施方式,备份模块可以预先设置其存储容量最大值。当备份模块当前存储的消息容量已经达到存储容量最大值时,要存储的新的消息会覆盖掉当前消息中时间最早且已经处理的消息。备份模块的存储容量最大值的大小,主要影响消费者重启、宕机或程序异常时,消息丢失的多少。

本发明的基于Kafka的消息处理装置,在消费者宕机、断电、程序异常等造成处理消息失败的情况下,由于该消费者的主线程在各子线程处理消息之前,已经向Zookeeper节点上报偏移量信息,该消费者重启后或者新的消费者不会读取该消费者已经读取的消息,且子线程不负责上报偏移量信息,因此不会产生消费者重复消费数据、子线程重复提交Offset或覆盖提交Offset的问题;另外通过多线程处理,提高了消费者客户端的吞吐量。

进一步地,如图3所示,根据本发明的第二种基于Kafka的消息处理装置,包括读取模块、备份模块、上报模块、处理模块和检测模块;

其中,读取模块,用于读取消费者从服务器订阅的消息;复制读取的消息并存储至备份模块,并通知上报模块;

备份模块,用于存储读取模块读取的消息;

上报模块,用于接收到来自读取模块的通知,向Zookeeper节点上报偏移量信息并通知处理模块;

处理模块,其中设置有多个子线程;用于接收到来自上报模块或检测模块的通知,读取备份模块中未处理的消息,将备份模块中未处理的消息分派到各个子线程中;通过各个子线程对分派的消息进行处理,并将已处理的消息从备份模块中删除,或在备份模块中为已处理的消息设置已处理标识;

检测模块,用于检测到消费者重启时,检查备份模块中是否有未处理的消息;如果有未处理的消息,将未处理的消息提交给处理模块进行处理。

检测模块检查备份模块中是否有未处理的消息,具体包括:如果处理模块将已处理的消息从备份模块中删除,则如果消费者重启,检测模块将备份模块中的所有消息视为未处理的消息;如果处理模块在备份模块中为已处理的消息设置已处理标识,则如果消费者重启,检测模块将备份模块中所有没有已处理标识的消息视为未处理的消息。

可选地,备份模块可以通过日志文件或数据库存储读取模块读取的消息。

可选地,读取模块每次读取的消息数量和每条消息的最大字节数,可以预先设置。

作为优选的实施方式,备份模块可以预先设置其存储容量最大值。当备份模块当前存储的消息容量已经达到存储容量最大值时,要存储的新的消息会覆盖掉当前消息中时间最早且已经处理的消息。备份模块的存储容量最大值的大小,主要影响消费者重启、宕机或程序异常时,消息丢失的多少。

举例说明,首先,搭建Kafka集群相关环境,在消费者端,编写相关客户端程序代码,设置一个主线程,主线程用于读取模块读取消费者从服务器订阅的消息,通过程序代码设置,每次读取模块从服务器读取10000条消息,每条消息的最大字节数为1MB。读取模块读取完消息后,将所读取的消息复制到备份模块中,然后通知上报模块,上报模块收到通知后,向Zookeeper节点上报偏移量信息,并通知处理模块。

处理模块收到通知后,读取备份模块中未处理的10000条消息,将所读取的10000条消息分成10组,每组1000条消息,并创建与分组数目相对应的子线程,再将各分组消息发送至对应的子线程中;通过各个子线程来执行消息的处理工作,如果子线程成功处理对应的分组消息,从备份模块中将已处理的消息删除,或者在备份模块中为已处理的消息设置已处理标识;如果子线程在处理分组消息过程中,出现消费者宕机、断电、程序异常等造成处理消息失败的情况,检测模块检测到消费者重启后,创建一个独立线程,通过独立线程检查备份模块中是否有未处理的消息。具体检查方法为:如果之前处理模块将已处理的消息从备份模块中删除,则消费者重启后,检测模块将备份模块中的所有消息,视为未处理的消息,并将其提交给处理模块进行处理;如果之前处理模块在备份模块中为已处理的消息设置已处理标识,则消费者重启后,检测模块将备份模块中所有没有已处理标识的消息,视为未处理的消息,并将其提交给处理模块进行处理。

本发明的基于Kafka的消息处理装置,在消费者宕机、断电、程序异常等造成处理消息失败的情况下,由于该消费者的主线程在各子线程处理消息之前,已经向Zookeeper节点上报偏移量信息,该消费者重启后或者新的消费者不会读取该消费者已经读取的消息,且子线程不负责上报偏移量信息,因此不会产生消费者重复消费数据、子线程重复提交Offset或覆盖提交Offset的问题;又由于消费者每次重启,都通过检测模块检测备份模块中是否有未处理的消息,因此不会造成有消息永远没有被处理到的情况,提高了消费者消息处理的精准度;另外通过多线程处理,提高了消费者客户端的吞吐量。

如图4所示,根据本发明的一种基于Kafka的消息处理方法,包括以下步骤:

读取消费者从服务器订阅的消息;复制并存储读取的消息;

向Zookeeper节点上报偏移量信息;

将存储的消息中未处理的消息分配给预先设置的多个子线程进行处理,并删除或标识出已处理的消息。

进一步地,如果消费者重启,检测存储的消息中是否有未处理的信息,如果有,对未处理的消息进行处理。

可选地,可以通过日志文件或数据库存储读取的消息。

可选地,已处理的消息从存储的消息中删除,或者在存储的消息中为已处理的消息设置已处理标识。如果消费者将已处理的消息从存储的消息中删除,则消费者重启后,将存储的消息中的所有消息视为未处理的消息,并对其进行处理;如果消费者在存储的消息中为已处理的消息设置已处理标识,则消费者重启后,将存储的消息中所有没有已处理标识的消息视为未处理的消息,并对其进行处理。

可选地,每次读取的消息数量和每条消息的最大字节数,可以预先进行设置。

作为优选的实施方式,消费者可以预先设置存储的消息的存储容量最大值。当当前存储的消息容量已经达到存储容量最大值时,要存储的新的消息,会覆盖掉当前消息中时间最早且已经处理的消息。消息的存储容量最大值的大小,主要影响消费者重启、宕机或程序异常时,消息丢失的多少。

举例说明,首先,搭建Kafka集群相关环境,在消费者端,编写相关客户端程序代码,设置一个主线程,主线程用于消费者读取从服务器订阅的消息,通过程序代码设置,每次消费者从服务器读取10000条消息,每条消息的最大字节数为1MB。消费者读取完消息后,将所读取的消息复制并存储到备份消息中,然后向Zookeeper节点上报偏移量信息。

然后消费者将所读取的10000条消息分成10组,每组1000条消息,并创建与分组数目相对应的子线程,再将各分组消息发送至对应的子线程中;然后各个子线程执行消息的处理工作,如果子线程成功处理对应的分组消息,从备份消息中将已处理的消息删除,或者为已处理的消息设置已处理标识;如果子线程在处理分组消息过程中,出现消费者宕机、断电、程序异常等造成处理消息失败的情况,等待消费者重启后,一方面,主线程仍然用于读取消费者从服务器订阅的消息;另一方面,创建一个独立线程,独立线程检测备份消息中的各条消息是否已经处理完毕;如果备份消息中有未处理的消息,对未处理的消息进行处理。在独立线程检测过程中,如果之前消费者将已处理的消息从备份消息中删除,则消费者重启后,将备份消息中的所有消息视为未处理的消息,并对其进行处理;如果之前消费者在备份消息中为已处理的消息设置已处理标识,则消费者重启后,将备份消息中所有没有已处理标识的消息视为未处理的消息,并对其进行处理。

本发明的基于Kafka的消息处理方法,在消费者宕机、断电、程序异常等造成处理消息失败的情况下,由于该消费者的主线程在各子线程处理消息之前,已经向Zookeeper节点上报偏移量信息,该消费者重启后或者新的消费者不会读取该消费者已经读取的消息,且子线程不负责上报偏移量信息,因此不会产生消费者重复消费数据、子线程重复提交Offset信息或覆盖提交Offset信息的问题;又由于消费者每次重启,都通过一独立线程,检测备份消息中的消息处理情况,因此不会造成有消息永远没有被处理到的情况,提高了消费者消息处理的精准度;另外通过多线程处理,提高了消费者客户端的吞吐量。

需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。

以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

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