CN113779149A - 消息处理方法、装置、电子设备及可读存储介质 - Google Patents

消息处理方法、装置、电子设备及可读存储介质 Download PDF

Info

Publication number
CN113779149A
CN113779149A CN202111072091.6A CN202111072091A CN113779149A CN 113779149 A CN113779149 A CN 113779149A CN 202111072091 A CN202111072091 A CN 202111072091A CN 113779149 A CN113779149 A CN 113779149A
Authority
CN
China
Prior art keywords
message
processed
offset
consumed
processing
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
Application number
CN202111072091.6A
Other languages
English (en)
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.)
Beijing Knownsec Information Technology Co Ltd
Original Assignee
Beijing Knownsec Information Technology Co 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 Beijing Knownsec Information Technology Co Ltd filed Critical Beijing Knownsec Information Technology Co Ltd
Priority to CN202111072091.6A priority Critical patent/CN113779149A/zh
Publication of CN113779149A publication Critical patent/CN113779149A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • 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
    • 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
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/54Indexing scheme relating to G06F9/54
    • G06F2209/548Queue

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Computing Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本申请提出一种消息处理方法、装置、电子设备及可读存储介质,涉及计算机技术领域。该方法包括:从消息队列中获得第一待处理消息;根据第一待处理消息中的第一当前偏移量及第一目标偏移量,判断第一待处理消息是否是已消费消息,得到第一判断结果,第一目标偏移量为消费者上一次消费的第一待处理消息的偏移量;在是的情况下,丢弃第一待处理消息;在否的情况下,根据第一当前偏移量对第一目标偏移量进行更新,并对第一待处理消息进行处理及保存。如此,可利用偏移量确定消息是否为已消费消息,并在不是时消费该消息,从而避免重复消费,同时该方式的易操作性强。

Description

