消息处理方法及装置与流程

文档序号:17536121发布日期:2019-04-29 14:00阅读:245来源:国知局
消息处理方法及装置与流程

本公开涉及大数据技术领域,尤其涉及一种消息处理方法及装置。



背景技术:

kafka是一个开源流处理平台,是一种高吞吐量的分布式发布订阅消息系统,它可处理消费者规模的网站中的所有动作流数据。

消息队列是一种应用程序与应用程序的通信方法。在应用架构设计时,可以使用消息队列实现不同组件的对接,协调不同组件的消息吞吐能力,kafka作为高性能分布式消息队列具有高效的消息生产能力和消息消费能力。

kafka可以以集群的方式分布在多个节点上运行,每个节点上的kafka可以称为一个代理(broker)。kafka可以给消息设定一个主题(topic)。kafka的每个主题可以由多个分区(partition)组成,每个分区都是磁盘上的一个目录,用来实际存放属于该主题的消息。

相关技术中,一个主题采用多个分区实现消息的生产和消费时,无法确定从不同分区消费出来的消息的顺序,无法实现消息的全局顺序消费。一个主题采用一个分区,或者一个主题采用多个分区且指定一个用于生产和消费消息的分区时,可以实现消息的全局顺序消费。然而,上述两种方式在消息的生产和消息时均是利用一个分区,限制了消息生产和消费的性能,无法充分发挥分布式集群的优势,kafka集群的利用率较低。



技术实现要素:

有鉴于此,本公开提出了一种消息处理方法及装置,既能够保证消息的全局顺序消费,又提升了kafka集群的利用率。

根据本公开的一方面,提供了一种消息处理方法,包括:接收到指定主题的消息时,按照所述消息到达生产缓存区的顺序和所述指定主题的批次容量,为所述消息分配批次号;所述批次容量为一个批次包含的消息的数量,所述批次号用于标识消息所属的批次;在所述生产缓存区中所述批次号对应的消息的数量达到所述批次容量时,将所述批次号对应的消息按照消息到达所述生产缓存区的顺序写入所述批次号对应的分区中;从所述指定主题对应的各分区中分别获取指定数量的批次的消息;按照批次号的分配顺序,分批向消费者提交获取到的指定数量的批次的消息。

根据本公开的另一方面,提供了一种消息处理装置,包括:分配模块,用于接收到指定主题的消息时,按照所述消息到达生产缓存区的顺序和所述指定主题的批次容量,为所述消息分配批次号;所述批次容量为一个批次包含的消息的数量,所述批次号用于标识消息所属的批次;写入模块,用于在所述生产缓存区中所述批次号对应的消息的数量达到所述批次容量时,将所述批次号对应的消息按照消息到达所述生产缓存区的顺序写入所述批次号对应的分区中;获取模块,用于从所述指定主题对应的各分区中分别获取指定数量的批次的消息;提交模块,用于按照批次号的分配顺序,分批向消费者提交获取到的指定数量的批次的消息。

在本公开实施例中,在消息生产时,按照消息到达生产缓存区的顺序和批次容量,为具有多个分区的主题的消息指定批次号,通过将所述生产缓存区中一个批次的消息,写入与该批次的批次号对应的分区中,使得同一主题的消息分布在不同的分区中提升了kafka集群的利用率,通过在消费时,按照批次号的分配顺序,分批向消费者提交获取到的消息,使得同一主题的消息的消费顺序与生产顺序一致,保证了消息的全局顺序消费。因此,根据本公开各方面实施例的消息处理方法及装置,既能够保证消息的全局顺序消费,又提升了kafka集群的利用率。

根据下面参考附图对示例性实施例的详细说明,本公开的其它特征及方面将变得清楚。

附图说明

包含在说明书中并且构成说明书的一部分的附图与说明书一起示出了本公开的示例性实施例、特征和方面,并且用于解释本公开的原理。

图1示出根据本公开一实施例的消息处理方法的流程图。

图2示出了本公开实施例的kafka的架构示意图。

图3示出本公开实施例的消息生产过程的一个示例性的示意图。

图4示出根据本公开一实施例的消息处理方法的流程图。

图5示出本公开实施例的消息消费过程的一个示例性的示意图。

图6示出根据本公开一实施例的消息处理装置的框图。

图7示出根据本公开一实施例的消息处理装置的框图。

