CN113296971B - 消息队列的扩容、缩容、处理方法、装置及设备 - Google Patents

消息队列的扩容、缩容、处理方法、装置及设备 Download PDF

Info

Publication number
CN113296971B
CN113296971B CN202010674059.4A CN202010674059A CN113296971B CN 113296971 B CN113296971 B CN 113296971B CN 202010674059 A CN202010674059 A CN 202010674059A CN 113296971 B CN113296971 B CN 113296971B
Authority
CN
China
Prior art keywords
message queue
data
target message
target
original
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
CN202010674059.4A
Other languages
English (en)
Other versions
CN113296971A (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.)
Alibaba Group Holding Ltd
Original Assignee
Alibaba Group Holding 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 Alibaba Group Holding Ltd filed Critical Alibaba Group Holding Ltd
Priority to CN202010674059.4A priority Critical patent/CN113296971B/zh
Publication of CN113296971A publication Critical patent/CN113296971A/zh
Application granted granted Critical
Publication of CN113296971B publication Critical patent/CN113296971B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

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
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2282Tablespace storage structures; Management thereof
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/27Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Databases & Information Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Computing Systems (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请提供一种消息队列的扩容、缩容、处理方法、装置及设备,包括:获取第一数据文件和目录文件,第一数据文件包括多个原始消息数据,目录文件包括M个原始消息队列;在需要进行扩容时,获取第二数据文件,第二数据文件包括多个目标消息数据,为目录文件扩容N个目标消息队列;为目标消息队列关闭读模式,以禁止从目标消息队列中读取目标消息数据的日志信息;在目标消息队列中已存储目标消息数据的日志信息时,记录原始消息队列在当前时刻的最大位点;在原始消息队列的消费位点到达最大位点时,为目标消息队列开启读模式,以允许从目标消息队列中读取目标消息数据的日志信息。通过本申请的技术方案,实现消息队列的平滑扩容。

Description

消息队列的扩容、缩容、处理方法、装置及设备
技术领域
本申请涉及互联网技术领域,尤其是涉及一种消息队列的扩容、缩容、处理方法、装置及设备。
背景技术
消息队列是分布式系统的重要组成部分,用于解决应用耦合,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构(分布式事务),是大型分布式系统不可缺少的组成部分。基于此,在分布式系统中,需要创建多个消息队列,针对每个消息数据,利用该消息数据的分区键确定该消息数据属于哪个消息队列,在该消息队列的尾部写入该消息数据的日志信息。
在分布式系统的运行过程中,可能需要对消息队列进行扩容,例如,将4个消息队列扩容为6个消息队列。在消息队列的扩容过程中,需要停止向消息队列中写入消息数据的日志信息,并停止从消息队列中读取消息数据的日志信息,即,停止消息队列的使用。然后,针对每个消息数据,重新确定该消息数据属于哪个消息队列,在该消息队列的尾部写入该消息数据的日志信息。
由于需要停止消息队列的使用,因此,生产者无法向消息队列中写入消息数据的日志信息,消费者无法从消息队列中读取消息数据的日志信息,导致应用中断,影响用户体验。而且,需要对所有消息数据的日志信息进行更新,即更新消息数据的日志信息所在的消息队列,需要耗费大量资源。
发明内容
本申请提供一种消息队列的扩容方法,所述方法包括:
获取第一数据文件和目录文件,所述第一数据文件包括多个原始消息数据,所述目录文件包括M个原始消息队列,M为大于1的正整数;其中,所述原始消息队列用于存储原始消息数据的日志信息;
在需要进行扩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,为所述目录文件扩容N个目标消息队列;
为所述目标消息队列关闭读模式,以禁止从所述目标消息队列中读取目标消息数据的日志信息;在所述目标消息队列中已存储目标消息数据的日志信息时,记录所述原始消息队列在当前时刻的最大位点;
在所述原始消息队列的消费位点到达所述最大位点时,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取目标消息数据的日志信息。
本申请提供一种消息队列的扩容方法,所述方法包括:
获取第一数据文件和目录文件,所述第一数据文件包括多个原始消息数据,所述目录文件包括M个原始消息队列,M为大于1的正整数;其中,所述原始消息队列用于存储原始消息数据的日志信息;
在需要进行扩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,为所述目录文件扩容N个目标消息队列,N为M的整数倍;
为所述目标消息队列关闭读模式,以禁止从所述目标消息队列中读取目标消息数据的日志信息;在满足目标消息队列的开启条件时,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取目标消息数据的日志信息。
本申请提供一种消息队列的缩容方法,所述方法包括:
获取第一数据文件和目录文件,所述第一数据文件包括多个原始消息数据,所述目录文件包括P个原始消息队列和L个目标消息队列,P与L的和是P的整数倍;原始消息队列和目标消息队列均用于存储原始消息数据的日志信息;
在需要进行缩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,所述原始消息队列用于存储目标消息数据的日志信息;
为所述目标消息队列关闭写模式,以禁止将目标消息数据的日志信息存储到所述目标消息队列;以及,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取原始消息数据的日志信息;
记录所述目标消息队列在当前时刻的最大位点,并在所述目标消息队列的消费位点到达所述最大位点时,对所述目标消息队列进行缩容处理。
本申请提供一种消息队列的处理方法,所述方法包括:
获取第一数据文件,所述第一数据文件包括多个原始消息数据;
获取目录文件,所述目录文件包括至少两个原始消息队列;
针对任一原始消息数据,基于所述原始消息数据的分区键和原始消息队列的数量,确定所述原始消息数据所属的原始消息队列;
在该原始消息队列中存储所述原始消息数据的日志信息。
本申请提供一种消息队列的扩容装置,所述装置包括:
获取模块,用于获取第一数据文件和目录文件,所述第一数据文件包括多个原始消息数据,所述目录文件包括M个原始消息队列,M为大于1的正整数;其中,所述原始消息队列用于存储原始消息数据的日志信息;
在需要进行扩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,为所述目录文件扩容N个目标消息队列;
处理模块,用于为所述目标消息队列关闭读模式,以禁止从所述目标消息队列中读取目标消息数据的日志信息;在所述目标消息队列中已存储目标消息数据的日志信息时,记录所述原始消息队列在当前时刻的最大位点;
在所述原始消息队列的消费位点到达所述最大位点时,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取目标消息数据的日志信息。
本申请提供一种消息队列的缩容装置,所述装置包括:
获取模块,用于获取第一数据文件和目录文件,所述第一数据文件包括多个原始消息数据,所述目录文件包括P个原始消息队列和L个目标消息队列,P与L的和是P的整数倍;原始消息队列和目标消息队列均用于存储原始消息数据的日志信息;在需要进行缩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,所述原始消息队列用于存储目标消息数据的日志信息;
处理模块,用于为所述目标消息队列关闭写模式,以禁止将目标消息数据的日志信息存储到所述目标消息队列;以及,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取原始消息数据的日志信息;
记录所述目标消息队列在当前时刻的最大位点,并在所述目标消息队列的消费位点到达所述最大位点时,对所述目标消息队列进行缩容处理。
本申请提供一种电子设备,用于实现消息队列的扩容,包括:
处理器和机器可读存储介质,所述机器可读存储介质上存储有若干计算机指令,所述处理器执行所述计算机指令时进行如下处理:
获取第一数据文件和目录文件,所述第一数据文件包括多个原始消息数据,所述目录文件包括M个原始消息队列,M为大于1的正整数;其中,所述原始消息队列用于存储原始消息数据的日志信息;
在需要进行扩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,为所述目录文件扩容N个目标消息队列;
为所述目标消息队列关闭读模式,以禁止从所述目标消息队列中读取目标消息数据的日志信息;在所述目标消息队列中已存储目标消息数据的日志信息时,记录所述原始消息队列在当前时刻的最大位点;
在所述原始消息队列的消费位点到达所述最大位点时,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取目标消息数据的日志信息。
本申请提供一种电子设备,用于实现消息队列的缩容,包括:
处理器和机器可读存储介质,所述机器可读存储介质上存储有若干计算机指令,所述处理器执行所述计算机指令时进行如下处理:
获取第一数据文件和目录文件,所述第一数据文件包括多个原始消息数据,所述目录文件包括P个原始消息队列和L个目标消息队列,P与L的和是P的整数倍;原始消息队列和目标消息队列均用于存储原始消息数据的日志信息;
在需要进行缩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,所述原始消息队列用于存储目标消息数据的日志信息;
为所述目标消息队列关闭写模式,以禁止将目标消息数据的日志信息存储到所述目标消息队列;以及,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取原始消息数据的日志信息;
记录所述目标消息队列在当前时刻的最大位点,并在所述目标消息队列的消费位点到达所述最大位点时,对所述目标消息队列进行缩容处理。
基于上述技术方案,本申请实施例中,在消息队列的扩容过程中,在不停写的情况下对消息队列进行扩容,即不需要停止向消息队列中写入消息数据的日志信息,也不需要停止从消息队列中读取消息数据的日志信息,避免应用中断,保证扩容后的分区顺序性,有效避免数据迁移,实现消息队列的平滑扩容,具有耗费资源少,用户体验好,消息队列不乱序等特点。在消息队列的缩容过程中,在不停写的情况下对消息队列进行缩容,即不需要停止向消息队列中写入消息数据的日志信息,也不需要停止从消息队列中读取消息数据的日志信息,避免应用中断,保证缩容后的分区顺序性,有效避免数据迁移,实现消息队列的平滑缩容,具有耗费资源少,用户体验好,消息队列不乱序等特点。
附图说明
为了更加清楚地说明本申请实施例或者现有技术中的技术方案,下面将对本申请实施例或者现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据本申请实施例的这些附图获得其它的附图。
图1A和图1B是本申请一种实施方式中的数据文件和目录文件的示意图;
图2是本申请一种实施方式中的消息队列的扩容方法的流程示意图;
图3A-图3D是本申请一种实施方式中的扩容过程的示意图;
图4是本申请一种实施方式中的消息队列的缩容方法的流程示意图;
图5是本申请一种实施方式中的缩容过程的示意图;
图6是本申请一种实施方式中的消息队列的处理方法的流程示意图;
图7A是本申请一种实施方式中的消息队列的扩容装置的结构示意图;
图7B是本申请一种实施方式中的消息队列的缩容装置的结构示意图;
图8是本申请一种实施方式中的电子设备的结构示意图。
具体实施方式
在本申请实施例使用的术语仅仅是出于描述特定实施例的目的,而非限制本申请。本申请和权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其它含义。还应当理解,本文中使用的术语“和/或”是指包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本申请实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,此外,所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
在阐述本申请的技术方案之前,先介绍与本申请实施例有关的概念。
消息主题(Topic):针对每个消息数据来说,该消息数据有对应的消息主题,通过消息主题对所有消息数据进行分类,比如说,将所有消息主题1的消息数据划分到一类,将所有消息主题2的消息数据划分到一类,以此类推。
数据文件和目录文件:参见图1A所示,为数据文件和目录文件的示意图,数据文件是用于存储消息数据的物理文件,为了区分方便,将该物理文件称为数据文件。目录文件是用于存储消息数据的日志信息的物理文件,为了区分方便,将该物理文件称为目录文件。
示例性的,生产者按照顺序依次存储各消息数据,比如说,在得到消息数据1后,将消息数据1存储到数据文件,在得到消息数据2后,将消息数据2存储到数据文件,且消息数据2位于消息数据1的后面,以此类推。
示例性的,目录文件可以包括消息队列,针对消息队列来说,该消息队列用于存储消息数据的日志信息,该日志信息可以包括但不限于:消息数据的存储位置(也可以称为物理位置),对此日志信息不做限制。
消费者可以从消息队列中读取消息数据的日志信息,基于该日志信息中的存储位置,确定消息数据存储在数据文件的哪个存储位置,从数据文件的该存储位置读取该消息数据,消费者读取该消息数据的过程称为消费过程。
示例性的,每种消息主题可以对应至少一个消息队列,例如,消息主题可以有多个消息队列,但一个消息队列只属于某一消息主题,每个消息队列对应一个子目录文件,将消息主题对应的所有消息队列对应的子目录文件组合起来,称为目录文件。参见图1A所示,某消息主题对应消息队列0和消息队列1,将消息队列0的子目录文件和消息队列1的子目录文件组合起来,称为目录文件。
消息数据的分区键(shardingkey):针对每个消息数据来说,该消息数据具有分区键,通过分区键确定消息数据对应哪个消息队列,并将该消息数据的日志信息存储到该消息队列。比如说,基于消息数据的分区键和消息队列的数量,确定该消息数据对应的消息队列。例如,对消息数据的分区键和消息队列的数量进行哈希运算,基于哈希运算结果确定该消息数据对应的消息队列。
参见图1A所示,消息队列的数量为2,消息数据1的分区键为2,对消息数据1的分区键2与消息队列的数量2进行取余哈希运算,哈希运算结果为0,因此,将消息数据1的日志信息存储到消息队列0。消息数据2的分区键为3,对消息数据2的分区键3与消息队列的数量2进行取余哈希运算,哈希运算结果为1,因此,将消息数据2的日志信息存储到消息队列1,以此类推。
消息队列:消息队列用于存储消息数据的日志信息,参见图1B所示,消息队列具有顺序追加,全局有序等特点,每条日志信息用于索引消息数据的存储位置,且日志信息的位置能够隐形地表达日志信息的时间,这种设计能够很好的与具体物理时钟解耦,在分布式数据存储场景中具有很高的应用价值。
示例性的,针对每个消息队列来说,将该消息队列的每个存储位置称为一个位点,通过每个位点存储消息数据的日志信息。参见图1A所示,消息队列0的位点1存储消息数据1的日志信息,消息队列0的位点2存储消息数据3的日志信息,消息队列0的位点3存储消息数据4的日志信息。消息队列1的位点1存储消息数据2的日志信息,消息队列1的位点2存储消息数据5的日志信息,消息队列1的位点3存储消息数据6的日志信息,以此类推。
示例性的,针对每个消息队列来说,该消息队列具有最小位点,消息队列最左侧的位点可以为最小位点,最小位点用于记录消息队列中存储的第一个消息数据的日志信息。参见图1A所示,由于消息数据1的日志信息是消息队列0存储的第一个消息数据的日志信息,且消息队列0的位点1用于存储消息数据1的日志信息,因此,消息队列0的位点1可以是消息队列0的最小位点。
同理,消息队列1的位点1可以是消息队列1的最小位点。
在实际应用中,考虑到消息数据随时间滚动,即,消息队列中存储的第一个消息数据的日志信息可能会发生变化,因此,消息队列的最小位点也会随着不断变化。比如说,若消息数据3的日志信息是消息队列0存储的第一个消息数据的日志信息,显然,由于消息队列0的位点2用于存储消息数据3的日志信息,因此,消息队列0的位点2可以是消息队列0的最小位点。
示例性的,针对每个消息队列来说,该消息队列具有最大位点,消息队列最右侧的位点可以为最大位点,最大位点用于记录消息队列中存储的最后一个消息数据的日志信息。参见图1A所示,假设消息数据9的日志信息是消息队列0存储的最后一个消息数据的日志信息,且消息队列0的位点5用于存储消息数据9的日志信息,因此,消息队列0的位点5可以是消息队列0的最大位点。
同理,消息队列1的位点4可以是消息队列1的最大位点。
在实际应用中,考虑到消息数据随时间滚动,即,消息队列中存储的最后一个消息数据的日志信息不断发生变化,因此,消息队列的最大位点也会随着不断变化。比如说,若消息数据10的日志信息变为消息队列0存储的最后一个消息数据的日志信息,且消息队列0的位点6用于存储消息数据10的日志信息,则消息队列0的位点6变为消息队列0的最大位点,以此类推。
示例性的,针对每个消息队列来说,该消息队列具有消费位点,且每个消费者对应一个消费位点,不同消费者的消费位点可以相同,也可以不同。比如说,消费者1从消息队列0的位点2读取消息数据的日志信息后,消息队列0的位点3是消费者1的消费位点(消息队列0的消费位点),表示消费者1下次需要从消息队列0的位点3读取消息数据的日志信息。消费者2从消息队列0的位点3读取消息数据的日志信息后,消息队列0的位点4是消费者2的消费位点。消费者1从消息队列1的位点4读取消息数据的日志信息后,消息队列1的位点5是消费者1的消费位点(消息队列1的消费位点),以此类推。
分区顺序性:通过分区键对消息数据进行分区,每个分区对应一个消息队列,同一个消息队列内的消息数据按照严格的FIFO(First Input First Output,先进先出)顺序进行发布和消费,保证消息队列内的消息数据的顺序性。
示例性的,按照消息数据的顺序性进行发布和消费,包括:参见图1A所示,分区键为3的消息数据包括消息数据2,消息数据5和消息数据6,上述消息数据需要按照顺序发布,即,依次在数据文件中存储消息数据2,消息数据5和消息数据6。由于各消息数据的分区键均为3,因此,消息数据2的日志信息,消息数据5的日志信息和消息数据6的日志信息均存储在消息队列1。
由于消息数据2的日志信息位于消息数据5的日志信息之前,消息数据5的日志信息位于消息数据6的日志信息之前,因此,消费者先从消息队列1中读取消息数据2的日志信息,基于消息数据2的日志信息从数据文件中获取消息数据2。然后,消费者先从消息队列1中读取消息数据5的日志信息,基于消息数据5的日志信息从数据文件中获取消息数据5。然后,消费者先从消息队列1中读取消息数据6的日志信息,基于消息数据6的日志信息从数据文件中获取消息数据6。即,消费者依次得到消息数据2,消息数据5和消息数据6。
综上所述,消息数据2,消息数据5和消息数据6,是按照消息数据的顺序性进行发布和消费,消费者不会按照错误的顺序对这些消息数据进行消费。
扩容:当存储或计算资源不足时,需要进行扩容处理,在原有存储或计算资源基础上添加新资源,添加新资源的方式是,在一个已有集群上添加新机器。对于分布式系统来说,添加新机器不会改变原有资源的分布,对于存储系统来说,原来的消息队列的位置不会发生变化。在进行扩容处理时,对存储于原有拓扑结构各机器中的数据进行重新分配,使得资源均衡分布于新的拓扑结构中。
在进行扩容处理时,涉及消息队列的扩容,本文以消息队列的扩容为例。
缩容:当某机器异常或需要减少资源时,去掉相应机器,即进行缩容处理,在原有存储或计算资源基础上去掉部分资源。在进行缩容处理时,对存储于原有拓扑结构各机器中的数据进行重分配,使得资源均衡分布于新的拓扑结构中。
在进行缩容处理时,涉及消息队列的缩容,本文以消息队列的缩容为例。
在分布式系统的运行过程中,可能需要对消息队列进行扩容处理,为了保证分区键对应的消息数据按照顺序进行发布和消费,在消息队列的扩容过程中,需要停止向消息队列中写入消息数据的日志信息,并停止从消息队列中读取消息数据的日志信息,即,停止消息队列的使用。因此,生产者无法向消息队列中写入消息数据的日志信息,消费者无法从消息队列中读取消息数据的日志信息,导致应用中断,影响用户体验。而且,需要对所有消息数据的日志信息进行更新,即更新消息数据的日志信息所在的消息队列,需要耗费大量资源。
针对上述发现,本实施例中,在消息队列的扩容过程中,在不停写的情况下对消息队列进行扩容,即不需要停止向消息队列中写入消息数据的日志信息,也不需要停止从消息队列中读取消息数据的日志信息,避免应用中断,保证分区键对应的消息数据按照顺序进行发布和消费,实现消息队列的平滑扩容。
以下结合具体实施例,对本申请实施例的技术方案进行说明。
本申请实施例中提出一种消息队列的扩容方法,参见图2所示,为消息队列的扩容方法的流程示意图,该方法应用于任意设备,该方法可以包括:
步骤201,获取第一数据文件和目录文件,该第一数据文件可以包括多个原始消息数据,该目录文件可以包括M个原始消息队列,M可以为大于1的正整数;其中,该原始消息队列用于存储原始消息数据的日志信息。
示例性的,可以创建数据文件,为了区分方便,可以将扩容前的数据文件称为第一数据文件。生产者每次得到待存储的消息数据后,就可以将该消息数据存储到第一数据文件中,为了区分方便,可以将扩容前的消息数据称为原始消息数据。综上所述,第一数据文件可以包括多个原始消息数据。
可以创建目录文件,该目录文件包括M个消息队列,为了区分方便,可以将扩容前的消息队列称为原始消息队列,后续以2个原始消息队列为例。
示例性的,可以依次遍历第一数据文件中的每个原始消息数据,针对当前遍历的任一原始消息数据,确定该原始消息数据对应的消息主题,并确定对应的原始消息队列,即目录文件中包括的M个原始消息队列。然后,基于该原始消息数据的分区键和原始消息队列的数量M,确定该原始消息数据所属的原始消息队列,在该原始消息队列中存储该原始消息数据的日志信息。
比如说,可以对该原始消息数据的分区键与原始消息队列的数量M进行取余哈希运算,并基于哈希运算结果确定该原始消息数据所属的原始消息队列,并在该原始消息队列的尾部记录该原始消息数据的日志信息。
参见图1A所示,原始消息队列的数量M为2,若原始消息数据的分区键为奇数,如1、3、5、7、9等,则哈希运算结果为1,原始消息数据所属的原始消息队列为消息队列1。若原始消息数据的分区键为偶数,如0、2、4、6、8等,则哈希运算结果为0,原始消息数据所属的原始消息队列为消息队列0。
步骤202,在需要进行扩容时,获取第二数据文件,第二数据文件包括多个目标消息数据,为该目录文件扩容N个目标消息队列。
将扩容后的数据文件称为第二数据文件,生产者每次得到待存储的消息数据后,将该消息数据存储到第二数据文件中,可以将扩容后的消息数据称为目标消息数据。综上所述,第二数据文件可以包括多个目标消息数据。
第二数据文件与第一数据文件可以是同一个数据文件,比如说,在扩容前,已经在数据文件中存储消息数据1-消息数据20,将消息数据1-消息数据20作为原始消息数据,且存储原始消息数据的存储区域作为第一数据文件。在扩容后,继续在数据文件中存储消息数据21-消息数据50,将消息数据21-消息数据50作为目标消息数据,且存储目标消息数据的存储区域作为第二数据文件。
第二数据文件与第一数据文件也可以是不同数据文件,二者可以部署在相同机器或者不同机器,比如说,在扩容前,创建数据文件1,通过数据文件1存储原始消息数据,将数据文件1作为第一数据文件。在扩容后,创建数据文件2,通过数据文件2存储目标消息数据,将数据文件2作为第二数据文件。
示例性的,在需要进行扩容时,可以为目录文件扩容N个消息队列,为了区分方便,将扩容后的消息队列称为目标消息队列,即扩容N个目标消息队列。
示例性的,在为目录文件扩容N个消息队列时,N可以为M的整数倍。
在一种可能的实施方式中,若目录文件中的各原始消息队列的消费位点,均大于该原始消息队列的最小位点,则允许为该目录文件扩容N个目标消息队列,在此前提下,才需要进行扩容,并为目录文件扩容N个目标消息队列。
示例性的,可以获取目录文件的消费列表,该消费列表包括消费者针对原始消息队列的消费位点,参见表1所示,以两个消费者和两个原始消息队列为例,从表1可以看出,消费者1针对消息队列0的消费位点是位点3。
表1
消费者1 消费者2
消息队列0 位点3 位点4
消息队列1 位点1 位点3
综上所述,若消费者1针对消息队列0的消费位点大于消息队列0的最小位点,消费者2针对消息队列0的消费位点大于消息队列0的最小位点,消费者1针对消息队列1的消费位点大于消息队列1的最小位点,消费者2针对消息队列1的消费位点大于消息队列1的最小位点,才允许扩容目标消息队列。
在一种可能的实施方式中,在为目录文件扩容目标消息队列时,需要成倍扩容目标消息队列,即,目标消息队列的数量N是原始消息队列的数量M的整数倍。参见图3A所示,以采取两倍扩容为例进行说明,扩容前的原始消息队列的数量M为2,扩容后的目标消息队列的数量N为2,显然,在扩容后,一共存在4个消息队列,包括两个原始消息队列和两个目标消息队列。
成倍扩容目标消息队列的原因是:针对某个分区键的消息数据,在扩容之后,该分区键的消息数据所属的消息队列,可能未发生变化,也可能发生变化,但在发生变化时,变化后的消息队列只能是目标消息队列,而不是另外一个原始消息队列,上述特点是该分区键的消息数据不会发生乱序的前提,从而保证该分区键对应的消息数据按照顺序进行发布和消费,实现消息队列的平滑扩容。
参见图3A所示,针对分区键为5的消息数据,在扩容之前,对应消息队列1,在扩容之后,仍然对应消息队列1,即消息队列未发生变化。针对分区键为3的消息数据,在扩容之前,对应消息队列1,在扩容之后,对应消息队列3,即消息队列是目标消息队列,而不是另外一个原始消息队列(消息队列0)。
步骤203,为目标消息队列关闭读模式,以禁止从目标消息队列中读取目标消息数据的日志信息;为目标消息队列开启写模式,以允许将目标消息数据的日志信息存储到目标消息队列。为原始消息队列开启写模式,以允许将目标消息数据的日志信息存储到原始消息队列;为原始消息队列开启读模式,以允许从原始消息队列中读取原始消息数据的日志信息和目标消息数据的日志信息。
示例性的,参见图3B所示,在为目录文件扩容N个目标消息队列之后,为目标消息队列关闭读模式,为目标消息队列开启写模式。在扩容之前,原始消息队列为开启写模式和开启读模式,在扩容之后,不会对原始消息队列的写模式和读模式进行改变,即,仍然为原始消息队列开启写模式和开启读模式。
针对第一数据文件中的原始消息数据,这些原始消息数据的日志信息已经存储到原始消息队列,本实施例中,不再将这些原始消息数据的日志信息迁移到目标消息队列。在扩容N个目标消息队列之后,针对第二数据文件中的目标消息数据,由于原始消息队列和目标消息队列均开启写模式,因此,目标消息数据的日志信息可能存储到原始消息队列,也可能存储到目标消息队列。
由于原始消息队列开启读模式,且原始消息队列存储有原始消息数据的日志信息,也存储有目标消息数据的日志信息,因此,从原始消息队列中读取原始消息数据的日志信息,并从原始消息队列中读取目标消息数据的日志信息。
由于目标消息队列关闭读模式,因此,即使目标消息队列存储有目标消息数据的日志信息,也不能从目标消息队列中读取目标消息数据的日志信息。
示例性的,在为目录文件扩容N个目标消息队列之后,消息队列的总数量为N+M,在此基础上,可以依次遍历第二数据文件中的每个目标消息数据,针对当前遍历的任一目标消息数据,确定该目标消息数据对应的消息主题,并确定对应的消息队列,即目录文件中包括的M个原始消息队列和N个目标消息队列。然后,基于该目标消息数据的分区键、原始消息队列的数量M、目标消息队列的数量N,从原始消息队列和目标消息队列中确定该目标消息数据所属的消息队列,在该消息队列中存储该目标消息数据的日志信息。
比如说,可以对该目标消息数据的分区键与队列总数量(数量M与数量N之和)进行取余哈希运算,并基于哈希运算结果确定该目标消息数据所属的消息队列,并在该消息队列的尾部记录该目标消息数据的日志信息。
参见图3A所示,原始消息队列的数量M为2,目标消息队列的数量N为2,可以对目标消息数据的分区键与数值4进行取余哈希运算。显然,若哈希运算结果为0,则该目标消息数据对应消息队列0,若哈希运算结果为1,则该目标消息数据对应消息队列1,若哈希运算结果为2,则该目标消息数据对应消息队列2,若哈希运算结果为3,则该目标消息数据对应消息队列3。
步骤204,在目标消息队列中已存储目标消息数据的日志信息(即存储首个目标消息数据的日志信息)时,记录原始消息队列在当前时刻的最大位点。
示例性的,若N个目标消息队列中的任一目标消息队列的最大位点不为零,则可以确定目标消息队列中已存储目标消息数据的日志信息,并记录原始消息队列在当前时刻的最大位点,参见图3C所示,为记录最大位点的示意图。
示例性的,在扩容N个目标消息队列之后,监控N个目标消息队列的最大位点,若任意一个目标消息队列的最大位点不为零,则说明已经在目标消息队列中存储目标消息数据的日志信息,此时,记录每个原始消息队列在当前时刻的最大位点,将该最大位点作为开启目标消息队列的读模式的开关。
示例性的,在目标消息队列中存储首个日志信息时,才记录每个原始消息队列在当前时刻的最大位点,可以保证此时记录的最大位点包含扩容发生这一瞬间之前的所有消息数据,从而保证消息数据按照顺序进行发布和消费。
步骤205,在原始消息队列的消费位点到达该最大位点时,为目标消息队列开启读模式,以允许从目标消息队列中读取目标消息数据的日志信息。
参见步骤204,可以记录原始消息队列在当前时刻的最大位点,为了区分方便,将该最大位点记为原始消息队列的目标位点,该目标位点不会发生变化。
示例性的,以两个消费者和两个原始消息队列为例,若消费者1针对消息队列0的消费位点到达消息队列0的目标位点,消费者2针对消息队列0的消费位点到达消息队列0的目标位点,消费者1针对消息队列1的消费位点到达消息队列1的目标位点,消费者2针对消息队列1的消费位点到达消息队列1的目标位点,则说明原始消息队列的消费位点均到达目标位点,此时,为每个目标消息队列开启读模式,参见图3D所示,为开启读模式的示意图。
示例性的,若在预设时间内,消费者针对消息队列的消费位点无法到达消息队列的目标位点,还可以通过人工介入等方式,使得消费者针对消息队列的消费位点到达消息队列的目标位点,继而为目标消息队列开启读模式。
综上所述,当所有消费者的消费位点均大于或者等于记录的最大位点(即目标位点)时,目标消息队列开启读模式,从而有效保障在不迁移数据的前提下,消息数据按照顺序进行发布和消费,实现消息队列的平滑扩容。
示例性的,在扩容目标消息队列之后,消息数据按照顺序进行发布和消费,可以包括:在扩容之前,针对分区键为3的消息数据2,消息数据5和消息数据6,这些消息数据的日志信息均存储在消息队列1。在扩容后,针对分区键为3的消息数据A,消息数据A的日志信息存储在消息队列3,而不是存储在消息队列1。在消息数据A的发布时,消息数据A位于消息数据6的后面。
显然,在记录消息队列1的目标位点时,目标位点之前的位点(包括目标位点),已经包括消息数据2的日志信息,消息数据5的日志信息和消息数据6的日志信息,因此,在消费位点到达目标位点时,消费者已经读取到消息数据2,消息数据5和消息数据6,此时为目标消息队列开启读模式,使得消费者在读取到消息数据6之后,才读取消息数据A,从而保证消息数据按照顺序消费。
若未采用上述技术方案,即不限制读模式的开启时机,消费者可能先读取到消息数据2,然后读取消息数据A,然后读取消息数据5和消息数据6,显然,上述方式无法保证消息数据按照顺序进行消费,导致消费者的处理异常。
在一个例子中,上述执行顺序只是为了方便描述给出的一个示例,在实际应用中,还可以改变步骤之间的执行顺序,对此执行顺序不做限制。而且,在其它实施例中,并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其它实施例中可能被分解为多个步骤进行描述;本说明书中所描述的多个步骤,在其它实施例也可能被合并为单个步骤进行描述。
基于上述技术方案,本申请实施例中,在消息队列的扩容过程中,在不停写的情况下对消息队列进行扩容,即,不需要停止向消息队列中写入消息数据的日志信息,也不需要停止从消息队列中读取消息数据的日志信息,从而避免应用中断,保证扩容后的分区顺序性,有效避免数据迁移,实现消息队列的平滑扩容,具有耗费资源少,用户体验好,消息队列不乱序等特点。
基于与上述方法同样的构思,本申请实施例还提出一种消息队列的扩容方法,该方法包括:获取第一数据文件和目录文件,第一数据文件包括多个原始消息数据,目录文件包括M个原始消息队列,M为大于1的正整数;原始消息队列用于存储原始消息数据的日志信息;在需要进行扩容时,获取第二数据文件,第二数据文件包括多个目标消息数据,为目录文件扩容N个目标消息队列,N为M的整数倍;为目标消息队列关闭读模式,以禁止从目标消息队列中读取目标消息数据的日志信息;在满足目标消息队列的开启条件时,为目标消息队列开启读模式,以允许从目标消息队列中读取目标消息数据的日志信息。
示例性的,满足目标消息队列的开启条件,可以包括但不限于:在为目录文件扩容N个目标消息队列之后,在目标消息队列中已存储目标消息数据的日志信息时,记录原始消息队列在当前时刻的最大位点;在原始消息队列的消费位点到达最大位点时,确定满足目标消息队列的开启条件。或者,在为目录文件扩容N个目标消息队列之后,记录原始消息队列在当前时刻的最大位点;在原始消息队列的消费位点到达最大位点时,确定满足目标消息队列的开启条件。或者,在为目录文件扩容N个目标消息队列之后,可以为目标消息队列设置定时器,在到达该定时器的超时时间时,确定满足目标消息队列的开启条件。
当然,上述实现方式只是几个示例,对此不做限制。
本申请实施例中提出一种消息队列的缩容方法,参见图4所示,为消息队列的缩容方法的流程示意图,该方法应用于任意设备,该方法可以包括:
步骤401,获取第一数据文件和目录文件,第一数据文件包括多个原始消息数据,目录文件包括P个原始消息队列和L个目标消息队列,P与L的和是P的整数倍;原始消息队列和目标消息队列均用于存储原始消息数据的日志信息。
示例性的,关于第一数据文件,可以参见步骤201,在此不再赘述。
示例性的,目录文件包括K个消息队列,将K个消息队列区分为P个原始消息队列和L个目标消息队列,K是P的整数倍,本实施例中,P个原始消息队列是需要保留的消息队列,L个目标消息队列是后续需要缩容的消息队列。
示例性的,可以依次遍历第一数据文件中的每个原始消息数据,针对当前遍历的任一原始消息数据,确定该原始消息数据对应的消息主题,并确定对应的消息队列,即目录文件中包括的P个原始消息队列和L个目标消息队列。然后,基于该原始消息数据的分区键、原始消息队列的数量P、目标消息队列的数量L,从原始消息队列和目标消息队列中确定该原始消息数据所属的消息队列,并在该消息队列中存储该原始消息数据的日志信息。
比如说,可以对该原始消息数据的分区键与消息队列的总数量(数量P与数量L之和)进行取余哈希运算,并基于哈希运算结果确定该原始消息数据所属的消息队列,并在该消息队列的尾部记录该原始消息数据的日志信息。
步骤402,在需要进行缩容时,获取第二数据文件,第二数据文件包括多个目标消息数据,原始消息队列用于存储目标消息数据的日志信息。
示例性的,关于第二数据文件,可以参见步骤202,在此不再赘述。
在一种可能的实施方式中,若目录文件中的各原始消息队列的消费位点,均大于该原始消息队列的最小位点,且目录文件中的各目标消息队列的消费位点,均大于该目标消息队列的最小位点,则允许对目标消息队列进行缩容处理。
在一种可能的实施方式中,可以将K个消息队列缩容为P个原始消息队列,比如说,保留P个原始消息队列,对L个目标消息队列进行缩容(具体缩容过程在后续步骤)。在需要进行缩容时,需要成倍缩容,即消息队列的数量K是原始消息队列的数量P的整数倍。参见图5所示,为成倍缩容的示意图,缩容前为4个消息队列,缩容后去除2个目标消息队列,剩余2个原始消息队列。
成倍缩容的原因是:针对某个分区键的消息数据,在缩容之前对应原始消息队列,在缩容之后仍然对应该原始消息队列,而不会对应到另一个原始消息队列。针对某个分区键的消息数据,在缩容之前对应目标消息队列,在缩容之后对应某个原始消息队列。上述特点是消息数据不会发生乱序的前提,从而保证消息数据按照顺序进行发布和消费,实现消息队列的平滑缩容。
参见图5所示,针对分区键为5的消息数据,在缩容之前,对应原始消息队列1,在缩容之后,仍然对应原始消息队列1,而不会对应原始消息队列0。
步骤403,为目标消息队列关闭写模式,以禁止将目标消息数据的日志信息存储到目标消息队列;为目标消息队列开启读模式,以允许从目标消息队列中读取原始消息数据的日志信息。为原始消息队列开启写模式,以允许将目标消息数据的日志信息存储到原始消息队列;为原始消息队列关闭读模式,以禁止从原始消息队列中读取原始消息数据的日志信息和目标消息数据的日志信息。
示例性的,在需要进行缩容时,为目标消息队列关闭写模式,为目标消息队列开启读模式。为原始消息队列开启写模式,为原始消息队列关闭读模式。
示例性的,针对第二数据文件中的目标消息数据,由于原始消息队列开启写模式,目标消息队列关闭写模式,因此,目标消息数据的日志信息可以存储到原始消息队列,目标消息数据的日志信息不会存储到目标消息队列。
由于目标消息队列开启读模式,且目标消息队列存储有原始消息数据的日志信息,因此,可以从目标消息队列中读取原始消息数据的日志信息。
示例性的,由于原始消息队列关闭读模式,因此,即使原始消息队列存储有原始消息数据的日志信息和目标消息数据的日志信息,也不能从原始消息队列中读取原始消息数据的日志信息和目标消息数据的日志信息。
示例性的,针对第二数据文件,可以依次遍历第二数据文件中的每个目标消息数据,针对当前遍历的任一目标消息数据,确定该目标消息数据对应的消息主题,并确定对应的消息队列,即目录文件中包括的P个原始消息队列。然后,基于该目标消息数据的分区键和原始消息队列的数量P,确定该目标消息数据所属的原始消息队列,在该原始消息队列中存储该目标消息数据的日志信息。比如说,可以对该目标消息数据的分区键与原始消息队列的数量P进行取余哈希运算,并基于哈希运算结果确定该目标消息数据所属的原始消息队列,并在该原始消息队列的尾部记录该目标消息数据的日志信息。
步骤404,记录目标消息队列在当前时刻的最大位点,并在目标消息队列的消费位点到达该最大位点时,对目标消息队列进行缩容处理。以及,为原始消息队列开启读模式,以允许从原始消息队列中读取目标消息数据的日志信息。
示例性的,在需要进行缩容时,可以记录目标消息队列在当前时刻的最大位点,为了区分方便,将该最大位点记为目标消息队列的目标位点。当所有消费者针对目标消息队列的消费位点均大于或者等于记录的最大位点(即目标位点)时,对目标消息队列进行缩容处理(即去除目标消息队列),并为原始消息队列开启读模式,即,允许从原始消息队列中读取目标消息数据的日志信息,允许从原始消息队列中读取原始消息数据的日志信息,从而有效保障在不迁移数据的前提下,消息数据按照顺序进行发布和消费,实现消息队列的平滑缩容。
示例性的,若在预设时间内,消费者针对目标消息队列的消费位点无法到达目标消息队列目标位点,还可以通过人工介入等方式,使得消费者针对目标消息队列的消费位点到达目标消息队列目标位点,对此过程不再赘述。
示例性的,在缩容目标消息队列之后,消息数据按照顺序进行发布和消费,可以包括:在缩容之前,针对分区键为3的消息数据2,消息数据5和消息数据6,这些消息数据的日志信息均存储在消息队列3。在缩容后,针对分区键为3的消息数据A,消息数据A的日志信息存储在消息队列1,而不是存储在消息队列3。在消息数据A的发布时,消息数据A位于消息数据6的后面。
显然,在记录消息队列3的目标位点时,目标位点之前的位点(包括目标位点),已经包括消息数据2的日志信息,消息数据5的日志信息和消息数据6的日志信息,因此,在消费位点到达目标位点时,消费者已经读取到消息数据2,消息数据5和消息数据6,此时为原始消息队列开启读模式,使得消费者在读取到消息数据6之后,才读取消息数据A,从而保证消息数据按照顺序消费。
在一个例子中,上述执行顺序只是为了方便描述给出的一个示例,在实际应用中,还可以改变步骤之间的执行顺序,对此执行顺序不做限制。而且,在其它实施例中,并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其它实施例中可能被分解为多个步骤进行描述;本说明书中所描述的多个步骤,在其它实施例也可能被合并为单个步骤进行描述。
基于上述技术方案,本申请实施例中,在消息队列的缩容过程中,在不停写的情况下对消息队列进行缩容,即,不需要停止向消息队列中写入消息数据的日志信息,也不需要停止从消息队列中读取消息数据的日志信息,从而避免应用中断,保证缩容后的分区顺序性,有效避免数据迁移,实现消息队列的平滑缩容,具有耗费资源少,用户体验好,消息队列不乱序等特点。
本申请实施例中提出一种消息队列的处理方法,参见图6所示,为消息队列的处理方法的流程示意图,该方法应用于任意设备,该方法可以包括:
步骤601,获取第一数据文件,第一数据文件包括多个原始消息数据。
步骤602,获取目录文件,该目录文件包括至少两个原始消息队列。
步骤603,针对任一原始消息数据,基于该原始消息数据的分区键和原始消息队列的数量,确定该原始消息数据所属的原始消息队列。
步骤604,在该原始消息队列中存储该原始消息数据的日志信息。
在一种可能的实施方式中,在需要进行扩容时,获取第二数据文件,第二数据文件包括多个目标消息数据,为该目录文件扩容至少两个目标消息队列,目标消息队列的数量是原始消息队列的数量的整数倍。为目标消息队列关闭读模式,以禁止从目标消息队列中读取目标消息数据的日志信息;在目标消息队列中已存储目标消息数据的日志信息时,记录原始消息队列在当前时刻的最大位点。在原始消息队列的消费位点到达该最大位点时,为目标消息队列开启读模式,以允许从目标消息队列中读取目标消息数据的日志信息。
在一种可能的实施方式中,目录文件还包括至少两个目标消息队列,原始消息队列的数量与目标消息队列的数量之和,是原始消息队列的数量的整数倍;在需要进行缩容时,可以获取第二数据文件,第二数据文件包括多个目标消息数据。为目标消息队列关闭写模式,以禁止将目标消息数据的日志信息存储到目标消息队列;以及,为目标消息队列开启读模式,以允许从目标消息队列中读取原始消息数据的日志信息。记录目标消息队列在当前时刻的最大位点,并在目标消息队列的消费位点到达最大位点时,对目标消息队列进行缩容处理。
基于上述技术方案,本申请实施例中,利用哈希分区算法特点进行成倍扩缩容,通过控制最大位点,最小位点,消费位点指针,有效避免数据迁移,在不停写的情况下,实现顺序队列的平滑扩缩容,具有耗费资源少,用户体验好,扩缩容前后顺序队列不乱序等特点。数据文件和目录文件分离的设计思路,既提高了数据存储检索的效率,又为运维过程中的扩缩容提供了便利。
基于与上述方法同样的申请构思,本申请实施例还提供一种消息队列的扩容装置,如图7A所示,为所述装置的结构图,所述装置包括:
获取模块711,用于获取第一数据文件和目录文件,所述第一数据文件包括多个原始消息数据,所述目录文件包括M个原始消息队列,M为大于1的正整数;其中,所述原始消息队列用于存储原始消息数据的日志信息;
在需要进行扩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,为所述目录文件扩容N个目标消息队列,N为M的整数倍;
处理模块712,用于为所述目标消息队列关闭读模式,以禁止从所述目标消息队列中读取目标消息数据的日志信息;在所述目标消息队列中已存储目标消息数据的日志信息时,记录所述原始消息队列在当前时刻的最大位点;
在所述原始消息队列的消费位点到达所述最大位点时,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取目标消息数据的日志信息。
所述处理模块712还用于:在为目录文件扩容N个目标消息队列后,为所述目标消息队列开启写模式,以允许将目标消息数据的日志信息存储到所述目标消息队列。为所述原始消息队列开启写模式,以允许将目标消息数据的日志信息存储到所述原始消息队列,为原始消息队列开启读模式,以允许从所述原始消息队列中读取原始消息数据的日志信息以及目标消息数据的日志信息。
基于与上述方法同样的申请构思,本申请实施例还提供一种消息队列的缩容装置,如图7B所示,为所述装置的结构图,所述装置包括:
获取模块721,用于获取第一数据文件和目录文件,第一数据文件包括多个原始消息数据,所述目录文件包括P个原始消息队列和L个目标消息队列,P与L的和是P的整数倍;原始消息队列和目标消息队列均用于存储原始消息数据的日志信息;在需要进行缩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,所述原始消息队列用于存储目标消息数据的日志信息;
处理模块722,用于为所述目标消息队列关闭写模式,以禁止将目标消息数据的日志信息存储到所述目标消息队列;以及,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取原始消息数据的日志信息;
记录所述目标消息队列在当前时刻的最大位点,并在所述目标消息队列的消费位点到达所述最大位点时,对所述目标消息队列进行缩容处理。
所述处理模块722还用于:在需要进行缩容时,为原始消息队列开启写模式,以允许将目标消息数据的日志信息存储到所述原始消息队列,为所述原始消息队列关闭读模式,以禁止从所述原始消息队列中读取目标消息数据的日志信息;在所述目标消息队列的消费位点到达所述最大位点时,为所述原始消息队列开启读模式,以允许从所述原始消息队列中读取目标消息数据的日志信息。
基于与上述方法同样的申请构思,本申请实施例还提供一种电子设备,用于实现消息队列的扩容,包括:处理器和机器可读存储介质,所述机器可读存储介质上存储有若干计算机指令,所述处理器执行所述计算机指令时进行如下处理:获取第一数据文件和目录文件,所述第一数据文件包括多个原始消息数据,所述目录文件包括M个原始消息队列,M为大于1的正整数;其中,所述原始消息队列用于存储原始消息数据的日志信息;
在需要进行扩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,为所述目录文件扩容N个目标消息队列,N为M的整数倍;
为所述目标消息队列关闭读模式,以禁止从所述目标消息队列中读取目标消息数据的日志信息;在所述目标消息队列中已存储目标消息数据的日志信息时,记录所述原始消息队列在当前时刻的最大位点;
在所述原始消息队列的消费位点到达所述最大位点时,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取目标消息数据的日志信息。
基于与上述方法同样的申请构思,本申请实施例还提供一种电子设备,用于实现消息队列的缩容,包括:处理器和机器可读存储介质,所述机器可读存储介质上存储有若干计算机指令,所述处理器执行所述计算机指令时进行如下处理:获取第一数据文件和目录文件,所述第一数据文件包括多个原始消息数据,所述目录文件包括P个原始消息队列和L个目标消息队列,P与L的和是P的整数倍;原始消息队列和目标消息队列均用于存储原始消息数据的日志信息;
在需要进行缩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,所述原始消息队列用于存储目标消息数据的日志信息;
为所述目标消息队列关闭写模式,以禁止将目标消息数据的日志信息存储到所述目标消息队列;以及,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取原始消息数据的日志信息;
记录所述目标消息队列在当前时刻的最大位点,并在所述目标消息队列的消费位点到达所述最大位点时,对所述目标消息队列进行缩容处理。
本申请实施例还提供一种机器可读存储介质,所述机器可读存储介质上存储有若干计算机指令;所述计算机指令被执行时,执行上述扩容或缩容流程。
参见图8所示,为本申请实施例中提出的电子设备的结构图,所述电子设备80可以包括:处理器81,网络接口82,总线83,存储器84。存储器84可以是任何电子、磁性、光学或其它物理存储装置,可以包含或存储信息,如可执行指令、数据等等。例如,存储器84可以是:RAM(Radom Access Memory,随机存取存储器)、易失存储器、非易失性存储器、闪存、存储驱动器(如硬盘驱动器)、固态硬盘、任何类型的存储盘(如光盘、dvd等)。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可以由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其它可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其它可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
而且,这些计算机程序指令也可以存储在能引导计算机或其它可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或者多个流程和/或方框图一个方框或者多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其它可编程数据处理设备上,使得在计算机或者其它可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其它可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

Claims (17)

1.一种消息队列的扩容方法,所述方法包括:
获取第一数据文件和目录文件,所述第一数据文件包括多个原始消息数据,所述目录文件包括M个原始消息队列,M为大于1的正整数;其中,所述原始消息队列用于存储原始消息数据的日志信息;
在需要进行扩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,为所述目录文件扩容N个目标消息队列;
为所述目标消息队列关闭读模式,以禁止从所述目标消息队列中读取目标消息数据的日志信息;在所述目标消息队列中已存储目标消息数据的日志信息时,记录所述原始消息队列在当前时刻的最大位点;
在所述原始消息队列的消费位点到达所述最大位点时,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取目标消息数据的日志信息。
2.根据权利要求1所述的方法,所述方法还包括:
在为所述目录文件扩容N个目标消息队列之后,为所述目标消息队列开启写模式,以允许将目标消息数据的日志信息存储到所述目标消息队列。
3.根据权利要求1所述的方法,所述方法还包括:
在为所述目录文件扩容N个目标消息队列之后,为所述原始消息队列开启写模式,以允许将目标消息数据的日志信息存储到所述原始消息队列,以及,
为所述原始消息队列开启读模式,以允许从所述原始消息队列中读取原始消息数据的日志信息以及目标消息数据的日志信息。
4.根据权利要求1所述的方法,所述方法还包括:
若所述目录文件中的各原始消息队列的消费位点,均大于该原始消息队列的最小位点,则允许为所述目录文件扩容N个目标消息队列。
5.根据权利要求1或2所述的方法,
所述目标消息队列中已存储目标消息数据的日志信息的确定过程,包括:
若N个目标消息队列中的任一目标消息队列的最大位点不为零,则确定所述目标消息队列中已存储目标消息数据的日志信息。
6.根据权利要求1所述的方法,针对任一原始消息数据,基于该原始消息数据的分区键和原始消息队列的数量M,确定该原始消息数据所属的原始消息队列,在该原始消息队列中存储该原始消息数据的日志信息;
针对任一目标消息数据,基于目标消息数据的分区键、原始消息队列的数量M、目标消息队列的数量N,从原始消息队列和目标消息队列中确定该目标消息数据所属的消息队列,在该消息队列中存储该目标消息数据的日志信息。
7.一种消息队列的扩容方法,所述方法包括:
获取第一数据文件和目录文件,所述第一数据文件包括多个原始消息数据,所述目录文件包括M个原始消息队列,M为大于1的正整数;其中,所述原始消息队列用于存储原始消息数据的日志信息;
在需要进行扩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,为所述目录文件扩容N个目标消息队列,N为M的整数倍;
为所述目标消息队列关闭读模式,以禁止从所述目标消息队列中读取目标消息数据的日志信息;在满足目标消息队列的开启条件时,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取目标消息数据的日志信息。
8.一种消息队列的缩容方法,所述方法包括:
获取第一数据文件和目录文件,所述第一数据文件包括多个原始消息数据,所述目录文件包括P个原始消息队列和L个目标消息队列,P与L的和是P的整数倍;原始消息队列和目标消息队列均用于存储原始消息数据的日志信息;
在需要进行缩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,所述原始消息队列用于存储目标消息数据的日志信息;
为所述目标消息队列关闭写模式,以禁止将目标消息数据的日志信息存储到所述目标消息队列;以及,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取原始消息数据的日志信息;
记录所述目标消息队列在当前时刻的最大位点,并在所述目标消息队列的消费位点到达所述最大位点时,对所述目标消息队列进行缩容处理。
9.根据权利要求8所述的方法,所述方法还包括:
在需要进行缩容时,为所述原始消息队列开启写模式,以允许将目标消息数据的日志信息存储到所述原始消息队列,为所述原始消息队列关闭读模式,以禁止从所述原始消息队列中读取目标消息数据的日志信息;
在所述目标消息队列的消费位点到达所述最大位点时,为所述原始消息队列开启读模式,以允许从所述原始消息队列中读取目标消息数据的日志信息。
10.根据权利要求8所述的方法,所述方法还包括:
若所述目录文件中的各原始消息队列的消费位点,均大于该原始消息队列的最小位点,且所述目录文件中的各目标消息队列的消费位点,均大于该目标消息队列的最小位点,则允许对所述目标消息队列进行缩容处理。
11.根据权利要求8所述的方法,针对任一目标消息数据,基于该目标消息数据的分区键和原始消息队列的数量P,确定该目标消息数据所属的原始消息队列,在该原始消息队列中存储该目标消息数据的日志信息;
针对任一原始消息数据,基于原始消息数据的分区键、原始消息队列的数量P、目标消息队列的数量L,从原始消息队列和目标消息队列中确定该原始消息数据所属的消息队列,在该消息队列中存储该原始消息数据的日志信息。
12.一种消息队列的处理方法,所述方法包括:
获取第一数据文件,所述第一数据文件包括多个原始消息数据;
获取目录文件,所述目录文件包括至少两个原始消息队列;
针对任一原始消息数据,基于所述原始消息数据的分区键和原始消息队列的数量,确定所述原始消息数据所属的原始消息队列;
在该原始消息队列中存储所述原始消息数据的日志信息;
其中,所述方法还包括:
在需要进行扩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,以及,为所述目录文件扩容至少两个目标消息队列,目标消息队列的数量是原始消息队列的数量的整数倍;
为所述目标消息队列关闭读模式,以禁止从所述目标消息队列中读取目标消息数据的日志信息;在所述目标消息队列中已存储目标消息数据的日志信息时,记录所述原始消息队列在当前时刻的最大位点;
在所述原始消息队列的消费位点到达所述最大位点时,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取目标消息数据的日志信息。
13.根据权利要求12所述的方法,所述目录文件还包括至少两个目标消息队列,原始消息队列的数量与目标消息队列的数量之和,是原始消息队列的数量的整数倍;在需要进行缩容时,所述方法还包括:
获取第二数据文件,所述第二数据文件包括多个目标消息数据;
为所述目标消息队列关闭写模式,以禁止将目标消息数据的日志信息存储到所述目标消息队列;以及,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取原始消息数据的日志信息;
记录所述目标消息队列在当前时刻的最大位点,并在所述目标消息队列的消费位点到达所述最大位点时,对所述目标消息队列进行缩容处理。
14.一种消息队列的扩容装置,所述装置包括:
获取模块,用于获取第一数据文件和目录文件,所述第一数据文件包括多个原始消息数据,所述目录文件包括M个原始消息队列,M为大于1的正整数;其中,所述原始消息队列用于存储原始消息数据的日志信息;
在需要进行扩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,为所述目录文件扩容N个目标消息队列;
处理模块,用于为所述目标消息队列关闭读模式,以禁止从所述目标消息队列中读取目标消息数据的日志信息;在所述目标消息队列中已存储目标消息数据的日志信息时,记录所述原始消息队列在当前时刻的最大位点;
在所述原始消息队列的消费位点到达所述最大位点时,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取目标消息数据的日志信息。
15.一种消息队列的缩容装置,所述装置包括:
获取模块,用于获取第一数据文件和目录文件,所述第一数据文件包括多个原始消息数据,所述目录文件包括P个原始消息队列和L个目标消息队列,P与L的和是P的整数倍;原始消息队列和目标消息队列均用于存储原始消息数据的日志信息;在需要进行缩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,所述原始消息队列用于存储目标消息数据的日志信息;
处理模块,用于为所述目标消息队列关闭写模式,以禁止将目标消息数据的日志信息存储到所述目标消息队列;以及,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取原始消息数据的日志信息;
记录所述目标消息队列在当前时刻的最大位点,并在所述目标消息队列的消费位点到达所述最大位点时,对所述目标消息队列进行缩容处理。
16.一种电子设备,用于实现消息队列的扩容,包括:
处理器和机器可读存储介质,所述机器可读存储介质上存储有若干计算机指令,所述处理器执行所述计算机指令时进行如下处理:
获取第一数据文件和目录文件,所述第一数据文件包括多个原始消息数据,所述目录文件包括M个原始消息队列,M为大于1的正整数;其中,所述原始消息队列用于存储原始消息数据的日志信息;
在需要进行扩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,为所述目录文件扩容N个目标消息队列;
为所述目标消息队列关闭读模式,以禁止从所述目标消息队列中读取目标消息数据的日志信息;在所述目标消息队列中已存储目标消息数据的日志信息时,记录所述原始消息队列在当前时刻的最大位点;
在所述原始消息队列的消费位点到达所述最大位点时,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取目标消息数据的日志信息。
17.一种电子设备,用于实现消息队列的缩容,包括:
处理器和机器可读存储介质,所述机器可读存储介质上存储有若干计算机指令,所述处理器执行所述计算机指令时进行如下处理:
获取第一数据文件和目录文件,所述第一数据文件包括多个原始消息数据,所述目录文件包括P个原始消息队列和L个目标消息队列,P与L的和是P的整数倍;原始消息队列和目标消息队列均用于存储原始消息数据的日志信息;
在需要进行缩容时,获取第二数据文件,所述第二数据文件包括多个目标消息数据,所述原始消息队列用于存储目标消息数据的日志信息;
为所述目标消息队列关闭写模式,以禁止将目标消息数据的日志信息存储到所述目标消息队列;以及,为所述目标消息队列开启读模式,以允许从所述目标消息队列中读取原始消息数据的日志信息;
记录所述目标消息队列在当前时刻的最大位点,并在所述目标消息队列的消费位点到达所述最大位点时,对所述目标消息队列进行缩容处理。
CN202010674059.4A 2020-07-14 2020-07-14 消息队列的扩容、缩容、处理方法、装置及设备 Active CN113296971B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010674059.4A CN113296971B (zh) 2020-07-14 2020-07-14 消息队列的扩容、缩容、处理方法、装置及设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010674059.4A CN113296971B (zh) 2020-07-14 2020-07-14 消息队列的扩容、缩容、处理方法、装置及设备

Publications (2)

Publication Number Publication Date
CN113296971A CN113296971A (zh) 2021-08-24
CN113296971B true CN113296971B (zh) 2024-04-19

Family

ID=77318125

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010674059.4A Active CN113296971B (zh) 2020-07-14 2020-07-14 消息队列的扩容、缩容、处理方法、装置及设备

Country Status (1)

Country Link
CN (1) CN113296971B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115086153B (zh) * 2022-05-20 2024-05-28 阿里巴巴(中国)有限公司 消息处理系统、消息处理方法、设备和存储介质
CN116909779B (zh) * 2023-09-11 2024-01-26 中移(苏州)软件技术有限公司 一种消息处理方法、装置及相关设备

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0918284A2 (en) * 1997-11-03 1999-05-26 Mitsubishi Denki Kabushiki Kaisha Log based data architecture for a transactional message queuing system
CN106657314A (zh) * 2016-12-14 2017-05-10 北京奇艺世纪科技有限公司 跨数据中心数据同步系统及方法
WO2017200878A1 (en) * 2016-05-17 2017-11-23 Amazon Technologies, Inc. Versatile autoscaling
CN108984320A (zh) * 2018-06-27 2018-12-11 郑州云海信息技术有限公司 一种消息队列集群防脑裂方法及装置
CN111240860A (zh) * 2020-01-07 2020-06-05 广州虎牙科技有限公司 消息处理方法及服务系统

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6353834B1 (en) * 1996-11-14 2002-03-05 Mitsubishi Electric Research Laboratories, Inc. Log based data architecture for a transactional message queuing system
EP0918284A2 (en) * 1997-11-03 1999-05-26 Mitsubishi Denki Kabushiki Kaisha Log based data architecture for a transactional message queuing system
WO2017200878A1 (en) * 2016-05-17 2017-11-23 Amazon Technologies, Inc. Versatile autoscaling
CN106657314A (zh) * 2016-12-14 2017-05-10 北京奇艺世纪科技有限公司 跨数据中心数据同步系统及方法
CN108984320A (zh) * 2018-06-27 2018-12-11 郑州云海信息技术有限公司 一种消息队列集群防脑裂方法及装置
CN111240860A (zh) * 2020-01-07 2020-06-05 广州虎牙科技有限公司 消息处理方法及服务系统

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
分布式数据库中一致性与可用性的关系;朱涛;郭进伟;周欢;周烜;周傲英;;软件学报(01);全文 *

Also Published As

Publication number Publication date
CN113296971A (zh) 2021-08-24

Similar Documents

Publication Publication Date Title
CN107038206B (zh) Lsm树的建立方法、lsm树的数据读取方法和服务器
CN109274754B (zh) 用于在区块链网络中同步数据的方法、设备和存储介质
CN113296971B (zh) 消息队列的扩容、缩容、处理方法、装置及设备
CN108628688B (zh) 一种消息处理方法、装置及设备
CN111737265B (zh) 区块数据访问方法、区块数据存储方法及装置
CN107621927B (zh) 一种基于超融合系统的纵向扩展方法及其装置
CN105608142B (zh) 一种Json数据的存储方法及装置
CN112000426B (zh) 一种数据处理方法及装置
CN110597655B (zh) 迁移和基于纠删码的重构相耦合快速预知修复方法及装置
CN106775470B (zh) 一种数据存储的方法及系统
CN107015876B (zh) 一种业务请求处理方法及装置
CN107153680B (zh) 一种分布式内存数据库在线扩展节点的方法及系统
CN117369731B (zh) 一种数据的缩减处理方法、装置、设备及介质
CN113672255A (zh) 一种分布式存储软件升级方法及装置
CN113467719A (zh) 数据写入方法及装置
CN112035428A (zh) 分布式存储系统、方法、装置、电子设备和存储介质
CN110008382B (zh) 一种确定TopN数据的方法、系统及设备
CN111158931A (zh) 一种针对Kafka分区的数据动态均衡方法、装置及存储介质
CN111046004A (zh) 一种数据文件存储方法、装置、设备及存储介质
CN109658094B (zh) 随机游走、基于集群的随机游走方法、装置以及设备
CN116501927A (zh) 一种图数据处理系统、方法、设备及存储介质
CN114297196B (zh) 元数据存储方法、装置、电子设备及存储介质
CN116166614A (zh) 一种日志归档的方法、装置、存储介质及电子设备
CN104298614A (zh) 数据块在存储设备中存储方法和存储设备
CN112800057B (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
REG Reference to a national code

Ref country code: HK

Ref legal event code: DE

Ref document number: 40058675

Country of ref document: HK

GR01 Patent grant
GR01 Patent grant