消息处理方法、装置、电子设备及可读存储介质
技术领域
本申请涉及计算机技术领域,具体而言,涉及一种消息处理方法、装置、电子设备及可读存储介质。
背景技术
消息队列这一概念的诞生是为了减少请求响应时间和解偶,而Kafka是一个高并发低延迟的分会发布订阅消息系统,具有高性能、持久化、多副本备份、横向扩展能力等优点。
Kafka的消息数据的消费状态是由消费者Consumer自己维护,这样可以除去服务端维护消费状态的压力,也能较大的提升消费者存储消费状态的自由度,甚至可以在消费失败的时候进行回滚重新消费。
然而,如果消费者因为系统宕机或重启等外在因素导致信息更新不及时,使得消费者因无法及时正确得知消息的消费状态从而导致错误的判断,进而在完成一个消息的消费闭环后再次消费该消息,也即使得某消息被重复消费。重复消费会导致各种的问题,比如,增加系统的负担。因此,如何避免消息被重复消费,已成为本领域技术人员亟需解决的技术问题。
发明内容
本申请实施例提供了一种消息处理方法、装置、电子设备及可读存储介质,其能够利用偏移量确定消息是否为已消费消息,并在不是时消费该消息,从而避免重复消费,同时该方式的易操作性强。
本申请实施例可以这样实现:
第一方面,本申请实施例提供一种消息处理方法,包括:
从消息队列中获得第一待处理消息;
根据所述第一待处理消息中的第一当前偏移量及第一目标偏移量,判断所述第一待处理消息是否是已消费消息,得到第一判断结果,其中,所述第一目标偏移量为消费者上一次消费的第一待处理消息的偏移量;
在所述第一判断结果为所述第一待处理消息是已消费消息的情况下,丢弃所述第一待处理消息;
在所述第一判断结果为所述第一待处理消息不是已消费消息的情况下,根据所述第一当前偏移量对所述第一目标偏移量进行更新,并对所述第一待处理消息进行处理及保存。
第二方面,本申请实施例提供一种消息处理装置,包括:
消息获得模块,用于从消息队列中获得第一待处理消息;
判断模块,用于根据所述第一待处理消息中的第一当前偏移量及第一目标偏移量,判断所述第一待处理消息是否是已消费消息,得到第一判断结果,其中,所述第一目标偏移量为消费者上一次消费的第一待处理消息的偏移量;
处理模块,用于在所述第一判断结果为所述第一待处理消息是已消费消息的情况下,丢弃所述第一待处理消息;
所述处理模块,还用于在所述第一判断结果为所述第一待处理消息不是已消费消息的情况下,根据所述第一当前偏移量对所述第一目标偏移量进行更新,并对所述第一待处理消息进行处理及保存。
第三方面,本申请实施例提供一种电子设备,包括处理器和存储器,所述存储器存储有能够被所述处理器执行的机器可执行指令,所述处理器可执行所述机器可执行指令以实现前述实施方式所述的消息处理方法。
第四方面,本申请实施例提供一种可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如前述实施方式所述的消息处理方法。
本申请实施例提供的消息处理方法、装置、电子设备及可读存储介质,根据消息队列中获得的第一待处理消息中的第一当前偏移量及存储的第一目标偏移量,判断该第一待处理消息是否是已消费消息,在是时,丢弃该第一待处理消息,在不是时,根据该第一当前偏移量对该第一目标偏移量进行更新,并对该第一待处理消息进行处理及保存。其中,第一目标偏移量为消费者上一次消费的第一待处理消息的偏移量。如此,可利用第一待处理消息中的偏移量以及保存的上一次消费的第一待处理消息的偏移量,确定该第一待处理消息是否已被消费,进而在未被消费的情况下对该消息进行消费,由此可避免对消息进行重复消费,同时该方式的易操作性强。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为一种现有的解决重复消费的方式示意图;
图2为本申请实施例提供的电子设备的方框示意图;
图3为本申请实施例提供的消息处理方法的流程示意图之一;
图4为图3中步骤S120包括的子步骤的流程示意图;
图5为图3中步骤S140包括的子步骤的流程示意图;
图6为图5中子步骤S141包括的子步骤的流程示意图;
图7为本申请实施例提供的消息处理方法的流程示意图之二;
图8为本申请实施例提供的消息处理装置的方框示意图。
图标:100-电子设备;110-存储器;120-处理器;130-通信单元;200-消息处理装置;210-消息获得模块;220-判断模块;230-处理模块。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。
因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
需要说明的是,术语“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
为了解决消息被重复消费这一技术问题,目前部分开发者根据具体的重复消费问题指定了一些解决方案,通过这些解决方案来尽最大的努力保证消息的有效消费。当前只要使用的是以下两种方案。
方案一:为消息增加键值解决重复消费。该方案具体为:消费者Consumer从Kafka消息队列中读取消息;消费者在读取一条消息时,就会该条消息添加一个唯一的键,这样就使得每一条消息都变成了一个唯一的键值对,其中,键值对中的值为该消息;在消费消息之前,消费者先查询该消息的键是否在所保存的已消费的消息的键中,从而判断该消息是否已被消费过;若在所保存的已消费的消息的键中查询到该消息的键,则表示该消息已经被消费过,直接将该消息从消息队列中剔除;若在所保存的已消费的消息的键中没有查询到该消息的键,则正常消费该消息,然后将该消息的唯一键记录下来。
方案二:如图1所示,利用幂等性解决重复消费。其中,幂等(Idempotence)在数学上的定义是如果一个函数f(x)满足:f(f(x))=f(x),则函数f(x)满足幂等性。一个幂等操作的特点是,其任意多次执行所产生的影响均与一次执行的影响相同。方案二具体为:步骤1.消费者从Kafka消息队列里面读取消息;步骤2.将消费的消息存入数据库中,并且按照记录的关联性,建立一个中转表,表中将这些相关联的主键(比如,主键1、主键2…主键N)拼接成这条信息的唯一主键(即联合主键),与真正需要消费的消息组成一条记录并保存在中转表中;步骤3.当消息再次从消息队列中传入时,先去中转表中查看是否已经有记录,如果已经含有记录则直接进行数据更新,否则又回到步骤2。
然而,上述方案实际执行上都比较复杂。
比如,方案一所使用的设置键值对技术,该方案的复杂性和局限性使得该方案不便于使用。其中,复杂性是指,Kafka处理的是海量集的数据,如果是在一开始就给要消费的每一条消息进行唯一键的添加,那么添加唯一键将会带来巨大的工作量,降低工作效率。局限性是指,在数据处理之前添加唯一键,是需要根据业务逻辑入手的,如果业务逻辑过于复杂,那么此方法也将无法实施。
再比如,方案二使用的利用幂等性技术,该方案的局限性和业务限定性也使得该方案不便于使用。其中,此处的局限性是指,幂等生产者无法实现多分区和跨会话上的幂等性,若要实现多分区上的原子性,需要引入事务,并且即使同一个生产者宕机并重启也无法保证消息有且仅被处理一次,即消息的Exactly Once语义。业务限制性是指,需要设计者从业务逻辑入手,但是并不是所有的业务都能设计成为天然幂等的,时常需要一些其他的方法或者技巧来协助完成幂等性,使得实现过程较为繁琐,且易出现逻辑缺陷,导致后期维护成本过高。
针对以上方案所存在的缺陷,均是发明人在经过实践并仔细研究后得到的结果,因此,上述问题的发现过程以及下文中本申请实施例针对上述问题所提出的解决方案,都应是发明人在本申请过程中对本申请做出的贡献。
基于上述情况,本申请实施例提供了一种消息处理方法、装置、电子设备及可读存储介质,能够利用偏移量确定消息是否为已消费消息,并在不是时消费该消息,从而避免重复消费,同时该方式的易操作性强。
下面结合附图,对本申请的一些实施方式作详细说明。在不冲突的情况下,下述的实施例及实施例中的特征可以相互组合。
请参照图2,图2为本申请实施例提供的电子设备100的方框示意图。所述电子设备100可以是,但不限于,电脑、服务器等。其中,所述服务器可以是单独的服务器,也可以是集群的服务器。该电子设备100中可以包括Kafka系统。
Kafka是一种高吞吐、低延迟的分布式发布订阅消息系统。Kafka存储的消息来自多个被称为“生产者”(Producer)的进程。消息可以被分配到不同的“Broker”(实例)下的不同的“Topic”下的不同的“分区”(Partition)中。在一个分区内,这些消息被索引并连同时间戳存储在一起。其它被称为“消费者”(Consumer)的进程可以从分区查询消息。Kafka运行在一个由一台或多台服务器组成的集群上,并且分区可以跨集群结点分布。
其中,Broker是Kafka集群中的服务器,Kafka集群中拥有一台或多台服务器,该服务器称为Broker。每个Kafka集群内的Broker都有一个不重复的编号。Topic表示消息的主题,可以理解为消息的分类,Kafka的数据(即消息)就保存在Topic。在每个Broker上都可以创建多个Topic,每个进入到Kafka的消息都会被放到一个Topic下。Partition表示Topic的分区,每个Topic可以有多个Partition,分区的作用是做负载,提高Kafka的吞吐量,提高消息的处理效率;同一个Topic在不同的分区的数据是不重复的,Partition的表现形式就是一个一个的文件夹。
所述电子设备100包括存储器110、处理器120及通信单元130。所述存储器110、处理器120以及通信单元130各元件相互之间直接或间接地电性连接,以实现数据的传输或交互。例如,这些元件相互之间可通过一条或多条通讯总线或信号线实现电性连接。
其中,存储器110用于存储程序或者数据。所述存储器110可以是,但不限于,随机存取存储器(Random Access Memory,RAM),只读存储器(Read Only Memory,ROM),可编程只读存储器(Programmable Read-Only Memory,PROM),可擦除只读存储器(ErasableProgrammable Read-Only Memory,EPROM),电可擦除只读存储器(Electric ErasableProgrammable Read-Only Memory,EEPROM)等。
处理器120用于读/写存储器110中存储的数据或程序,并执行相应地功能。比如,存储器110中存储有消息处理装置200,所述消息处理装置200包括至少一个可以软件或固件(firmware)的形式存储于所述存储器110中的软件功能模块。所述处理器120通过运行存储在存储器110内的软件程序以及模块,如本申请实施例中的消息处理装置200,从而执行各种功能应用以及数据处理,即实现本申请实施例中的消息处理方法。
通信单元130用于通过网络建立所述电子设备100与其它通信终端之间的通信连接,并用于通过所述网络收发数据。
应当理解的是,图2所示的结构仅为电子设备100的结构示意图,所述电子设备100还可包括比图2中所示更多或者更少的组件,或者具有与图2所示不同的配置。图2中所示的各组件可以采用硬件、软件或其组合实现。
请参照图3,图3为本申请实施例提供的消息处理方法的流程示意图之一。所述方法可应用于上述电子设备100。下面对消息处理方法的具体流程进行详细阐述。该方法可以包括步骤S110~步骤S140。
步骤S110,从消息队列中获得第一待处理消息。
在本实施例中,从Kafka中来的消息不断地被放入到消息队列中,也即该消息队列中的消息均是生产者Producer产生的消息。消费者可从消费队列中获取一条消息,作为所述第一待处理消息。消息在消息队列中的位置可采用偏移量offset表示,该偏移量由生产者确定,比如,生产者依次写入了消息1、2、3,则消息1、2、3各自的偏移量可以依次为0、1、2。每条消息中可以携带有该消息的偏移量。
步骤S120,根据所述第一待处理消息中的第一当前偏移量及第一目标偏移量,判断所述第一待处理消息是否是已消费消息,得到第一判断结果。
在获得所述第一待处理消息的情况下,可获得该第一待处理消息中的偏移量作为该第一待处理消息的第一当前偏移量。然后根据该第一当前偏移量及保存的第一目标偏移量,判断该第一待处理消息是否是已消费消息,并得到第一判断结果。其中,所述第一目标偏移量为消费者上一次消费的第一待处理消息的偏移量,可用于表示消费者在所述消息队列中已消费到的位置。其中,基于第一当前偏移量及第一目标偏移量进行判断的判断方式具体可以结合被依次消费的消息的偏移量的变化方式确定。
步骤S130,在所述第一判断结果为所述第一待处理消息是已消费消息的情况下,丢弃所述第一待处理消息。
所述第一判断结果为所述第一待处理消息是已消费消息,表示该第一待处理消息之前已经被消费过,若本次对该第一待处理消息进行消费,则会导致该第一待处理消息被重复消费。为避免该第一待处理消息被重复消费,消费者可将该第一待处理消息丢弃。
步骤S140,在所述第一判断结果为所述第一待处理消息不是已消费消息的情况下,根据所述第一当前偏移量对所述第一目标偏移量进行更新,并对所述第一待处理消息进行处理及保存。
所述第一判断结果为所述第一待处理消息不是已消费消息,表示当前判定该第一待处理消息是没有被消费过的,也即本次进行的消费是第一次消费,是正常消费。因此,在第一判断结果为所述第一待处理消息不是已消费消息时,可对该第一待处理消息进行处理及保存,以完成对该第一待处理消息的消费。并且,还根据该第一当前偏移量对所述第一目标偏移量进行更新,以便对从消息队列中获取的下一条消息进行上述判断。其中,具体更新方式可以为将第一当前偏移量赋值给第一目标偏移量,也即,在更新之后,所述第一目标偏移量与第一当前偏移量两个值相同。
如此,可利用第一待处理消息中的偏移量以及保存的上一次消费的第一待处理消息的偏移量,确定该第一待处理消息是否已被消费,进而在未被消费的情况下对该消息进行消费,由此可避免对消息进行重复消费,同时该方式的易操作性强。
可选地,作为一种可能的实施方式,依次被消费的消息的偏移量依次增大。比如,开始被消费的消息的偏移量为1,接着被消费的消息的偏移量为2,再接着被消费的消息的偏移量为3。在此情况下,可通过图4所示方式获得第一判断结果。请参照图4,图4为图3中步骤S120包括的子步骤的流程示意图。在本实施方式中,步骤S120可以包括子步骤S121~子步骤S123。
子步骤S121,将所述第一当前偏移量与所述第一目标偏移量进行比较。
子步骤S122,在所述第一当前偏移量不大于所述第一目标偏移量的情况下,确定所述第一待处理消息是已消费消息。
子步骤S123,在所述第一当前偏移量大于所述第一目标偏移量的情况下,确定所述第一待处理消息不是已消费消息。
在本实施方式中,可将所述第一当前偏移量与所述第一目标偏移量进行比较,以判断所述第一当前偏移量是否大于所述第一目标偏移量。若所述第一当前偏移量小于等于所述第一目标偏移量,则表示消费者原本消费到的位置比当前的第一待处理消息的位置还要大或者相同,目前的第一待处理消息是之前已经消费过的消息,在该情况下得到的第一判断结果为所述第一待处理消息是已消费消息。
若所述第一当前偏移量大于所述第一目标偏移量,则表示消费者原本消费到的位置比当前的第一待处理消息的位置小,本次是正常消费,因此在该情况下得到的第一判断结果为所述第一待处理消息不是已消费消息。
其中,可以理解的是,在Kafka首次运行的情况下,可对第一条消息不进行如上基于第一当前偏移量的判断,直接确定第一条消息不是已消费消息,然后进行相应的消费。在已经消费过消息的情况下,消费者在每获得一条消息之后,可执行上述判断,以判断是否消费获得的消息。
在所述第一判断结果为所述第一待处理消息是已消费消息的情况下,可丢弃该第一待处理消息。消息消费是在不间断的进行着的,因此,在丢弃该第一待处理消息之后,消费者可再次从所述消息队列中获得一条消息,作为新的第一待处理消息,也即在丢弃该第一待处理消息之后重新从步骤S110开始执行。
其中,可选地,在丢弃该第一待处理消息的情况下,为避免消费者再次获得已消费消息,可根据所述第一目标偏移量确定一指定偏移量,然后从消息队列中获得该指定偏移量所表示的位置处的消息,作为新的第一待处理消息。其中,所述指定偏移量可以为所述第一目标偏移量加1的结果。
在所述第一判断结果为所述第一待处理消息不是已消费消息的情况下,可基于该第一当前偏移量对所述第一目标偏移量进行更新,以便保证该第一目标偏移量与实际情况对应,避免由于第一目标偏移量不准确,导致出现重复消费的情况。
在所述第一判断结果为所述第一待处理消息不是已消费消息的情况下,还可以对所述第一待处理消息进行处理及保存,以完成对所述第一待处理消息的消费。可选地,具体的处理过程可由实际需求确定。
可选地,消费者可以对所述第一待处理消息进行处理,并将处理后的第一待处理消息保存到数据库中。可利用同步方式,对该第一待处理消息进行处理以及入库,如此可减小出现重复消费消息的概率。
可选地,在一种可能的实施方式中,可通过图5所示方式对所述第一待处理消息进行处理及保存。请参照图5,图5为图3中步骤S140包括的子步骤的流程示意图。在本实施方式中,步骤S140可以包括子步骤S141~子步骤S145。
子步骤S141,对所述第一待处理消息进行预设处理,并将处理后的消息保存在第一缓冲区中。
在本实施方式中,可将所述第一待处理消息保存到所述第一缓冲区中,然后在所述第一缓冲区中对所述第一待处理消息进行预设处理,并将处理之后的第一待处理消息保存在该第一缓冲区中。其中,该预设处理具体处理操作具体可以由实际情况确定,在此不做具体限定。
其中,若将处理之后的第一待处理消息被保存在第一缓冲区,那么在步骤S120的判断第一待处理消息是否为已消费消息,可以理解为判断第一待处理消息之前已经被从Kafka消息队列中读取并存入第一缓冲区。
子步骤S142,从所述第一缓冲区中获得第二待处理消息。
所述第一缓冲区中包括进行了预设处理的第一待处理消息,可从该第一缓冲区中获取一条进行了预设处理的第一待处理消息,作为第二待处理消息。其中,将消息保存到第一缓冲区与从第一缓冲区中获得第二待处理消息,可以是同步的,也可以异步,具体可根据实际需求确定。
其中,若为异步,则表示比如一个程序不断地从消息队列中获得第一待处理消息,并将该第一待处理消息带到第一缓冲区;另一个程序则不断地从第一缓冲区中获得第二待处理消息,并将其带到第二缓冲区中。
可选地,在一种可能的实现方式中,将消息保存到第一缓冲区与从第一缓冲区中获得第二待处理消息是异步的,以便通过异步提高处理效率。
子步骤S143,根据所述第二待处理消息中的第二当前偏移量及第二目标偏移量,判断所述第二待处理消息是否是已消费消息,得到第二判断结果。
在本实施方式中,所述第二待处理消息中携带的偏移量,为该第二待处理消息的第二当前偏移量。所述第二目标偏移量为第二缓冲区上一次存入的消息的偏移量。可根据所述第二当前偏移量及第二目标偏移量,判断该第二待处理消息是否已存入第二缓冲区。也即,根据第二缓冲区上一次存入的消息的位置以及该第二待处理消息的位置,判断之前是否已经将该第二待处理消息放入过第二缓冲区。通过该判断可以避免重复入库的情况。其中,基于第二当前偏移量进行判断的具体判断方式可以结合被依次消费的消息的偏移量的变化方式确定。
可选地,依次被消费的消息的偏移量为依次增大的状态,在此情况下,可通过图6所示方式获得所述第二判断结果。请参照图6,图6为图5中子步骤S143包括的子步骤的流程示意图。子步骤S143可以包括子步骤S1431~子步骤S1433。
子步骤S1431,将所述第二当前偏移量与所述第二目标偏移量进行比较。
子步骤S1432,在所述第二当前偏移量不大于所述第二目标偏移量的情况下,确定所述第二待处理消息是已消费消息。
子步骤S1433,在所述第二当前偏移量大于所述第二目标偏移量的情况下,确定所述第二待处理消息不是已消费消息。
在本实施方式中,可将所述第二当前偏移量与所述第二目标偏移量进行比价,以判断所述第二当前偏移量是否大于所述第二目标偏移量。也即判断以下公式是否成立:meg.offset>lastoffset,其中,meg.offset表示第二当前偏移量,lastoffset表示第二目标偏移量。
若所述第二当前偏移量小于等于所述第二目标偏移量,则表示原本保存到第二缓冲区的消息的最大位置比当前的第二待处理消息的位置还要大或者相同,该第二待处理消息已经被消费过了,即已经被从第一缓冲区读取并存入第二缓冲区,因此在此情况下得到的第二判断结果为所述第二待处理消息是已消费消息。
若所述第二当前偏移量大于所述第二目标目标偏移量,则表示原本保存第二缓冲区的消息的最大位置比当前的第二待处理消息的位置小,本次是正常消费,因此在该情况下得到的第二判断结果为所述第二待处理消息不是已消费消息。
其中,可以理解的是,在Kafka首次运行的情况下,可对第一条消息不进行如上基于第二当前偏移量的判断,直接确定第一条消息不是已消费消息,然后进行相应的消费。在已经消费过消息的情况下,在每获得一条消息之后,可执行上述基于第二当前偏移量的判断,以判断是否将消息保存到第二缓冲区中。
子步骤S144,在所述第二判断结果为所述第二待处理消息是已消费消息的情况下,丢弃所述第二待处理消息。
若第二判断结果为所述第二待处理消息是已消费消息,仍然将该第二待处理消息保存到第二缓冲区,则会导致出现重复消费。因此,在第二判断结果为所述第二待处理消息是已消费消息时,可直接丢弃该第二待处理消息。消息消费是在不间断的进行着的,因此,在丢弃该第二待处理消息之后,在异步进行将消息队列中的消息存入第一缓冲区、将第一缓冲区的消息存入第二缓冲区的情况下,消费者可针对新的第二待处理消息进行上述基于第二当前偏移量的判断。
子步骤S145,在所述第二判断结果为所述第二待处理消息不是已消费消息的情况下,根据所述第二当前偏移量对所述第二目标偏移量进行更新,并将所述第二待处理消息存入所述第二缓冲区,以及将存入所述第二缓冲区的该第二待处理消息保存到数据库中。
可选地,在所述第二判断结果为所述第二待处理消息不是已消费消息的情况下,可基于该第二当前偏移量对所述第二目标偏移量进行更新,以保证该第二目标偏移量与实际保存到第二缓冲区中的消息位置对应,避免由于第二目标偏移量不准确,导致出现重复消费的情况。
在所述第二判断结果为所述第二待处理消息不是已消费消息的情况下,还可以将所述第二待处理消息保存到第二缓冲区中。消息消费是在不间断的进行着的,因此,在将该第二待处理消息保存到第二缓冲区后,在异步进行将消息队列中的消息存入第一缓冲区、将第一缓冲区的消息存入第二缓冲区的情况下,消费者可针对新的第二待处理消息进行上述基于第二当前偏移量的判断。在将该第二待处理消息保存到第二缓冲区之后,还可以将存入该第二缓冲区中的该第二待处理消息保存到数据库中。
可选地,作为一种可选的方式,可以在将所述第二待处理消息保存到第二缓冲区之后,就直接对该第二待处理消息进行数据处理,得到该第二待处理消息的处理结果,并将处理结果写入到数据库中。其中,所述数据处理的具体策略可以根据实际需求确定。如此,可利用同步方式完成过对一条第二待处理消息的处理及入库。
在该方式中,还可以同时将该处理结果的偏移量保存为第三目标偏移量。其中,在初始化时,所述第二目标偏移量的初始值为所述第三目标偏移量。
可选地,作为另一种可选的方式,可以在将所述第二待处理消息保存到第二缓冲区之后,就在第二缓冲区中直接对该第二待处理消息进行数据处理,得到该第二待处理消息的处理结果。之后,判断目前得到的但未存入所述数据库的处理结果是否满足入库条件。其中,可以结合实际需求设置入库条件。比如,入库条件中包括一个预设数据量。若目前得到的但未存入所述数据库的处理结果的数据量大于等于所述预设数据量,则可以确定目前的处理结果满足入库条件;反之,目前得到的但未存入所述数据库的处理结果的数据量小于所述预设数据量,则可以确定目前的处理结果不满足入库条件。可以理解的是,入库条件中还可以设置有其他规则,具体可以结合情况设置。
在不满足入库条件的情况下,则继续等待,直到得到的未存入数据库的处理结果满足入库条件。
在满足入库条件的情况下,则可以将目前得到的未存入数据库的处理结果,批量地存入所述数据库中。如此采用异步批量写入的方式,可以减少与数据库所在的硬盘的交互次数,提高存储效率。
在批量写入的情况下,还可以将本次批量写入的所述数据库的处理结果中的最大偏移量保存为第三目标偏移量。其中,在初始化时,所述第二目标偏移量的初始值为所述第三目标偏移量。比如,在Kafka系统重启的情况下,可以基于第三目标偏移量对所述第二目标偏移量进行初始化。
请参照图7,图7为本申请实施例提供的消息处理方法的流程示意图之二。在步骤S140之后,所述方法还可以包括步骤S150和步骤S160-步骤S170两个步骤中的至少一步骤。
步骤S150,将至少一个处理节点的节点信息保存到日志文档中。
处理节点表示处理阶段。在本实施例中,在上述步骤S110~步骤S140中,可以获得不同阶段的相关信息,并将该相关信息作为该处理阶段的节点信息,然后该节点信息保存到日志文档中。其中,该日志文档可以位于硬盘中。可选地,为保证所述日志文档与真实情况一致,可以在相关信息发生变化时,就对所述日志文档进行对应更新。
每个处理节点的节点信息的具体内容可以根据实际需求确定,只要后续可以根据该日志文档进行故障恢复和/或异常检查即可。可选地,所述至少一个处理节点的节点信息包括所述第一目标偏移量、第二目标偏移量及第三目标偏移量中的至少一个。
在一种可能的实现方式中,所述至少一个处理节点包括:从消息队列读取消息存入第一缓冲区、从第一缓冲区读取消息存入第二缓冲区、将处理结果存入数据库等,对应地,所述至少一个处理节点的节点信息包括所述第一目标偏移量、第二目标偏移量及第三目标偏移量等。
步骤S160,在出现故障的情况下,根据所述日志文档进行故障恢复处理。
可选地,在出现系统故障时,比如出现程序被杀死、运行时错误、重启、已消费的偏移量未提交、处理结果未入库、处理结果入库中断等情况,可根据该日志文档找到发生故障前的数据,然后基于该数据进行故障恢复处理。如此,可利用该日志文档尽可能地保持整个消费过程的数据完整性。
步骤S170,周期性地根据所述日志文档进行检查,并在检查出异常时对该异常进行处理。
在本实施例,还可以定期根据所述日志文档检测某一些关键点的功能是否正确实时,从而及早发现异常,并处理该异常。
比如,可定时获取Topic中各Partition的偏移量,与消费者自身保存的第一目标偏移量进行比较,如果发现Partition中消息的偏移量大于消费者记录的第一目标偏移量,则属于正常消费;反之则表示当前这个Partition的偏移量所对应的消息已经被消费过了,直接丢弃这个消息即可。或者是定时检测本地保存的数据文件是否为空,不为空则将其导入对应数据库及数据表中。其中,在发生故障时,未存入所述数据库中的处理结果可存入本地作为上述数据文件。
可选地,为了保证高效的信息消费和有效的数据存储,还可以定期销毁过期的日志,从而减小存储压力。
在本实施例中,消费者每次消费完数据后,可以对消息的位置进行检测。如果消费者订阅的topic数量发生改变、或者订阅Topic的分区数发生改变、或者消费者个数发生改变,则会触发rebalance的现象。rebalance时候,Kafka会根据消费者数量、Topic数量、Partition数量三者的变化重新分配消费任务,等到完成此次rebalance后,可以根据所述日志文档中记载的每个Topic下的各Partition的消费位置(即第一目标偏移量),重新设置消息的位置开始消费。
本申请实施例通过仔细分析Kafka信息消费的过程,针对每种可能出现出现的消息重复消费的情况提供了详细的解决方案设置,可尽最大可能地解决消息重复消费与数据异常的问题。并且,本申请实施例是基于传统的消费处理模式,符合大部分的设计逻辑,可操作性强,可降低实施难度,可适应更多业务环境,增强用户体验。同时,通过循环的对关键点数据处理的检测能够让开发者及时发现问题,并且本申请实施例中的日志文档中包括了至少一个处理节点的节点信息,可保障数据的安全。并且通过定期删除过期日志文件,保障了资源利用最大化。
为了执行上述实施例及各个可能的方式中的相应步骤,下面给出一种消息处理装置200的实现方式,可选地,该消息处理装置200可以采用上述图2所示的电子设备100的器件结构。进一步地,请参照图8,图8为本申请实施例提供的消息处理装置200的方框示意图。需要说明的是,本实施例所提供的消息处理装置200,其基本原理及产生的技术效果和上述实施例相同,为简要描述,本实施例部分未提及之处,可参考上述的实施例中相应内容。所述消息处理装置200可以包括:消息获得模块210、判断模块220及处理模块230。
所述消息获得模块210,用于从消息队列中获得第一待处理消息。
所述判断模块220,用于根据所述第一待处理消息中的第一当前偏移量及第一目标偏移量,判断所述第一待处理消息是否是已消费消息,得到第一判断结果,其中,所述第一目标偏移量为消费者上一次消费的第一待处理消息的偏移量。
所述处理模块230,用于在所述第一判断结果为所述第一待处理消息是已消费消息的情况下,丢弃所述第一待处理消息。
所述处理模块230,还用于在所述第一判断结果为所述第一待处理消息不是已消费消息的情况下,根据所述第一当前偏移量对所述第一目标偏移量进行更新,并对所述第一待处理消息进行处理及保存。
可选地,在本实施例中,依次被消费的消息的偏移量依次增大,所述判断模块220具体用于:将所述第一当前偏移量与所述第一目标偏移量进行比较;在所述第一当前偏移量不大于所述第一目标偏移量的情况下,确定所述第一待处理消息是已消费消息;在所述第一当前偏移量大于所述第一目标偏移量的情况下,确定所述第一待处理消息不是已消费消息。
可选地,在本实施例中,所述处理模块230具体用于:对所述第一待处理消息进行预设处理,并将处理后的消息保存在第一缓冲区中;从所述第一缓冲区中获得第二待处理消息;根据所述第二待处理消息中的第二当前偏移量及第二目标偏移量,判断所述第二待处理消息是否是已消费消息,得到第二判断结果,其中,所述第二目标偏移量为第二缓冲区上一次存入的消息的偏移量;在所述第二判断结果为所述第二待处理消息是已消费消息的情况下,丢弃所述第二待处理消息;在所述第二判断结果为所述第二待处理消息不是已消费消息的情况下,根据所述第二当前偏移量对所述第二目标偏移量进行更新,并将所述第二待处理消息存入所述第二缓冲区,以及将存入所述第二缓冲区的该第二待处理消息保存到数据库中。
可选地,在本实施例中,依次被消费的消息的偏移量依次增大,所述处理模块230具体用于:将所述第二当前偏移量与所述第二目标偏移量进行比较;在所述第二当前偏移量不大于所述第二目标偏移量的情况下,确定所述第二待处理消息是已消费消息;在所述第二当前偏移量大于所述第二目标偏移量的情况下,确定所述第二待处理消息不是已消费消息。
可选地,在本实施例中,所述处理模块230具体用于:对所述第二待处理消息进行数据处理,得到处理结果;以批量方式将得到的处理结果存入所述数据库。
可选地,在本实施例中,在以批量方式将得到的处理结果存入所述数据库之后,所述处理模块230还用于:将本次批量存入所述数据库的处理结果中的最大偏移量保存为第三目标偏移量。其中,在初始化时,所述第二目标偏移量的初始值为所述第三目标偏移量。
可选地,在本实施例中,所述处理模块230还用于:将至少一个处理节点的节点信息保存到日志文档中,其中,所述至少一个处理节点的节点信息包括所述第一目标偏移量、第二目标偏移量及第三目标偏移量中的至少一个;在出现故障的情况下,根据所述日志文档进行故障恢复处理;和/或,周期性地根据所述日志文档进行检查,并在检查出异常时对该异常进行处理。
可选地,上述模块可以软件或固件(Firmware)的形式存储于图2所示的存储器110中或固化于电子设备100的操作系统(Operating System,OS)中,并可由图1中的处理器120执行。同时,执行上述模块所需的数据、程序的代码等可以存储在存储器110中。
本申请实施例还提供一种可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现所述的消息处理方法。
综上所述,本申请实施例提供一种消息处理方法、装置、电子设备及可读存储介质,根据消息队列中获得的第一待处理消息中的第一当前偏移量及存储的第一目标偏移量,判断该第一待处理消息是否是已消费消息,在是时,丢弃该第一待处理消息,在不是时,根据该第一当前偏移量对该第一目标偏移量进行更新,并对该第一待处理消息进行处理及保存。其中,第一目标偏移量为消费者上一次消费的第一待处理消息的偏移量。如此,可利用第一待处理消息中的偏移量以及保存的上一次消费的第一待处理消息的偏移量,确定该第一待处理消息是否已被消费,进而在未被消费的情况下对该消息进行消费,由此可避免对消息进行重复消费,同时该方式的易操作性强。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本申请的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
另外,在本申请各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅为本申请的可选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