图8是根据一示例性实施例示出的一种用于消息处理装置900的框图。

具体实施方式

以下将参考附图详细说明本公开的各种示例性实施例、特征和方面。附图中相同的附图标记表示功能相同或相似的元件。尽管在附图中示出了实施例的各种方面,但是除非特别指出,不必按比例绘制附图。

在这里专用的词“示例性”意为“用作例子、实施例或说明性”。这里作为“示例性”所说明的任何实施例不必解释为优于或好于其它实施例。

另外,为了更好的说明本公开,在下文的具体实施方式中给出了众多的具体细节。本领域技术人员应当理解,没有某些具体细节,本公开同样可以实施。在一些实例中,对于本领域技术人员熟知的方法、手段、元件和电路未作详细描述,以便于凸显本公开的主旨。

图1示出根据本公开一实施例的消息处理方法的流程图。该方法可以应用于kafka集群的节点。图2示出了本公开实施例的kafka的架构示意图。如图2所示,kafka架构可包括:生产者(producer)、代理(broker)、消费者(consumer)和zookeeper(未示出)。

kafka服务可以以集群的方式分布在多个节点上,每个节点上的kafka服务可以称为一个代理。生产者可以向代理发布消息,消费者可以从代理提取消息。代理可维护接收到的消息。生产者、代理和消费者可以通过zookeeper进行管理和协调。生产者生产消息并向代理发布;代理接收到生产者发送的消息并将消息持久化(将消息写入分区),然后提供若干个主题供消费者订阅;消费者从代理订阅某个主题的消息后,可以从代理提取该主题的消息。

如图1所示,所述消息处理方法可包括:

步骤s11,接收到指定主题的消息时,按照所述消息到达生产缓存区的顺序和所述指定主题的批次容量,为所述消息分配批次号;所述批次容量为一个批次包含的消息的数量,所述批次号用于标识消息所属的批次。

主题可以用于识别消息的类别,同一个主题的消息所属类别相同,不同主题的消息所属类别不同。一个主题物理上可以分成多个分区,每个分区是磁盘上的一个目录,用来实际存放属于该主题的消息,每个分区中存放的消息是一个有序的队列,分区中每个消息都会被分配一个有序的标识。一般属于同一类别的消息存储在一个主题的分区中,例如定位信息均存储在定位主题的分区中。不同类别的消息存储在不同的主题的分区中,例如定位信息、天气信息和登录信息分别存储在定位主题、天气主题和登录主题的分区中。

在一种可能的实现方式中,指定主题可以为有全局消费顺序要求的主题,即指定主题的消息的消费顺序需要与这些消息的到达生产缓存区的顺序一致。

在一种可能的实现方式中,可以对kafka集群的主题增加一个用于区分主题是否为指定主题的参数,该新增的参数可以在创建主题时设置。在一个示例中,新增的参数的取值可以为0或1,取值为0(或者为1)时表示对应主题不是指定主题,取值为1(或者为0)时表示对应主题时指定主题。新增的参数的取值还可以为“true”或者“false”。对此本公开不做限制。

kafka代理接收到消息后,可以确定该消息对应的主题,根据该主题的参数的取值,确定该消息是否为指定主题的消息。其中,消息对应的主题可以在生产者在发布消息时由生产者指定,也可以在kafka代理中的代理接收到消息后由代理确定,对此本公开不做限制。

指定主题还可以为其他主题,对此本公开不做限制。

kafka代理接收到消息后,先将消息存放在生产缓存区,再根据消息的主题,将消息写入该主题的分区中。

kafka代理接收到指定主题的消息时,可以按照消息到达生产缓存区的顺序和指定主题对应的批次容量,为该消息分配批次号。

其中,批次容量可以为一个批次包含的消息的数量。在一种可能的实现方式中,对于指定主题,在创建该指定主题时,还可以设置该指定主题的批次容量。

批次号可以用于标识消息所属的批次。在一种可能的实现方式中,批次号可以是一串自增、连续分配、不可重复的long类型数字。

举例来说,假设指定主题1的批次容量为3,则kafka代理可以将第一个至第三个到达生产缓存区的指定主题1的消息确定为一个批次,分配批次号001,将第四个至第六个到达生产缓存区的指定主题1的消息确定为一个批次,分配批次号002,将第七个至第九个到达生产缓存区的指定主题1的消息确定为一个批次,分配批次号003,依次类推。

