消息处理方法及装置、电子设备
技术领域
本说明书一个或多个实施例涉及信息处理技术领域,尤其涉及一种消息处理方法及装置、电子设备。
背景技术
在消息处理过程中,难免会出现处理节点(worker)宕机或重启等异常情况,这类异常情况会导致消息处理过程的中断,通常,可通过故障转移(failover)机制来恢复对消息的处理过程。而在failover之后,如何避免重复处理在异常发生之前已经被处理过的消息是需要解决的问题。
发明内容
有鉴于此,本说明书一个或多个实施例提供一种消息处理方法及装置、电子设备。
为实现上述目的,本说明书一个或多个实施例提供的技术方案如下:
一种消息处理方法,包括:
将n个时间戳及n个与所述时间戳对应的标记值写入内存中的第一缓存区,其中所述标记值表征在所述时间戳对应的时间间隔内产生的且未被处理的消息数量,n≥1;
在至少一个消息被处理完后,更新所述第一缓存区中的与被处理消息的时间戳对应的标记值;
将所述第一缓存区中存储的标记值不为目标值的最早时间戳写入非易失性存储器,所述目标值表征的未被处理的消息数量为零;
在故障转移failover后,从与所述非易失性存储器中记录的最早时间戳对应的消息开始处理。
一种消息处理方法,包括:
将n个时间戳及n个与所述时间戳对应的标记值写入存储区,其中所述标记值表征在所述时间戳对应的时间间隔内产生的且未被处理的消息数量,n≥1;
在至少一个消息被处理完后,更新所述存储区中的与被处理消息的时间戳对应的标记值;
在故障转移failover后,从与所述存储区中存储的标记值不为目标值的最早时间戳对应的消息开始处理,所述目标值表征的未被处理的消息数量为零。
一种消息处理装置,包括第一写入单元、更新单元、第二写入单元以及恢复处理单元,其中:
所述第一写入单元,将n个时间戳及n个与所述时间戳对应的标记值写入内存中的第一缓存区,其中所述标记值表征在所述时间戳对应的时间间隔内产生的且未被处理的消息数量,n≥1;
所述更新单元,在至少一个消息被处理完后,更新所述第一缓存区中的与被处理消息的时间戳对应的标记值;
所述第二写入单元,将所述第一缓存区中存储的标记值不为目标值的最早时间戳写入非易失性存储器,所述目标值表征的未被处理的消息数量为零;
所述恢复处理单元,在故障转移failover后,从与所述非易失性存储器中记录的最早时间戳对应的消息开始处理。
一种消息处理装置,包括写入单元、写入单元以及恢复处理单元,其中:
所述写入单元,将n个时间戳及n个与所述时间戳对应的标记值写入存储区,其中所述标记值表征在所述时间戳对应的时间间隔内产生的且未被处理的消息数量,n≥1;
所述写入单元,在至少一个消息被处理完后,更新所述存储区中的与被处理消息的时间戳对应的标记值;
所述恢复处理单元,在故障转移failover后,从与所述存储区中存储的标记值不为目标值的最早时间戳对应的消息开始处理,所述目标值表征的未被处理的消息数量为零。
一种电子设备,包括:
处理器;
用于存储处理器可执行指令的存储器;
所述处理器被配置为:
将n个时间戳及n个与所述时间戳对应的标记值写入内存中的第一缓存区,其中所述标记值表征在所述时间戳对应的时间间隔内产生的且未被处理的消息数量,n≥1;
在至少一个消息被处理完后,更新所述第一缓存区中的与被处理消息的时间戳对应的标记值;
将所述第一缓存区中存储的标记值不为目标值的最早时间戳写入非易失性存储器,所述目标值表征的未被处理的消息数量为零;
在故障转移failover后,从与所述非易失性存储器中记录的最早时间戳对应的消息开始处理。
一种电子设备,包括:
处理器;
用于存储处理器可执行指令的存储器;
所述处理器被配置为:
将n个时间戳及n个与所述时间戳对应的标记值写入存储区,其中所述标记值表征在所述时间戳对应的时间间隔内产生的且未被处理的消息数量,n≥1;
在至少一个消息被处理完后,更新所述存储区中的与被处理消息的时间戳对应的标记值;
在故障转移failover后,从与所述存储区中存储的标记值不为目标值的最早时间戳对应的消息开始处理,所述目标值表征的未被处理的消息数量为零。
通过以上技术方案可以看出,通过时间戳和标记值进行对应并存储,并且在消息被处理完后,对存储的与被处理消息的时间戳对应的标记值进行更新。基于存储的标记值和时间戳,由于标记值可以反映出异常发生之前所处理到的消息位置,所以在异常发生并故障转移failover后,可从与预存储的标记值不为目标值的最早时间戳对应的消息开始处理,从而避免了重复处理在异常发生之前已经被处理过的消息。
附图说明
图1示出了一示例性实施例提供的分布式流计算系统的架构图;
图2示出了一示例性实施例提供的一种消息处理方法的流程图;
图3示出了一示例性实施例提供的另一种消息处理方法的流程图;
图4示出了一示例性实施例提供的一种消息处理装置的模块图;
图5示出了一示例性实施例提供的另一种消息处理装置的模块图;
图6示出了一示例性实施例提供的一种电子设备的结构。
具体实施方式
本说明书所要介绍的消息处理方法可以被应用于一种分布式流计算(streamcomputing)系统中。如图1所示,以分布式的流计算系统为例,可包括消息队列、用于输入待处理的消息队列的消息缓存、用于对消息进行并发处理的若干处理单元、用于输出处理完所得的消息的消息缓存以及用以存储时间戳和标记值的对应关系的第一缓存区。其中,随着各类网络平台(如支付平台等)的业务运行,会不断产生待处理的消息(message),每条待处理的消息均对应一个时间戳(如:unix时间戳),该时间戳可以代表产生该消息的时间,该时间戳可以表示一个时间点。其中,将产生的各消息按照时间先后进行排序所得到的队列便称为消息队列。通常,在一个较小的设定时间间隔内产生的消息数量会较大,例如:在1ms内可能会产生1000条待处理的消息,可以将在同一时间间隔内产生的消息对应于同一个时间戳(如:将每个1ms的时间间隔通过时间戳进行表示)。
在分布式的流计算系统中,可以包含多个任务分片(如:分片0,分片1,...,分片m),每个任务分片用以分别对该分片所产生的消息队列执行流计算。在每个任务分片中,可以将产生的消息队列输入到内存中的一个用以存放待处理的消息队列的消息缓存中,以等待处理单元的并行处理。其中,并行处理可指通过多个处理单元并行地对上述任务分片产生的消息队列内的消息进行处理,在并行处理的过程中,对于每个任务分片,可以按照消息队列中的时间先后的顺序,逐一从消息缓存中读取待处理消息进行处理。消息被处理完之后,可以将处理完的各条消息输出到用以存储处理后消息的消息缓存中。
在分布式的流计算系统中,可以包括多个处理节点(worker),每个处理节点可以用于对至少一个任务分片的消息执行流处理动作。其中,处理节点可以为用以执行流计算的各类计算设备,每个处理节点可以包括一个或多个处理单元。在实际的流计算过程中,难免会出现某一个处理节点出现异常(如宕机或重启等)无法正常工作的情况,此时,一般需要通过故障转移(failover)机制来恢复对消息的处理过程,即,当某个处理节点异常时,启用冗余或备用的其他处理节点接替异常节点的工作。而在failover之后,如何避免重复处理在异常发生之前已经被处理过的消息是需要解决的问题。
图2示出了一示例性实施例提供的一种消息处理方法的流程图,如图2所示,在一实施例中,所述方法可包括步骤101至步骤107,其中:
步骤101:将n个时间戳及n个与所述时间戳对应的标记值写入内存中的第一缓存区。其中,所述标记值表征在所述时间戳对应的时间间隔内产生的且未被处理的消息数量,n≥1。
如上所述,可以按照设定的时间间隔(如1ms)分别统计在每个时间间隔内所产生的待处理消息的数量。其中,可以分别通过一个unix时间戳来表示每个时间间隔。举例而言,第一缓存区中存储的标记值(标记值可以采用十进制数进行表示)和时间戳之间的对应关系如下表1:
表1:
时间戳 |
标记值 |
t<sub>1</sub> |
1000 |
t<sub>2</sub> |
500 |
... |
... |
t<sub>n</sub> |
800 |
该步骤101可以在待处理消息(即t1~tn所产生的消息)被处理之前被执行。
在一实施例中,可根据实际需求,动态配置上述第一缓存区的存储量上限(即n的取值上限)。
在可选的实施例中,因为消息队列中的消息可以按照时间先后进行排序,可以在将时间戳和标记值的对应关系写入第一缓存区时,也按照时间先后进行排序。如:按照时间由先到后,排序为:t1,t2,...,tn。通过排序,可以便于数据的写入以及查找。当然,在其他可行的实施例中,对第一缓存区中的时间戳进行排序并非是必要的。
由于在第一缓存区中,对于每个设定时间间隔而言,无论其产生的消息有多少,在第一缓存区中只需要为该时间间隔存储一个时间戳以及与该时间戳对应的一个标记值,所占用的内存空间非常小。
在一可选的实施例中,可以采用跳跃链表(skip list)将n个时间戳及n个与所述时间戳对应的标记值存储于所述第一缓存区。其中,采用跳跃链表的原因包括:1)skiplist便于按照时间先后进行排序;2)skip list可使得对表中的数据进行删除的效率更高。
步骤103:在至少一个消息被处理完后,更新第一缓存区中的与被处理消息的时间戳对应的标记值。
在步骤101之后,可以通过特定的处理节点来对上述例子中的t1,t2,...,tn产生的消息进行逐一处理。
在一实施例中,在该步骤103中,可以通过监听任务等方式来获取消息的处理状态,每当监听一个消息被处理完毕之后,便对第一缓存区中的与被处理消息的时间戳对应的标记值进行更新。例如,当监听到某个在时间戳t1对应的时间间隔内所产生的消息message_A被处理完毕之后,则对与该被处理消息message_A的时间戳t1对应的标记值(如1000)减一,则更新后的标记值为999。依次类推,随着消息不断被处理完毕,第一缓存区中存储的标记值会不断被更新。当然,在可选的实施例中,可以不用在每个消息被处理完毕之后便触发一次更新操作,例如:在监听到多个消息被处理完毕之后才触发一次更新操作。步骤103也可以通过定时任务进行更新。其中,当某个时间戳t1对应的消息全部被处理完之后,在第一缓存区中存储的与该时间戳t1对应的标记值为0。当然,标记值可以二进制数形式写入到第一缓存区中,对此本文不作限定。
步骤105:将第一缓存区中存储的标记值不为目标值的最早时间戳写入非易失性存储器,其中,所述目标值表征的未被处理的消息数量为零。
当某个时间戳(如:t1)对应的标记值为上述目标值(如:00000000)时,表明该时间戳所产生的消息全部被处理完毕,如果处理节点发生宕机或重启,在failover之后,并不需要对t1对应的消息进行重复处理。
在一实施例中,因为当处理节点发生异常时,存储在内存中的第一缓存区内的数据可能会消失,并无法较为准确地确定出处理节点在异常发生之前所处理到的消息位置。为此,需要定期地或不定期地将第一缓存区中存储的标记值不为目标值的最早时间戳写入非易失性存储器,以持久化存储。结合下表2的例子来说明:
表2:
时间戳 |
标记值 |
t<sub>1</sub> |
0 |
t<sub>2</sub> |
0 |
t<sub>3</sub> |
30 |
t<sub>4</sub> |
800 |
... |
... |
t<sub>n</sub> |
600 |
在表2中,可确定出标记值不为目标值的时间戳包括:t3、t4、...、tn,其中,如果是按照时间先后的次序将时间戳排序,则可以确定出最早时间戳为t3。最终,在步骤105中,可将上述最早时间戳:t3存储到非易失性存储器中。
在一可选的实施例中,该步骤105可以通过定时任务(如:1分钟一次)来执行,并且,后一次定时任务确定的最高时间戳可以覆盖前一次定时任务确定的最早时间戳。
步骤107:在故障转移failover后,从与所述非易失性存储器中记录的最早时间戳对应的消息开始处理。
在示例性场景中,如某个处理节点发生宕机,在该处理节点恢复正常或转移到其他处理节点继续对消息进行处理之后,可以通过非易失性存储器中记录的最早时间戳来确定宕机之前最近处理到的消息位置(所谓消息位置即消息所对应的时间戳),并从该最早时间戳对应的消息开始处理,从而快速实现failover。
在一实施例中,为了避免对内存的占用,需要通过一个清理线程对第一缓存区内存储的数据进行清理,该清理线程可以为一个定时任务。具体地,所述方法还可以包括:
步骤108:通过清理线程清除所述第一缓存区中存储的标记值为目标值的时间戳。
该步骤108可以在步骤101之后执行,该步骤108与上述步骤103、步骤105以及步骤107之间可以没有先后关系。
以上述表2为例来说明,需要被清理的时间戳为t1和t2,在清理之后,第一缓存区便被空闲出一定的存储空间,之后,可以继续向该第一缓存区写入时间更加靠后的一个或多个时间戳,以及与各时间戳对应的标记值。通过该清理线程,在降低对内存的消耗的同时,可以使得第一缓存区内的数据被不断更新,满足实际业务的需求。
图3示出了一示例性实施例提供的另一种消息处理方法的流程图,如图3所示,在本实施例中,该消息处理方法可以包括步骤201至步骤205,其中:
步骤201:将n个时间戳及n个与所述时间戳对应的标记值写入存储区,其中,所述标记值表征在所述时间戳对应的时间间隔内产生的且未被处理的消息数量,n≥1。
该步骤201可以参照上文对步骤101进行描述的内容,此处不再赘述。其中,与步骤101的不同之处包括:时间戳和标记值的对应关系可以不限于被写入到内存中的一片存储区域,其还可以被直接写入一个非易失性存储器中的一片区域。
步骤203:在至少一个消息被处理完后,更新所述存储区中的与被处理消息的时间戳对应的标记值。
该步骤203可以参照上文对步骤103进行描述的内容,此处不再赘述。
步骤205:在故障转移failover后,从与所述存储区中存储的标记值不为目标值的最早时间戳对应的消息开始处理,所述目标值表征的未被处理的消息数量为零。
在示例性场景中,当处理节点发生宕机或重启之后,存储在上述存储区内的数据可以仍然存在,从而可以根据储区中存储的标记值不为目标值的最早时间戳来确定从哪里开始继续处理。
与上述方法相对应的,本文还提供了一种消息处理装置,该消息处理装置可以包括软件中的各个代码模块。
如图4所示,在一实施例中,一种消息处理装置200,包括第一写入单元210、更新单元220、第二写入单元230以及恢复处理单元250,其中:
第一写入单元210可以被配置为:将n个时间戳及n个与所述时间戳对应的标记值写入内存中的第一缓存区,其中所述标记值表征在所述时间戳对应的时间间隔内产生的且未被处理的消息数量,n≥1;
更新单元220可以被配置为:在至少一个消息被处理完后,更新所述第一缓存区中的与被处理消息的时间戳对应的标记值;
第二写入单元230可以被配置为:将所述第一缓存区中存储的标记值不为目标值的最早时间戳写入非易失性存储器,所述目标值表征的未被处理的消息数量为零;
恢复处理单元250可以被配置为:在故障转移failover后,从与所述非易失性存储器中记录的最早时间戳对应的消息开始处理。
如图5所示,在另一实施例中,一种消息处理装置300,包括写入单元310、更新单元330以及恢复处理单元350,其中:
写入单元310可以被配置为:将n个时间戳及n个与所述时间戳对应的标记值写入存储区,其中所述标记值表征在所述时间戳对应的时间间隔内产生的且未被处理的消息数量,n≥1;
更新单元330可以被配置为:在至少一个消息被处理完后,更新所述存储区中的与被处理消息的时间戳对应的标记值;
恢复处理单元350可以被配置为:在故障转移failover后,从与所述存储区中存储的标记值不为目标值的最早时间戳对应的消息开始处理,所述目标值表征的未被处理的消息数量为零。
如图6所示,本说明书一个或多个实施例提供了一种电子设备(如:单个服务器、终端设备、服务器集群、用户设备等具有计算能力的设备),该电子设备可以包括处理器、内部总线、网络接口、存储器(包括内存以及非易失性存储器),当然还可能包括其他业务所需要的硬件。处理器可为中央处理单元(CPU)、处理单元、处理电路、处理器、专用集成电路(ASIC)、微处理器或可执行指令的其他处理逻辑中的一个或多个实例。处理器从非易失性存储器中读取对应的程序到内存中然后运行。当然,除了软件实现方式之外,本说明书一个或多个实施例并不排除其他实现方式,比如逻辑器件抑或软硬件结合的方式等等,也就是说以下处理流程的执行主体并不限定于各个逻辑单元,也可以是硬件或逻辑器件。
在一种实施例中,处理器可以被配置为:
将n个时间戳及n个与所述时间戳对应的标记值写入内存中的第一缓存区,其中所述标记值表征在所述时间戳对应的时间间隔内产生的且未被处理的消息数量,n≥1;
在至少一个消息被处理完后,更新所述第一缓存区中的与被处理消息的时间戳对应的标记值;
将所述第一缓存区中存储的标记值不为目标值的最早时间戳写入非易失性存储器,所述目标值表征的未被处理的消息数量为零;
在故障转移failover后,从与所述非易失性存储器中记录的最早时间戳对应的消息开始处理。
在另一种实施例中,处理器可以被配置为:
将n个时间戳及n个与所述时间戳对应的标记值写入存储区,其中所述标记值表征在所述时间戳对应的时间间隔内产生的且未被处理的消息数量,n≥1;
在至少一个消息被处理完后,更新所述存储区中的与被处理消息的时间戳对应的标记值;
在故障转移failover后,从与所述存储区中存储的标记值不为目标值的最早时间戳对应的消息开始处理,所述目标值表征的未被处理的消息数量为零。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同/相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于设备实施例、装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本说明书一个或多个实施例时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flashRAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本说明书一个或多个实施例的实施例可提供为方法、系统或计算机程序产品。因此,本说明书一个或多个实施例可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本说明书一个或多个实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本说明书一个或多个实施例可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书一个或多个实施例,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
以上所述仅为本说明书一个或多个实施例的实施例而已,并不用于限制本说明书一个或多个实施例。对于本领域技术人员来说,本说明书一个或多个实施例可以有各种更改和变化。凡在本说明书一个或多个实施例的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例的权利要求范围之内。