Claims (10)

1.一种消息处理方法,其特征在于,包括:
从消息队列中获得第一待处理消息;
根据所述第一待处理消息中的第一当前偏移量及第一目标偏移量,判断所述第一待处理消息是否是已消费消息,得到第一判断结果,其中,所述第一目标偏移量为消费者上一次消费的第一待处理消息的偏移量;
在所述第一判断结果为所述第一待处理消息是已消费消息的情况下,丢弃所述第一待处理消息;
在所述第一判断结果为所述第一待处理消息不是已消费消息的情况下,根据所述第一当前偏移量对所述第一目标偏移量进行更新,并对所述第一待处理消息进行处理及保存。
2.根据权利要求1所述的方法,其特征在于,依次被消费的消息的偏移量依次增大,所述根据所述第一待处理消息中的第一当前偏移量及第一目标偏移量,判断所述第一待处理消息是否是已消费消息,得到第一判断结果,包括:
将所述第一当前偏移量与所述第一目标偏移量进行比较;
在所述第一当前偏移量不大于所述第一目标偏移量的情况下,确定所述第一待处理消息是已消费消息;
在所述第一当前偏移量大于所述第一目标偏移量的情况下,确定所述第一待处理消息不是已消费消息。
3.根据权利要求1所述的方法,其特征在于,所述对所述第一待处理消息进行处理,包括:
对所述第一待处理消息进行预设处理,并将处理后的消息保存在第一缓冲区中;
从所述第一缓冲区中获得第二待处理消息;
根据所述第二待处理消息中的第二当前偏移量及第二目标偏移量,判断所述第二待处理消息是否是已消费消息,得到第二判断结果,其中,所述第二目标偏移量为第二缓冲区上一次存入的消息的偏移量;
在所述第二判断结果为所述第二待处理消息是已消费消息的情况下,丢弃所述第一待处理消息;
在所述第二判断结果为所述第二待处理消息不是已消费消息的情况下,根据所述第二当前偏移量对所述第二目标偏移量进行更新,并将所述第二待处理消息存入所述第二缓冲区,以及将存入所述第二缓冲区的该第二待处理消息保存到数据库中。
4.根据权利要求3所述的方法,其特征在于,依次被消费的消息的偏移量依次增大,所述根据所述第二待处理消息中的第二当前偏移量及第二目标偏移量,判断所述第二待处理消息是否是已消费消息,得到第二判断结果,包括:
将所述第二当前偏移量与所述第二目标偏移量进行比较;
在所述第二当前偏移量不大于所述第二目标偏移量的情况下,确定所述第二待处理消息是已消费消息;
在所述第二当前偏移量大于所述第二目标偏移量的情况下,确定所述第二待处理消息不是已消费消息。
5.根据权利要求3所述的方法,其特征在于,所述将存入所述第二缓冲区的该第二待处理消息保存到所述数据库中,包括:
对所述第二待处理消息进行数据处理,得到处理结果;
以批量方式将得到的处理结果存入所述数据库。
6.根据权利要求5所述的方法,其特征在于,在以批量方式将得到的处理结果存入所述数据库之后,所述方法还包括:
将本次批量存入所述数据库的处理结果中的最大偏移量保存为第三目标偏移量,其中,在初始化时,所述第二目标偏移量的初始值为所述第三目标偏移量。
7.根据权利要求6所述的方法,其特征在于,所述方法还包括:
将至少一个处理节点的节点信息保存到日志文档中,其中,所述至少一个处理节点的节点信息包括所述第一目标偏移量、第二目标偏移量及第三目标偏移量中的至少一个;
在出现故障的情况下,根据所述日志文档进行故障恢复处理;和/或,周期性地根据所述日志文档进行检查,并在检查出异常时对该异常进行处理。
8.一种消息处理装置,其特征在于,包括:
消息获得模块,用于从消息队列中获得第一待处理消息;
判断模块,用于根据所述第一待处理消息中的第一当前偏移量及第一目标偏移量,判断所述第一待处理消息是否是已消费消息,得到第一判断结果,其中,所述第一目标偏移量为消费者上一次消费的第一待处理消息的偏移量;
处理模块,用于在所述第一判断结果为所述第一待处理消息是已消费消息的情况下,丢弃所述第一待处理消息;
所述处理模块,还用于在所述第一判断结果为所述第一待处理消息不是已消费消息的情况下,根据所述第一当前偏移量对所述第一目标偏移量进行更新,并对所述第一待处理消息进行处理及保存。
9.一种电子设备,其特征在于,包括处理器和存储器,所述存储器存储有能够被所述处理器执行的机器可执行指令,所述处理器可执行所述机器可执行指令以实现权利要求1-7中任意一项所述的消息处理方法。
10.一种可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1-7中任意一项所述的消息处理方法。
CN202111072091.6A 2021-09-14 2021-09-14 消息处理方法、装置、电子设备及可读存储介质 Pending CN113779149A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111072091.6A CN113779149A (zh) 2021-09-14 2021-09-14 消息处理方法、装置、电子设备及可读存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111072091.6A CN113779149A (zh) 2021-09-14 2021-09-14 消息处理方法、装置、电子设备及可读存储介质