步骤s12,在所述生产缓存区中所述批次号对应的消息的数量达到所述批次容量时,将所述批次号对应的消息按照消息到达所述生产缓存区的顺序写入所述批次号对应的分区中。

当一个主题包括多个分区时,kafka代理可以将该主题的消息写入不同的分区,以提升kafka集群的利用率。在本公开实施例中,可以以批次为单位,分批向各分区写入消息,即生产缓存区中某个批次的数量达到该批次的批次容量时,将该批次的消息作为一个整体写入一个分区。其中,在将一个批次的消息写入分区的过程中,该批次的每条消息按到达生产缓存区的顺序依次写入分区。

在一种可能的实现方式中,步骤s12可包括:在所述生产缓存区中所述批次号对应的消息的数量达到所述批次容量时,根据所述批次号和所述指定主题的分区数量,确定所述批次号对应的分区号,将所述批次号对应的消息写入所确定的分区号对应的分区中。

其中,分区号可以用于识别唯一的分区。kafka代理可以根据分区号确定唯一的分区。

在一个示例中,可以采用公式part_id=batch_id%p_num计算分区号。其中,part_id为分区号,batch_id为批次号,p_num为分区数量,%表示取模运算。kafka代理可以根据批次号和指定主题的分区数量,通过上述公式确定批次号对应的分区号,进而确定该批次号对应的消息所写入的分区。

本公开实施例通过批次号确定分区号,可以使各分区消息数量均衡。本公开实施例还可以通过其他方式确定各批次号对应的分区号,例如,kafka代理可以在写入消息时,将当前指定主题分区中消息数量最小的分区的分区号,确定为批次号对应的分区号。对此,本公开不做限制。

需要说明的是,针对每个批次,kafka代理在将该批次的消息写入对应分区时,按照该批次中各消息到达生产缓存区的顺序依次写入该分区中。这样,可以保证一个批次内部消息的有序性。

举例来说,图3示出本公开实施例的消息生产过程的一个示例性的示意图。对于指定主题的消息,假设之前已经完成了批次5(批次号为5的批次)的消息的写入,指定主题的批次容量为3,指定主题的分区数量为3(包括分区0、分区1和分区2),根据步骤s11和s12,kafka代理继续进行消息的生产,生产过程如图3所示。如图3所示,kafka代理按照消息达到生产缓存区的顺序,依次为生产缓存区中指定主题的消息分配了批次号6、7和8。以批次6(批次号为6的批次)为例,批次号6和分区数量3取模,得到分区号为0,此时,kafka代理可以将批次6的消息写入分区0。其中,由于分区0中已有消息已经占用了序列标识0至5,因此,批次6中的消息按照进入生产缓存区的顺序,在分区0的序列标识依次为6、7和8。同理,批次7的消息写入分区1,且在分区1中序列标识依次为6、7和8;批次8的消息写入分区2,且在分区2中序列标识依次为6、7和8。

在一种可能的实现方式中,在将所述批次号对应的消息按照消息到达所述生产缓存区的顺序写入所述批次号对应的分区中之后,可以在确认写入完成时,从从所述生产缓存区中删除所述批次号对应的消息。在一个示例中,kafka代理接收来自分区的写入完成消息,从该写入完成消息中获取批次号,并将生产缓存区中该批次号对应的消息删除。

确认某个批次的消息写入分区,表明该批次的消息已经完成了生产,此时,kafka代理可以从生产缓存区中删除该批次的消息,以便于后续消息进入生产缓存区。

步骤s13,从所述指定主题对应的各分区中分别获取指定数量的批次的消息。

其中,指定数量可表示kafka代理从一个分区中获取的批次的数量。kafka代理可以从指定主题的各分区中获取数量相等的批次,这样避免遗漏某个分区的消息,从而造成消息顺序的错乱。

步骤s14,按照批次号的分配顺序,分批向消费者提交获取到的指定数量的批次的消息。

由于批次号的分配顺序是按照消息到达生产缓存区的顺序分配的,即先到达消息缓存区的消息先分配批次号,后到达消息缓存区的消息后分配批次号,因此,kafka代理按照批次号的分配顺序,分批向消费者提交消息,即将先分配批次号的批次的消息先提交给消费者,后分配批次号的批次的消息后提交给消费者,可以使先到达生产缓存区的消息先提交给消费者,后到达生产缓存区的消息后提交给消费者,在消息保存在不同分区的情况下,仍保证了消息在全局的顺序性。

