CN114253743A - 消息同步方法、装置、节点及可读存储介质 - Google Patents
消息同步方法、装置、节点及可读存储介质 Download PDFInfo
- Publication number
- CN114253743A CN114253743A CN202111506274.4A CN202111506274A CN114253743A CN 114253743 A CN114253743 A CN 114253743A CN 202111506274 A CN202111506274 A CN 202111506274A CN 114253743 A CN114253743 A CN 114253743A
- Authority
- CN
- China
- Prior art keywords
- message
- partition
- storage area
- node
- messages
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
- G06F11/14—Error detection or correction of the data by redundancy in operation
- G06F11/1402—Saving, restoring, recovering or retrying
- G06F11/1446—Point-in-time backing up or restoration of persistent data
- G06F11/1448—Management of the data involved in backup or backup restore
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/10—Protocols in which an application is distributed across nodes in the network
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Quality & Reliability (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及消息处理技术领域,提供了一种消息同步方法、装置、节点及可读存储介质,应用于kafka集群中的第一节点,kafka集群还包括与第一节点通信的第二节点,第二节点包括主分区,第一节点包括备份分区,所述方法包括:获取最近一次消费的消费消息的第一编号;获取本地预先存储的、最近一次从主分区同步的同步消息的第二编号;若第二编号与第一编号的差值小于预设值、且第一存储区域中空闲区域满足预设条件,则将主分区中最近一次写入的写入消息的第三编号与第二编号之间的消息同步至第一存储区域。本发明能够提高消息同步效率。
Description
技术领域
本发明涉及消息处理技术领域,具体而言,涉及一种消息同步方法、装置、节点及可读存储介质。
背景技术
Kafka是一种高吞吐量的分布式发布订阅消息系统,生产者将生产的消息推送至kafka,kafka负责管理消息并提供接口供消费者从kafka拉取消息。Kafka通常部署在由多个节点组成的集群中,为了保证消息的安全可靠性,Kafka通常会按照分区将消息及其副本存储至集群中的不同节点的磁盘中。负责对外提供服务的分区为主分区,负责备份消息的分区为备份分区,主分区中的消息按照预设规则同步至备份分区,如何提高消息同步效率为本领域技术人员亟待解决的问题。
发明内容
本发明提供了一种消息同步方法、装置、节点及可读存储介质,其能够能够提高消息同步效率。
为了实现上述目的,本发明采用的技术方案如下:
第一方面,本发明提供一种消息同步方法,应用于kafka集群中的第一节点,所述kafka集群还包括与所述第一节点通信的第二节点,所述第二节点包括主分区,所述主分区中存在按序递增的消息,所述第一节点包括备份分区,所述备份分区用于存储所述主分区中的消息的副本,所述备份分区包括第一存储区域和第二存储区域,所述第一存储区域的访问性能大于所述第二存储区域,所述方法包括:获取最近一次消费的消费消息的第一编号,其中,所述第一编号用于表征所述消费消息在所述主分区中的偏移位置;获取本地预先存储的、最近一次从所述主分区同步的同步消息的第二编号,其中,所述第二编号用于表征所述同步消息在所述主分区中的偏移位置;若所述第二编号与所述第一编号的差值小于预设值、且所述第一存储区域中空闲区域满足预设条件,则将所述主分区中最近一次写入的写入消息的第三编号与所述第二编号之间的消息同步至所述第一存储区域。
第二方面,本发明提供一种消息同步装置,应用于kafka集群中的第一节点,所述kafka集群还包括与所述第一节点通信的第二节点,所述第二节点包括主分区,所述主分区中存在按序递增的消息,所述第一节点包括备份分区,所述备份分区用于存储所述主分区中的消息的副本,所述备份分区包括第一存储区域和第二存储区域,所述第一存储区域的访问性能大于所述第二存储区域,所述装置包括:获取模块,用于获取最近一次消费的消费消息的第一编号,其中,所述第一编号用于表征所述消费消息在所述主分区中的偏移位置;获取模块,还用于获取本地预先存储的、最近一次从所述主分区同步的同步消息的第二编号,其中,所述第二编号用于表征所述同步消息在所述主分区中的偏移位置;同步模块,用于若所述第二编号与所述第一编号的差值小于预设值、且所述第一存储区域中空闲区域满足预设条件,则将所述主分区中最近一次写入的写入消息的第三编号与所述第二编号之间的消息同步至所述第一存储区域。
第三方面,本发明提供一种节点,包括存储器和控制器,所述控制器执行所述计算机程序时实现如上述的消息同步方法。
第四方面,本发明提供计算机可读存储介质,其上存储有计算机程序,该计算机程序被控制器执行时实现如上述的消息同步方法。
与现有技术相比,本发明通过用第一存储区域和第二存储区域组成备份分区,第一存储区域的访问性能大于第二存储区域,在从主备份分区同步消息至备份分区时,首先,获取最近一次消费的消费消息的第一编号和本地预先存储的、最近一次从主分区同步的同步消息的第二编号,第一编号用于表征消费消息在所述主分区中的偏移位置,第二编号用于表征同步消息在主分区中的偏移位置,若第二编号与第一编号的差值小于预设值、且第一存储区域中空闲区域满足预设条件,则将主分区中最近一次写入的写入消息的第三编号与第二编号之间的消息同步至第一存储区域,通过将从主分区中的消息优先同步至第一存储区域,而第一存储区域的访问性能大于第二存储区域,提高了消息同步效率。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为本发明实施例提供的Kafka集群的示例图。
图2为本发明实施例提供的节点的方框示例图。
图3为本发明实施例提供的消息的offset编号的示例图。
图4为本发明实施例提供的一种消息同步方法的流程示例图。
图5为本发明实施例提供的主分区和备份分区中消息的示例图。
图6为本发明实施例提供的另一种消息同步方法的流程示例图。
图7为本发明实施例提供的消息迁移的示例图。
图8为本发明实施例提供的另一种消息同步方法的流程示例图。
图9为本发明实施例提供的另一种消息同步方法的流程示例图。
图10为本发明实施例提供的消息同步方法的具体应用示例图。
图11示出了本发明实施例提供的消息同步装置100的方框示意图。
图标:10-节点;20-生产者;30-消费者;11-控制器;12-存储器;13-总线;14-通信接口;100-消息同步装置;110-获取模块;120-同步模块;130-替换模块。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。
因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
在本发明的描述中,需要说明的是,若出现术语“上”、“下”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,或者是该发明产品使用时惯常摆放的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。
此外,若出现术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
需要说明的是,在不冲突的情况下,本发明的实施例中的特征可以相互结合。
生产者将生产的消息推送至kafka,kafka负责管理消息并提供接口供消费者从kafka拉取消息。为了支撑高吞吐量的消息存储和发布,kafka通常部署在由多个节点组成的集群中,形成kafka集群,其中的节点也称为broker,一般而言,broker数量越多,集群吞吐率越高。kafka集群可以同时和多个生产者和多个消费者进行消息交互。Kafka根据topic对消息进行归类,发布到kafka集群的每条消息都需要指定一个topic,一个topic可以分为多个partition分区,每个partition分区内部中的消息是有序的,一个broker可以存储一个或者多个分区,为了保证消息的可靠性,kafka集群还会为每个分区保存一个或者多个副本,对于每个分区而言,都对应一个主分区和至少一个备份分区,主分区用于和生产者或者消费者进行消息交互,备份分区是主分区的副本,用于备份主分区中的消息,以提高分区中消息的可靠性,通常情况下,对于任一分区,其主分区和备份分区分布于不同的broker,为了便于描述,本发明实施例针对一个分区进行描述,对于该分区而言,其备份分区所属的broker称为第一节点,主分区所属的broker称为第二节点,事实上,在实际应用中,每一个broker可以包括多个主分区和多个备份分区,同一个broker上的备份分区和主分区不对应同一个分区。
需要说明的是,为了对kafka集群进行配置和管理,引入zookeeper保存集群的元数据信息,包括集群配置信息和集群管理信息,zookeeper是一个开源的分布式应用程序协调服务,是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。在本实施例中,zookeeper至少包括以下功能:(1)保存kafka的集群状态信息;(2)负责监听每个broker的状态信息,一旦发现broker宕机,负责从其余broker中选出新的控制者controller;(3)保存消费者的消费信息的偏移量,以使消费者下一次根据该偏移量进行继续消费。
请参考图1,图1为本发明实施例提供的kafka集群的示例图,该kafka集群包括3个节点10:broker1~broker3,同时与4个生产者20和4个消费者30进行消息交互。图1中,分区0的主分区分布在broker1、其两个备份分区分别分布在broker2和broker3,分区1的主分区分布在broker2、其两个备份分区分别分布在broker1和broker3,分区3的主分区分布在broker3、其两个备份分区分别分布在broker1和broker2。对于分区0而言,broker1为第二节点,broker2和broker3均为第一节点,对于分区1而言,broker2为第二节点,broker1和broker3均为第一节点,对于分区2而言,broker3为第二节点,broker1和broker2均为第一节点。
在本实施例中,节点10可以是主机、服务器等实体设备也可以是实现与实体设备相同功能的虚拟机。
生产者20是生产消息的客户端,可以是主机、或者主机组,或者主机集群。
消费者30是消费消息的客户端,可以是主机、或者主机组,或者主机集群。
基于图1,本发明实施例还提供了节点10的方框示例图,用于在节点10充当第一节点时执行应用于第一节点的消息同步方法。请参照图2,图2为本发明实施例提供的节点的方框示例图,节点10包括控制器11、存储器12、总线13及通信接口14,控制器11、存储器12及通信接口14通过总线13连接。
存储器12用于存储程序,例如本发明实施例的消息同步装置100,消息同步装置100包括至少一个可以软件或固件(firmware)的形式存储于存储器12中的软件功能模块,控制器11在接收到执行指令后,执行所述程序以实现本发明实施例中揭示的消息同步方法。
存储器12可能包括高速随机存取存储器(Random Access Memory,RAM),也可能还包括非易失存储器(non-volatile memory,NVM)。
控制器11可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过控制器11中的硬件的集成逻辑电路或者软件形式的指令完成。上述的控制器11可以是通用处理器,包括中央处理器(Central Processing Unit,CPU)、微控制单元(Microcontroller Unit,MCU)、复杂可编程逻辑器件(Complex Programmable LogicDevice,CPLD)、现场可编程门阵列(Field Programmable Gate Array,FPGA)、嵌入式ARM等芯片。
通信接口14可以有多个,节点10可以通过不同的通信接口14与其他设备进行通信。
基于图1的应用场景,现有的kafka,作为消息中间件进行消息存储,解耦各个系统,Kafka的消息吞吐量特别大,例如,在10000网络摄像机IPC(IP Camera)设备,进行解析任务等执行时,流入流出流量时常达到300M/s以上,若流入量为150M/s,相当于存储消息的磁盘的写入速度也要达到150M/s。Kafka以Topic维度(实际Topic的分区)存储数据。
同时为了防止Kafka节点故障,每Topic可能会设置2-3个副本,就是相当于每一份数据存储2-3份,这样磁盘的写入就会乘以2-3倍,达到300M/s,450M/s。同时磁盘的容量需求也会乘以2-3倍,假设本来只需要1TB的磁盘空间,就会使用2TB或者3TB。
通常采用Ceph分布式文件系统对消息进行存储,Ceph分布式文件系统包括具有很多块物理磁盘分布的主机,每台主机的磁盘数可以是3-60。若配置万兆网卡,在系统运行时网络基本不会性能瓶颈,但是如果磁盘数量较少,性能瓶颈往往是磁盘访问性能造成的,因此,此时磁盘输入输出IO使用率特别高。即使磁盘数量多,也会由于需要存储的消息数据分布太分散,分布式文件系统需要各个节点全部写入才会返回成功,导致客户端收到响应较慢。
作为一种解决方案,可以使用本地磁盘作为存储系统,但是本地磁盘很多是由多个程序共享,kafka程序保存消息导致的磁盘使用率过大会影响其他程序,或者其他程序会影响kafka程序。
另外,现有kafka分区(partition)同步数据的原理是:以分区partition有一个主分区master和两个备份分区follower为例,master负责接收发送端发送的数据并写入磁盘,并且也负责消费端的读取数据请求,相当于发送与消费客户端都只与master交互,follower只是单纯从master拉取数据,并写入磁盘,作为备份使用。
现有kafka分区的机制中,如果master所在机器发生宕机或者重启,follower可能会选举成为新的master,并且提供各种服务。这是kafka的分区容灾特性,也是follower从master同步数据的原因。
Kafka使用offset记录partition中消息的编号,每条消息写入都会有offset编号产生,是自增规则,请参照图3,图3为本发明实施例提供的消息的offset编号的示例图,图3中的分区一共有338条消息,offset编号从10001~10338,编号依次递增。
同步机制中并不是每条消息接收到就立刻同步,而是不断的轮询拉取同步,因此master的offset在未及时同步时会大于follower的offset。
Kafka为了保证消息的可靠性,发送的响应ack有3种类型(可以用3个不同的数字表示:0、1、-1),0表示发送之后,不需要收到任何响应就返回,可能出现服务端并没有收到的情况,但是发送客户端不会处理。1表示master接收到并返回给发送端接收成功响应,如果master所在的kafka节点宕机,follower没有同步,并且发生了follower变为master的情况,可能出现消息丢失可能。-1表示master和follower都接收到才返回接收成功响应,这样模式下除非所有master和follower所在的kafka节点宕机,消息才会丢失。
Kafka的消息删除策略,只是简单的根据消息存留时间设置或者大小设置进行删除。比如消息存留时间设置为12小时,超过12小时的数据会被删除。
现有kafka主要存在以下问题:
1、Kafka使用的磁盘容量,随着partition(或者说topic)的副本数增加而成倍增加。
2、Kafka使用的磁盘写入速率,随着partition(或者说topic)的副本数增加而成倍增加。
有鉴于此,本发明实施例提供一种消息同步方法、装置、节点及可读存储介质,用于解决上述问题,下面将对其进行详细描述。
在图1和图2的基础上,本发明实施例提供了一种消息同步方法,该方法应用于图1中的第一节点和图2充当第一节点时的节点10,请参照图4,图4为本发明实施例提供的一种消息同步方法的流程示例图,该方法包括以下步骤:
步骤S100,获取最近一次消费的消费消息的第一编号,其中,第一编号用于表征消费消息在主分区中的偏移位置。
在本实施例中,主分区中的消息是按序递增的,例如,第一次接收的消息的编号为1,则第二次接收的消息的编号为2,依次递增。第一编号为最近一次消费的消费消息的编号,该编号同时也表征该消费消息在主分区中的偏移位置,例如,第一编号为0,则表明该消费消息在主分区中的偏移位置为0,即为主分区中的第一条消息。
在本实施例中,消费者可以是一个也可以是多个,通常情况下,在稳定运行的业务场景中,一个topic的所有消费者都是固定不变的。当消费者为一个时,第一编号为该消费者最近一次消费的消费消息的编号,当消费者为多个时,第一编号为每一个消费者最近一次消费的消费消息的编号中的最小值,例如,消费者有3个:a、b、c,其最近一次消费的消费消息的编号分别为1、2、3,则第一编号为1、2、3中的最小值,即1。
在本实施例中,第一编号会随着消费者消费消息发生变化,第一节点进行消息同步时可以从zookeeper获取最新的第一编号。
步骤S110,获取本地预先存储的、最近一次从主分区同步的同步消息的第二编号,其中,第二编号用于表征同步消息在主分区中的偏移位置。
在本实施例中,第一节点可以实时同步主分区的消息,也可以周期性地同步主分区的消息,第二编号为第一节点最近一次从主分区同步的同步消息的编号,该编号同时也表征最近一次从主分区同步的同步消息的第二编号。
步骤S120,若第二编号与第一编号的差值小于预设值、且第一存储区域中空闲区域满足预设条件,则将主分区中最近一次写入的写入消息的第三编号与第二编号之间的消息同步至第一存储区域。
在本实施例中,备份分区包括第一存储区域和第二存储区域,第一存储区域的访问性能高于第二存储区域,作为一种具体实现方式,第一存储区域可以是内存,第二存储区域可以是磁盘,在第一存储区域中空闲空间足够的情况下,主分区的消息优先同步至备份分区的第一存储区域。
在本实施例中,预设值用于表征备份分区中第一存储区域存储的消息条数的最大值,该预设值和第一节点的内存大小及第一节点的磁盘的写入性能相关,因为,在一些场景下,需要将第一存储区域中的消息迁移至第二存储区域,如果预设值太大,消息迁移所需耗时过长,最终导致消息处理性能下降。通常情况下,可以预先对磁盘性能进行测试,通过测试结果确定预设值,例如,预设值设置为100,即第一存储区域最多存储100条消息。
在本实施例中,消息从发送到kafka到所有业务消费者处理消费成功,提交offset编号,大概就数秒左右,例如1-10秒。作为一种具体的实施方式,第一存储区域的设置方式可以是:假设该消息流入量为Q M/s,消息从kafka接收到消费大约N秒,那么每个broker第二存储区域的大小可以设置为Q x N左右。
在本实施例中,第一存储区域中空闲区域满足预设条件可以是空闲区域占总可用区域的比值大于或者等于预设比值,也可以是空闲区域的大小大于或者等于预设大小。
在本实施例中,第三编号为最近一次写入的写入消息的编号,该编号同时也表征该写入消息在主分区中的偏移位置。第三编号可以和第二编号相同,此时,主分区中的消息和备份分区中的消息相同,第三编号也可以大于第二编号,此时,主分区中存在部分消息尚未同步至备份分区中。
在本实施例中,正常情况下,生产者生产消息的速度和消费者消费消息的速度会相对稳定,即第二编号和第一编号之间的差值不会过大,只有任一消费者出现异常导致消费速度大幅度递减时,第二编号和第一编号之间的差值会逐渐增大,会出现第一存储区域不够用的风险,此时,需要将第一存储区域中的部分或者全部消息迁移至第二存储区域,以使最新同步的消息存储于第一存储区域。
为了更清楚地说明第一编号、第二编号和第三编号的含义,请参照图5,图5为本发明实施例提供的主分区和备份分区中消息的示例图,图5中,主分区一共有8条消息:消息0~消息7,其中,消息7为最近一次写入的消息,即第三编号为7,由3个消费者消费主分区中的消息,分别为:消费者a、消费者b和消费者c,三个消费者最近一次消费的消费消息分别为:消息3、消息4、消息5,对应的编号分别为3、4、5,则第一编号为三者最小值:3,备份分区中已经同步了7条消息:消息0~消息6,最近一次同步的同步消息为消息6,则第二编号为6。
需要说明的是,为了保证第二编号和第三编号的可靠性,作为一种具体实现方式,第二编号和第三编号每次处理消息都会同步到第一节点的分区元数据文件中,进行持久化存储。两者没有特别的本质区分,都是记录本地的消息中最新offset编号。当发生主分区切换时,两者也会相互转换。
本实施例提供的上述方法,通过将从主分区中的消息优先同步至第一存储区域,由于消息优先同步至访问性能高的第一存储区域,因此,可以减少数据同步响应时间,提高消息同步效率。
在本实施例中,图4是针对需要同步的消息可以存储第一存储区域中的场景,事实上,在消费者消费消息异常时,消费异常的原因可能是消费者宕机或者消费处理速度过慢,此时,第一编号会增长缓慢,或者根本不增长,第二编号和第一编号之间的差值会逐渐增大,会出现第一存储区域不够用的风险,本发明实施例针对这一场景,给出一种具体实现方式,请参照图6,图6为本发明实施例提供的另一种消息同步方法的流程示例图,该方法还包括如下步骤:
步骤S130,若第二编号与第一编号的差值大于或者等于预设值、或者第一存储区域中空闲区域不满足预设条件,则根据第二编号、第三编号及预设值确定待迁移条数。
在本实施例中,每个消费者处理了主分区中的消息后,会提交自己已经消费的offset编号(各消费者中最小的offset编号即为第一编号)到kafka,每个消费者提交的offset编号,表示自己已经处理消费到的消息位置,同时也会提交到zookeeper下面一定格式的目录,例如/offsets/topic(名称)/partition(编号)/A~Z(消费者名称),定时计算(比如1秒或者3秒)该目录下面的所有offset编号的最低值,如果最低值有更新,更新写入/offsets/topic(名称)/partition(编号)/lowest节点下面,定义为offset lowest(即第一编号)。offset lowest表示这个主分区所有消费者都已经处理到的offset的最小值,offset lowest以下的消息都是已经处理过的消息,可以删除,允许丢失的。如果最低值没有更新,可以本轮计算不更新offset lowest。
备份分区follower会监听/offsets/topic(名称)/partition(编号)/lowest节点下面的值,获取offset lowest,根据Zookeeper的特性,如果offset lowest有更新,会通知follower。follower将会实时持有offset lowest的最新值。同时由于所有消费者不断在进行消息消费,offset lowest会不断增加。
在本实施例中,作为一种具体实现方式,计算待迁移条数的过程可以是:
首先,计算第二编号和第三编号之间的编号差值。
在本实施例中,由于主分区中的消息是按序递增的,因此,编号差值可以表征第二编号和第三编号之间的消息条数。正常情况下,第二编号小于或者等于第三编号。
其次,将编号差值和预设值之间的最小值作为待迁移条数。
在本实施例中,由于第一存储区域存储的消息条数的最大值为预设值,因此,当编号差值小于或者等于预设值时,可以从第一存储区域迁移出编号差值条数的消息,再将最新待同步消息同步至第一存储区域,当编号差值大于预设值时,需要首先将第一存储区域的全部消息迁移至第二存储区域,然后将第二编号和第三编号之间最近写入的预设值条消息存储至第一存储区域,将第二编号和第三编号之间的除此之外的其他消息存储至第二存储区域。
步骤S140,将第一存储区域中最早存储的迁移条数的消息迁移至第二存储区域。
步骤S150,将第三编号开始的迁移条数的目标消息同步至第一存储区域。
在本实施例中,在本实施例中,为了使第一存储区域中存储最近同步的消息,对第一存储区域中的消息进行迁移时,优先迁移最早存储的消息,同步时,优先将最新写入的消息同步至第一存储区域,也就是编号在第二编号和第三编号之间且与第三编号最接近的消息。
步骤S160,将第三编号和第二编号之间除目标消息之外的消息同步至第二存储区域。
在本实施例中,为了更清楚地说明消息迁移的过程,请参照图7,图7为本发明实施例提供的消息迁移的示例图。以预设值为3为例,图7(a)为编号差值大于预设值时的消息迁移的示例图,图7(a)中,第三编号为7,第二编号为3,迁移时,需要将第一存储区域中的1、2、3迁移至第二存储区域,将7、6、5同步至第一存储区域,将4存储至第二存储区域。图7(b)编号差值小于预设值时的消息迁移的示例图,图7(b)中,第三编号为5,第二编号为3,需要将1、2迁移至第二存储区域,将4、5同步至第一存储区域。
本实施例提供的上述方法,在消费者消费消息异常的场景下,也能正确地进行消息同步,保证了此异常场景下消息的可靠性。由于一个消费者消费异常只影响其所在的topic或者分区,因此,本发明实施例可以实现大部分情况下磁盘容量和磁盘IO成倍减少,只有在极端情况下(比如大部分消费者都出现消费异常)时,磁盘容量的占用才会和现有技术一样。
需要说明的是,当异常消费重新恢复正常后,消息消费速度会逐步加快,第一编号增加也会加快,第二编号和第一编号之间的差值会逐渐减小,当差值小于预设值时,第二存储区域中的消息被逐渐被删除,最新同步的消息又会优先存储于第一存储区域。
在本实施例中,小于第一编号的消息是所有消费者都已经消费的消息,此处不需要在对此类消息进行存储,为了避免此类消息占用存储空间,本发明实施例还提供了一种小于第一编号的消息的处理方式,该处理方式基于图4,请参看图8,图8为本发明实施例提供的另一种消息同步方法的流程示例图,该方法还包括以下步骤:
步骤S170,将备份分区中编号小于第一编号的消息删除。
在本实施例中,如果一条消息已经被所有需要处理的消费者处理了,就表示该条消息已经没有使用价值了,可以被删除,由于第一编号为所有消费者最近一次消费消息的最小编号,因此,小于第一编号的消息肯定是被所有消费者已经处理过的了,可以删除,以及时释放这些没有使用价值的消息占据的存储空间。
在本实施例中,第一编号可以在备份分区中的第一存储区域,也可以在备份分区中的第二存储区域,若编号小于第一编号的消息在第一存储区域,则将其从第一存储区域删除,若编号小于第一编号的消息在第二存储区域,则将其从第二存储区域删除,若编号小于第一编号的消息既在第一存储区域又第二存储区域,则将各自中的编号小于第一编号的消息删除。
在本实施例中,虽然第一存储区域中的消息经常进行删除等随机读写操作,但是由于第一存储区域的性能较高,因此不会对整个系统性能造成太大影响,且正常情况下消息消费速度相当快,一旦消费后,该消息没有必要进行存储,从而避免消息存入第二存储区域导致的性能消耗和存储空间消耗。
需要说明的是,步骤S170也可以和图6配合,以在两种场景下均可以实现对应的技术效果,其具体实现方式与上述描述的方式类似,此处不再赘述。
在本实施例中,由于只有主分区对外提供服务,当主分区所属的第二节点发生异常时,为了继续对外提供服务,保持kafka节点宕机的容灾特征,保证消息数据不丢失,提高消息数据的可靠性,此时会从备份分区中选取新的主分区,以提高整个kafka集群的可靠性,因此,本发明实施例还提供了一种第二节点发生异常时的处理方式,请参照图9,图9为本发明实施例提供的另一种消息同步方法的流程示例图,该方法包括以下步骤:
步骤S200,当检测到第二节点发生异常时,判断备份分区是否满足替换条件。
在本实施例中,第二节点发生异常可以是第二节点异常掉电,或者发生软件错误导致第二节点重启,或者与外部通信异常导致第二节点状态变为离线等。
在本实施例中,替换条件用于表征备份分区在满足需求的情况下能够替代主分区。备份分区满足替换条件的场景至少包括以下三种:(1)若第二存储区域存在第二编号的消息,则判定备份分区满足替换条件;此场景下,第二存储区域存在第二编号意味着所有消息都已经存储在第二存储区域,不存在消息丢失的可能,备份分区能够替代主分区;(2)若第二存储区域不存在第二编号的消息、且第二编号等于第一编号,则判定备份分区满足替换条件;此场景下,意味着所有消息都是被消费者正常处理过的,第二节点发生异常期间没有新的消息写入,没有未被处理消息,不存在消息丢失的可能,备份分区能够替代主分区。(3)若第二存储区域不存在第二编号的消息、且第二编号大于第一编号,且容许部分消息丢失,则判定备份分区满足替换条件。此场景下,意味着表示该备份分区的第一存储区域中有未处理的消息,且未处理的消息没有写入第二存储区域。此时,可以根据kafka集群的消息可靠性ack的种类,在topic上面也设置相同种类,如果ack要求0或者1,表示允许部分消息丢失,备份分区能够替代主分区。如果ack要求-1,表示只有原来的主分区有对应数据中存在,可以选择设置,该备份分区不能够替代主分区,该备份分区不参与选举,一定要等原来的主分区恢复,且原来的主分区恢复期间,该分区处于不可用状态,不能进行消息的发送与接收。
步骤S210,若备份分区满足替换条件,则根据选举机制将备份分区作为新的主分区。
在本实施例中,若备份分区为多个,且多个备份分区均满足替换条件,可以通过选举机制,从多个备份分区中确定其中一个作为新的主分区,能够实现该选举机制的算法包括、但不限于zookeeper的Zab、Raft以及Viewstamped Replication等。
在本实施例中,一旦备份分区被选中作为新的主分区,为了在保证消息可靠性的同时,新的主分区正常对外提供服务,作为一种具体实现方式,根据选举机制将备份分区作为新的主分区的实现步骤可以是:
首先,将第一存储区域中的消息写入第二存储区域。
其次,禁止向第一存储区域写入消息。
在本实施例中,一旦备份分区变成了新的主分区,此时该备份分区需要按照主分区的方式进行消息存储,即写入的消息不再存储于第一存储区域而只存储于第二存储区域。
需要说明的是,若备份分区变成新的主分区后,原来的主分区在恢复后变成新的备份分区,该新的备份分区从新的主分区中同步数据,同步方式为:首先获取最新的第一编号,若第一编号小于或者等于此时备份分区的第二存储区域中的第二编号,则从第二存储区域中的第二编号开始,从主分区中同步消息,若第一编号大于此时备份分区的第二存储区域中的第二编号,由于小于第一编号的消息是已经消费的消息,无需同步,因此从第一编号开始,从主分区中同步消息。
还需要说明的是,若主分区所属的第二节点正常,备份分区所属的第一节点需要正常重启,则第一节点正常重启前需要备份分区的第一存储区域中的消息写入第二存储区域,防止重启后的备份分区被选举为主分区,而导致备份分区的第一存储区域中的消息丢失。另外,第一节点重启后,需要从主分区中同步数据,同步方式与上文描述的新的备份分区从新的主分区中同步数据的同步方式相同,此处不再赘述。
还需要说明的是,若kafka集群正常或者异常重启,即此时kafka集群中的所有节点均重启,此时,无论是主分区还是备份分区都可以按照步骤S200中的是否满足替换条件的方式判断主分区和备份分区是否能够作为主分区,若全部都能够作为主分区,则按照选举机制从中选择一个作为主分区,若部分能够作为主分区,则按照选举机制从能够作为主分区中选择一个作为主分区。
还需要说明的是,如果kafka集群中全部节点异常重启,ack等于-1,主分区又发生了磁盘损坏,无法恢复,数据没有备份,可能出现数据丢失。因此,对于数据要求非常严格的应用场景,可以增加配置项,配置备份分区的第一存储区域和第二存储区域可以在topic维度,即配置一部分topic使用或者不使用本发明实施例提供的第一存储区域和第二存储区域的方案,不使用该方案的topic采用现有技术,即主分区和备份分区都直接写入第二存储区域,防止磁盘损坏导致的数据丢失。
为了更清楚地从整体上描述上述实施例中的消息同步方法,本发明实施例还给出一个具体应用示例图,以Kafka集群中业务名为VMS的topic为例,该topic对应1个分区,分区partition编号为0,该分区存在一个主分区(以下称master分区)两个副本,即两个备份分区(以下称follower分区)。备份分区包括内存段存储区域(即第一存储区域)和磁盘段存储区域(即第二存储区域)该分区有3个消费者,分别是消费者A、消费者B、消费者C,都从该topic中消费数据。
如果kafka集群的流入流量为150M,消息从生产到全部消费者处理消费成功约为5-10秒左右,设置每个kafka节点follower分区的内存段存储大小为1.5G。消息写入磁盘的指标为100(即预设值为100)。
请参照图10,图10为本发明实施例提供的消息同步方法的具体应用示例图,图10(a)为本发明实施例提供的正常消费情况下消息同步的具体应用示例图,图10(a)中,follower分区不断从master分区中同步数据,master分区最新的消息(对应第三编号的消息)offset master=10338,follower分区同步到的最新消息(对应第二编号的消息)offset follower=10337。消费者A,消费者B处理到的消息offset为10335,分别在zookeeper的/offsets/VMS/0/A,/offsets/VMS/0/B,写入10335的值,消费者C处理到的消息offset为10334,在zookeeper的/offsets/VMS/0/C下写入10334的值,定时计算求出/offsets/VMS/0/下面的消费者A、B、C处理到的消息offset的最小值,为10334,写入/offsets/VMS/0/lowest下面,值为10334。就是该分区的offset lowest(对应第一编号的消息)。
follower分区监听/offsets/VMS/0/lowest节点的变化,得到offset lowest的值。由于同步到的最新消息的offset是10337,与10334的差值小于100,消息数据只在内存段存储,同时删除内存段中offset lowest以下的消息数据。比如图10(a)中的10333的消息。
请参照图10(b),图10(b)为本发明实施例提供的异常消费情况下消息同步的具体应用示例图,以消费者C异常为例,/offsets/VMS/0/C不增长或者增长缓慢,对应offsetlowest值也会不增长或者增长缓慢。消费者C的处理offset停止在20002,导致offsetlowest=20002,follower分区从master分区同步到的offset follower为20557。此时同步消息的条数大于100条,将offset为20458以下的消息刷入到磁盘中,并删除内存段中相同的数据。
需要说明的是,如果后续消费者C恢复正常,处理的offset增长快速,offsetlowest与offset follower差值又恢复到小于100,删除掉磁盘段的所有数据,又恢复只在内存段中进行处理。
还需要说明的是,如果正常重启,follower分区将内存段中的消息先写入磁盘再重启。重启之后,参与选举master的分区(以前的master分区或者follower分区),先判断自身记录的最新消息offset(以前可能是offset master,也可能是offset follower)是否在磁盘中存在,主要包括以下三种情形:(1)如果存在表示数据都已经写入磁盘的,如果被选举为master。直接成为master分区;(2)如果自身记录的最新消息offset在磁盘中不存在,但是其值等于offset lowest,表示并没有消息数据没有被处理,如果被选举为master。直接成为master分区;(3)如果以上两种情况都不满足,又被选举为master分区,表示会有消息丢失,如果ack不要求等于-1,可以变成master,如果要求等于-1,不变成master,退出选举。
为了执行上述实施例及各个可能的实施方式中的相应步骤,下面给出一种消息同步装置100的实现方式。请参照图11,图11示出了本发明实施例提供的消息同步装置100的方框示意图。需要说明的是,本实施例所提供的消息同步装置100,其基本原理及产生的技术效果和上述实施例相同,为简要描述,本实施例部分未提及指出。
消息同步装置100包括获取模块110、同步模块120及替换模块130。
获取模块110,用于获取最近一次消费的消费消息的第一编号,其中,第一编号用于表征消费消息在主分区中的偏移位置。
获取模块110,还用于获取本地预先存储的、最近一次从主分区同步的同步消息的第二编号,其中,第二编号用于表征同步消息在主分区中的偏移位置。
同步模块120,用于若第二编号与第一编号的差值小于预设值、且第一存储区域中空闲区域满足预设条件,则将主分区中最近一次写入的写入消息的第三编号与第二编号之间的消息同步至第一存储区域。
作为一种具体实施方式,同步模块120,还用于:若第二编号与第一编号的差值大于或者等于预设值、或者第一存储区域中空闲区域不满足预设条件,则根据第二编号、第三编号及预设值确定待迁移条数;将第一存储区域中最早存储的迁移条数的消息迁移至第二存储区域;将第三编号开始的迁移条数的目标消息同步至第一存储区域;将第三编号和第二编号之间除目标消息之外的消息同步至第二存储区域。
作为一种具体实施方式,同步模块120在用于根据第二编号、第三编号及预设值确定待迁移条数时具体用于:计算第二编号和第三编号之间的编号差值;将编号差值和预设值之间的最小值作为待迁移条数。
作为一种具体实施方式,同步模块120还用于:将备份分区中编号小于第一编号的消息删除。
作为一种具体实施方式,替换模块130用于:当检测到第二节点发生异常时,判断备份分区是否满足替换条件;若备份分区满足替换条件,则根据选举机制将备份分区作为新的主分区。
作为一种具体实施方式,替换模块130具体用于:若第二存储区域存在第二编号的消息,则判定备份分区满足替换条件;若第二存储区域不存在第二编号的消息、且第二编号等于第一编号,则判定备份分区满足替换条件;若第二存储区域不存在第二编号的消息、且第二编号大于第一编号,且容许部分消息丢失,则判定备份分区满足替换条件。
作为一种具体实施方式,替换模块130在具体用于根据选举机制将备份分区作为新的主分区时,具体还用于:将第一存储区域中的消息写入第二存储区域;禁止向第一存储区域写入消息。
本发明提供计算机可读存储介质,其上存储有计算机程序,该计算机程序被控制器执行时实现如上述的消息同步方法。
综上所述,本发明实施例提供了一种消息同步方法、装置、节点及可读存储介质,应用于kafka集群中的第一节点,kafka集群还包括与第一节点通信的第二节点,第二节点包括主分区,主分区中存在按序递增的消息,第一节点包括备份分区,备份分区用于存储主分区中的消息的副本,备份分区包括第一存储区域和第二存储区域,第一存储区域的访问性能大于第二存储区域,所述方法包括:获取最近一次消费的消费消息的第一编号,其中,第一编号用于表征消费消息在主分区中的偏移位置;获取本地预先存储的、最近一次从主分区同步的同步消息的第二编号,其中,第二编号用于表征同步消息在主分区中的偏移位置;若第二编号与第一编号的差值小于预设值、且第一存储区域中空闲区域满足预设条件,则将主分区中最近一次写入的写入消息的第三编号与第二编号之间的消息同步至第一存储区域。与现有技术相比,本发明实施例通过将从主分区中的消息优先同步至第一存储区域,由于消息优先同步至访问性能高的第一存储区域,因此,可以减少数据同步响应时间,能够提高消息同步效率。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
Claims (10)
1.一种消息同步方法,其特征在于,应用于kafka集群中的第一节点,所述kafka集群还包括与所述第一节点通信的第二节点,所述第二节点包括主分区,所述主分区中存在按序递增的消息,所述第一节点包括备份分区,所述备份分区用于存储所述主分区中的消息的副本,所述备份分区包括第一存储区域和第二存储区域,所述第一存储区域的访问性能大于所述第二存储区域,所述方法包括:
获取最近一次消费的消费消息的第一编号,其中,所述第一编号用于表征所述消费消息在所述主分区中的偏移位置;
获取本地预先存储的、最近一次从所述主分区同步的同步消息的第二编号,其中,所述第二编号用于表征所述同步消息在所述主分区中的偏移位置;
若所述第二编号与所述第一编号的差值小于预设值、且所述第一存储区域中空闲区域满足预设条件,则将所述主分区中最近一次写入的写入消息的第三编号与所述第二编号之间的消息同步至所述第一存储区域。
2.如权利要求1所述的消息同步方法,其特征在于,所述方法还包括:
若所述第二编号与所述第一编号的差值大于或者等于所述预设值、或者所述第一存储区域中空闲区域不满足所述预设条件,则根据所述第二编号、所述第三编号及所述预设值确定待迁移条数;
将所述第一存储区域中最早存储的所述迁移条数的消息迁移至所述第二存储区域;
将所述第三编号开始的所述迁移条数的目标消息同步至所述第一存储区域;
将所述第三编号和所述第二编号之间除所述目标消息之外的消息同步至所述第二存储区域。
3.如权利要求2所述的消息同步方法,其特征在于,所述根据所述第二编号、所述第三编号及所述预设值确定待迁移条数的步骤包括:
计算所述第二编号和所述第三编号之间的编号差值;
将所述编号差值和所述预设值之间的最小值作为所述待迁移条数。
4.如权利要求1~3中任一项所述的消息同步方法,其特征在于,所述方法还包括:
将所述备份分区中编号小于所述第一编号的消息删除。
5.如权利要求1所述的消息同步方法,其特征在于,所述方法还包括:
当检测到所述第二节点发生异常时,判断所述备份分区是否满足替换条件;
若所述备份分区满足所述替换条件,则根据选举机制将所述备份分区作为新的主分区。
6.如权利要求5所述的消息同步方法,其特征在于,所述判断所述备份分区是否满足替换条件的步骤包括:
若所述第二存储区域存在所述第二编号的消息,则判定所述备份分区满足所述替换条件;
若所述第二存储区域不存在所述第二编号的消息、且所述第二编号等于所述第一编号,则判定所述备份分区满足所述替换条件;
若所述第二存储区域不存在所述第二编号的消息、且所述第二编号大于所述第一编号,且容许部分消息丢失,则判定所述备份分区满足所述替换条件。
7.如权利要求5所述的消息同步方法,其特征在于,所述根据选举机制将所述备份分区作为新的主分区的步骤包括:
将所述第一存储区域中的消息写入所述第二存储区域;
禁止向所述第一存储区域写入消息。
8.一种消息同步装置,其特征在于,应用于kafka集群中的第一节点,所述kafka集群还包括与所述第一节点通信的第二节点,所述第二节点包括主分区,所述主分区中存在按序递增的消息,所述第一节点包括备份分区,所述备份分区用于存储所述主分区中的消息的副本,所述备份分区包括第一存储区域和第二存储区域,所述第一存储区域的访问性能大于所述第二存储区域,所述装置包括:
获取模块,用于获取最近一次消费的消费消息的第一编号,其中,所述第一编号用于表征所述消费消息在所述主分区中的偏移位置;
获取模块,还用于获取本地预先存储的、最近一次从所述主分区同步的同步消息的第二编号,其中,所述第二编号用于表征所述同步消息在所述主分区中的偏移位置;
同步模块,用于若所述第二编号与所述第一编号的差值小于预设值、且所述第一存储区域中空闲区域满足预设条件,则将所述主分区中最近一次写入的写入消息的第三编号与所述第二编号之间的消息同步至所述第一存储区域。
9.一种节点,包括存储器和控制器,其特征在于,所述控制器执行所述计算机程序时实现如权利要求1-7中任一项所述的消息同步方法。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被控制器执行时实现如权利要求1-7中任一项所述的消息同步方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111506274.4A CN114253743A (zh) | 2021-12-10 | 2021-12-10 | 消息同步方法、装置、节点及可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111506274.4A CN114253743A (zh) | 2021-12-10 | 2021-12-10 | 消息同步方法、装置、节点及可读存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114253743A true CN114253743A (zh) | 2022-03-29 |
Family
ID=80794558
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111506274.4A Pending CN114253743A (zh) | 2021-12-10 | 2021-12-10 | 消息同步方法、装置、节点及可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114253743A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115174682A (zh) * | 2022-06-17 | 2022-10-11 | 中国银联股份有限公司 | 数据分流方法、系统、中心、装置及计算机可读存储介质 |
CN115604290A (zh) * | 2022-12-13 | 2023-01-13 | 云账户技术(天津)有限公司(Cn) | Kafka消息执行方法、装置、设备及存储介质 |
CN116225344A (zh) * | 2023-05-08 | 2023-06-06 | 广州睿帆科技有限公司 | 数据写入方法、装置、系统及存储介质 |
-
2021
- 2021-12-10 CN CN202111506274.4A patent/CN114253743A/zh active Pending
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115174682A (zh) * | 2022-06-17 | 2022-10-11 | 中国银联股份有限公司 | 数据分流方法、系统、中心、装置及计算机可读存储介质 |
CN115604290A (zh) * | 2022-12-13 | 2023-01-13 | 云账户技术(天津)有限公司(Cn) | Kafka消息执行方法、装置、设备及存储介质 |
CN115604290B (zh) * | 2022-12-13 | 2023-03-24 | 云账户技术(天津)有限公司 | Kafka消息执行方法、装置、设备及存储介质 |
CN116225344A (zh) * | 2023-05-08 | 2023-06-06 | 广州睿帆科技有限公司 | 数据写入方法、装置、系统及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN114253743A (zh) | 消息同步方法、装置、节点及可读存储介质 | |
EP3620905B1 (en) | Method and device for identifying osd sub-health, and data storage system | |
EP3518110B1 (en) | Designation of a standby node | |
EP2820531B1 (en) | Interval-controlled replication | |
EP3528431B1 (en) | Paxos protocol-based methods and apparatuses for online capacity expansion of distributed consistency system | |
JP2016522514A (ja) | オンライン・ホット・スタンバイ・データベースのためのレプリケーション方法、プログラム、および装置 | |
CN107329859B (zh) | 一种数据保护方法及存储设备 | |
JP2019185371A (ja) | サーバ切り替えプログラム、サーバ切り替え方法、及びサーバ切り替えシステム | |
CN114064414A (zh) | 一种高可用的集群状态监控方法及系统 | |
CN112199240A (zh) | 一种节点故障时进行节点切换的方法及相关设备 | |
CN114385755A (zh) | 一种分布式存储系统 | |
US10169441B2 (en) | Synchronous data replication in a content management system | |
CN113779149A (zh) | 消息处理方法、装置、电子设备及可读存储介质 | |
JP5154843B2 (ja) | クラスタシステム、計算機、および障害回復方法 | |
CN114077517A (zh) | 数据处理的方法、设备及系统 | |
CN115934742A (zh) | 一种故障处理方法、装置、设备及存储介质 | |
CN114490188A (zh) | 同步主备数据库的方法及装置 | |
US20210240351A1 (en) | Remote copy system and remote copy management method | |
JP6511737B2 (ja) | 冗長システム、冗長化方法および冗長化プログラム | |
JP2007140651A (ja) | 計算機システム | |
JP6511738B2 (ja) | 冗長システム、冗長化方法および冗長化プログラム | |
CN114461141B (zh) | 一种etcd系统、节点仲裁方法及系统 | |
US11080113B1 (en) | Fifo queue replication | |
TW201828087A (zh) | 分布式儲存系統的服務節點切換方法及裝置 | |
CN117714268A (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 |