Publications (1)

Publication Number Publication Date
CN113779149A true CN113779149A (zh) 2021-12-10

Family

ID=78843439

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111072091.6A Pending CN113779149A (zh) 2021-09-14 2021-09-14 消息处理方法、装置、电子设备及可读存储介质

Country Status (1)

Country Link
CN (1) CN113779149A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115658347A (zh) * 2022-11-04 2023-01-31 拉卡拉支付股份有限公司 数据消费方法、装置、电子设备、存储介质及程序产品
CN116991815A (zh) * 2023-09-26 2023-11-03 苏州元脑智能科技有限公司 一种分布式存储系统的日志收集方法、装置、设备及介质

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115658347A (zh) * 2022-11-04 2023-01-31 拉卡拉支付股份有限公司 数据消费方法、装置、电子设备、存储介质及程序产品
CN115658347B (zh) * 2022-11-04 2024-09-20 拉卡拉支付股份有限公司 数据消费方法、装置、电子设备、存储介质及程序产品
CN116991815A (zh) * 2023-09-26 2023-11-03 苏州元脑智能科技有限公司 一种分布式存储系统的日志收集方法、装置、设备及介质
CN116991815B (zh) * 2023-09-26 2024-01-19 苏州元脑智能科技有限公司 一种分布式存储系统的日志收集方法、装置、设备及介质