在本公开实施例中,在消息生产时,按照消息到达生产缓存区的顺序和批次容量,为具有多个分区的主题的消息指定批次号,通过将所述生产缓存区中一个批次的消息,写入与该批次的批次号对应的分区中,使得同一主题的消息分布在不同的分区中提升了kafka集群的利用率,通过在消费时,按照批次号的分配顺序,分批向消费者提交获取到的消息,使得同一主题的消息的消费顺序与生产顺序一致,保证了消息的全局顺序消费。因此,根据本公开各方面实施例的消息处理方法及装置,既能够保证消息的全局顺序消费,又提升了kafka集群的利用率。

需要说明的是,本公开实施例中全局顺序,是以消息到达生产缓存区的顺序作为标准顺序的。如果因为生产过程中的一些网络震荡等问题导致的消息没有按照时间等顺序的要求到达kafka代理的生产缓存区,kafka代理是无法判断这个顺序是错乱了的。本公开实施例是针对多分区的kafka代理中消息的顺序消费,而不是保证消息生产的顺序性。

图4示出根据本公开一实施例的消息处理方法的流程图。如图4所示,步骤s14按照批次号的分配顺序,分批向消费者提交获取到的指定数量的批次的消息,可包括:

步骤s141,将获取到的各批次的消息,分批存储在消费缓存区中。

步骤s142,从所述消费缓存区中存放的各批次的消息中,分别获取各批次的批次号。

步骤s143,按照批次号由先到后的分配顺序,依次将所述消费缓存区各批次的消息提交至所述消费者。

消费缓存区可以用于存储消费者订阅的主题的消息。kafka代理从指定主题对应的各分区中分别获取指定数量的批次的消息后,可以将获取到的各批次的消息,分批存储在消费缓存区。

在一种可能的实现方式中,kafka代理在将消息写入分区时,可以将该消息所属批次的批次号添加在该消息中。这样,指定主题的分区中存储的消息也就携带有该消息所属批次的批次号。

kafka代理可以从消费缓存区中存放的各批次的消息中,分别获取各批次的批次号。在一个示例中,对于消费缓存区中每一个批次,kafka代理可以从该批次的任意一条消息中获取该批次的批次号。

kafka代理可以照批次号的由先到后的分配顺序,依次将所述消费缓存区中各批次的消息提交至消费者。这样,kafka代理可以将所述消费缓存区中先分配批次号的批次的消息先提交至所述消费者,后分配批次号的批次的消息后提交至所述消费者,保证了消息提交消费者的顺序与消息到达生产缓存区的顺序一致。

举例来说,图5示出本公开实施例的消息消费过程的一个示例性的示意图。对于指定主题的消息,假设之前已将完成了批次0(批次号为0的批次)的消息的提交,且指定主题的批次容量为3,指定主题的分区数量为3(包括分区0、分区1和分区2),指定数量为1,根据步骤s141至步骤s143继续进行消息的消费,消费过程如图5所示。如图5所示,kafka代理将分别从分区0、分区1和分区2获取的1个批次的消息,分批存储在消费缓存区中,此时消费缓存区中存储有三个批次的消息,包括批次1、批次2和批次3。kafka代理从三个批次的消息中,分别获取三个批次的批次号为3、1和2。在这三个批次号的分配顺序为1、2和3时,kafka代理依次将批次1、批次2和批次3提交至消费者。

在一种可能的实现方式中,针对每个批次,接收到消费者返回的针对该批次的确认消息时,从所述消费缓存区中删除该批次的消息。

其中,确认消息表示消费者已经收到了某个批次的消息,即该批次的消息已经完成消费,kafka代理从消费缓存区中可以删除该批次的消息,以便于kafka代理继续进行其他消息的消费。

在一种可能的实现方式中,确认消息可以携带有批次号,kafka代理接收到确认消息时,可以从确认消息中获取批次号,并从消费缓存区中删除该批次号对应批次的消息。

在一种可能的实现方式中,在所述消费缓存区中存放的消息处理完毕后,从所述指定主题的各分区中分别获取指定数量的批次的消息。