Similar Documents

Publication Publication Date Title
US10884837B2 (en) Predicting, diagnosing, and recovering from application failures based on resource access patterns
JP4796398B2 (ja) メタデータの複製および復元のための方法、システム、および製品
US9798792B2 (en) Replication for on-line hot-standby database
CN112131237B (zh) 数据同步方法、装置、设备及计算机可读介质
US8127174B1 (en) Method and apparatus for performing transparent in-memory checkpointing
EP2135165B1 (en) Shared disk clones
US20150213100A1 (en) Data synchronization method and system
CN110543386B (zh) 一种数据存储方法、装置、设备和存储介质
CN113779149A (zh) 消息处理方法、装置、电子设备及可读存储介质
CN110941502A (zh) 消息处理方法、装置、存储介质及设备
WO2016115217A1 (en) Data backup method and apparatus
US8181180B1 (en) Managing jobs in shared file systems
CN109753378A (zh) 一种内存故障的隔离方法、装置、系统及可读存储介质
US20050097141A1 (en) Autonomic filesystem recovery
US20230315713A1 (en) Operation request processing method, apparatus, device, readable storage medium, and system
JP2006004031A (ja) データ処理方法およびシステム並びにストレージ装置方法およびその処理プログラム
Alagappan et al. {Fault-Tolerance}, Fast and Slow: Exploiting Failure Asynchrony in Distributed Systems
US11307944B2 (en) Automated failover for asynchronous remote copy
US20090157767A1 (en) Circular log amnesia detection
CN113297173B (zh) 分布式数据库集群管理方法及装置、电子设备
CN116361078A (zh) 数据同步方法、装置、系统和介质
CN111209138A (zh) 数据存储系统的运维方法及装置
CN113535430A (zh) 应用数据读写分离方法、装置、计算机设备和存储介质
CN114328374A (zh) 一种快照方法、装置、相关设备及数据库系统
JP5335150B2 (ja) 計算機装置及びプログラム

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