在一个示例中,如图5所示,消费缓存区中存储有批次1、批次2和批次3,其中,最先分配批次号的批次为批次1,kafka代理可以将批次1的消息发送至消费者,接收到消费者针对批次1的确认消息时,从消费缓存区中删除批次1的消息。此时,消费缓存区中存储有批次2和批次3,其中,最先分配批次号的批次为批次2,kafka代理可以将批次2的消费发送至消费者,接收到消费者针对批次2的确认消息时,从消费缓存区中删除批次2。此时,消费缓存区中存储有批次3,其中,最先分配批次号的批次为批次3,kafka代理可以将批次3的消息发送至消费者,接收到消费者针对批次3的确认消息时,从消费缓存区中删除批次3。此时,消费缓存区中存放的消息处理完毕,kafka代理可以继续从指定主题的各分区中获取指定数量的批次的消息。这些消息的处理方式可以参照步骤s141至步骤s143,这里不再赘述。

图6示出根据本公开一实施例的消息处理装置的框图。如图6所示,该装置60可包括:

分配模块61,用于接收到指定主题的消息时,按照所述消息到达生产缓存区的顺序和所述指定主题的批次容量,为所述消息分配批次号;所述批次容量为一个批次包含的消息的数量,所述批次号用于标识消息所属的批次;

写入模块62,用于在所述生产缓存区中所述批次号对应的消息的数量达到所述批次容量时,将所述批次号对应的消息按照消息到达所述生产缓存区的顺序写入所述批次号对应的分区中;

获取模块63,用于从所述指定主题对应的各分区中分别获取指定数量的批次的消息;

提交模块64,用于按照批次号的分配顺序,分批向消费者提交获取到的指定数量的批次的消息。

在本公开实施例中,在消息生产时,按照消息到达生产缓存区的顺序和批次容量,为具有多个分区的主题的消息指定批次号,通过将所述生产缓存区中一个批次的消息,写入与该批次的批次号对应的分区中,使得同一主题的消息分布在不同的分区中提升了kafka集群的利用率,通过在消费时,按照批次号的分配顺序,分批向消费者提交获取到的消息,使得同一主题的消息的消费顺序与生产顺序一致,保证了消息的全局顺序消费。因此,根据本公开各方面实施例的消息处理方法及装置,既能够保证消息的全局顺序消费,又提升了kafka集群的利用率。

在一种可能的实现方式中,指定主题的分区中存储的消息中携带有所属批次的批次号,所述提交模块64具体可用于:

将获取到的各批次的消息,分批存储在消费缓存区中;

从所述消费缓存区中存放的各批次的消息中,分别获取各批次的批次号;

按照批次号由先到后的分配顺序,依次将所述消费缓存区中各批次的消息提交至所述消费者。

图7示出根据本公开一实施例的消息处理装置的框图。如图7所示,在一种可能的实现方式中,所述装置60还可包括:

第一删除模块65,用于针对每个批次,接收到消费者返回的针对该批次的确认消息时,从所述消费缓存区中删除该批次的消息。

在一种可能的实现方式中,所述写入模块62具体可用于:

根据所述批次号和所述指定主题的分区数量,确定所述批次号对应的分区号;

将所述批次号对应的消息写入所确定的分区号对应的分区中。

在一种可能的实现方式中,所述装置60还可包括:

第二删除模块66,用于在确认写入完成时,从所述生产缓存区中删除所述批次号对应的消息。

图8是根据一示例性实施例示出的一种用于消息处理装置900的框图。参照图8,该装置900可包括处理器901、存储有机器可执行指令的机器可读存储介质902。处理器901与机器可读存储介质902可经由系统总线903通信。并且,处理器901通过读取机器可读存储介质902中与消息处理逻辑对应的机器可执行指令以执行上文所述的消息处理方法。

本文中提到的机器可读存储介质902可以是任何电子、磁性、光学或其它物理存储装置,可以包含或存储信息,如可执行指令、数据,等等。例如,机器可读存储介质可以是:ram(radomaccessmemory,随机存取存储器)、易失存储器、非易失性存储器、闪存、存储驱动器(如硬盘驱动器)、固态硬盘、任何类型的存储盘(如光盘、dvd等),或者类似的存储介质,或者它们的组合。

以上已经描述了本公开的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。

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