一种流式计算系统的消息处理方法和装置与流程

文档序号:12748017阅读:210来源:国知局
一种流式计算系统的消息处理方法和装置与流程

本发明涉及计算机应用技术领域,特别涉及一种流式计算系统的消息处理方法和装置。



背景技术:

JStorm是参考storm的实时流式计算框架,在网络IO、线程模型、资源调度、可用性及稳定性上做了持续改进,已被越来越多企业使用。流式计算领域目前消息处理的级别一般为处理至少一次和处理至多一次,亟需一种简单高效的方式来保证消息被准确地只处理一次。

JStrom本身已经提供了Acker机制来实现至少处理一次的消息处理界别,因此需要解决的核心问题是,如何对重复数据进行去重,即对于处理过的消息不再进行处理。



技术实现要素:

有鉴于此,本发明提供了一种流式计算系统的消息处理方法和装置,以便于减少对消息的重复处理。

具体技术方案如下:

本发明提供了一种流式处理系统的消息处理方法,该方法包括:

S1、接收消息;

S2、判断第一存储单元中是否已经存储有所述消息,如果是,不对该消息进行处理;否则,执行S3;

S3、判断第二存储单元中是否已经存在所述消息对应的业务处理结果,如果是,执行S6,否则执行S4;

S4、对所述消息进行业务处理;

S5、将所述消息及其业务处理结果写入第二存储单元;

S6、将所述消息写入第一存储单元。

根据本发明一优选实施方式,所述第一存储单元中的内容被映射至布隆过滤器BloomFilter;

在所述S2之前还包括:判断所述消息是否命中BloomFilter,如果否,执行所述S3;如果是,则执行所述S2。

根据本发明一优选实施方式,在执行所述S4时,如果所述第二存储单元中已经存在与所述消息具有相同计算标识的消息列表,则利用与所述消息具有相同计算标识的消息列表对应的业务处理结果,对所述消息进行业务处理;

在所述S5中,将所述消息加入所述消息列表,并利用S4的业务处理结果更新所述第二存储单元中所述消息列表对应的业务处理结果;

在执行所述S6时,将包含所述消息的所述消息列表写入第一存储单元。

根据本发明一优选实施方式,在所述S4和所述S5之间还包括:将所述消息及其对应的业务处理结果放入写入队列;

利用所述写入队列中的内容执行所述S5和所述S6。

根据本发明一优选实施方式,利用所述写入队列中的内容执行所述S5和所述S6包括:

S51、从所述写入队列中取出一个缓存节点,所述一个缓存节点中包含消息及其对应的业务处理结果;

S52、将所述缓存节点中的内容写入所述第二存储单元;

S53、将所述缓存节点中的消息放入去重存储写入队列;

S54、从去重存储写入队列中取出消息并写入第一存储单元。

根据本发明一优选实施方式,在所述S2之后且所述S3之间还包括:

判断所述写入队列和所述去重存储写入队列中是否已经存在所述消息,如果是,则不对所述消息进行业务处理,否则继续执行所述S3。

根据本发明一优选实施方式,在所述S51和所述S52之前还包括:

判断所述去重存储写入队列中是否已经存在与所述缓存节点所包含消息具 有相同计算标识的消息,如果是,则将所述缓存节点放回所述写入队列,等待重新执行所述S51;否则,继续执行所述S52。

本发明还提供了一种流式计算系统的消息处理装置,该装置包括:

接收单元,用于接收消息;

第一判断单元,用于判断第一存储单元中是否已经存储有所述消息,如果判断结果为是,不再对所述消息进行处理;

第二判断单元,用于在所述第一判断单元的判断结果为否时,判断所述第二存储单元中是否已经存在所述消息对应的业务处理结果;

处理单元,用于在所述第二判断单元的判断结果为是时,不对所述消息进行业务处理;在所述第二判断单元的判断结果为否时,对所述消息进行业务处理;

第一写入单元,用于将所述消息的处理结果写入第二存储单元;

第二写入单元,用于在所述第一写入单元完成写入后,或者在所述第二判断单元的判断结果为否时,将所述消息写入第一存储单元。

根据本发明一优选实施方式,所述第一存储单元中的内容被映射至BloomFilter;

该装置还包括:第三判断单元,用于在所述接收单元接收到所述消息后,判断所述消息是否命中BloomFilter,如果否,触发所述第二判断单元执行判断的操作;如果是,触发所述第一判断单元执行判断的操作。

根据本发明一优选实施方式,所述处理单元,具体用于如果所述第二存储单元中已经存在与所述消息具有相同计算标识的消息列表,则利用与所述消息具有相同计算标识的消息列表对应的业务处理结果,对所述消息进行业务处理;

所述第一写入单元,具体用于将所述消息加入所述消息列表,并利用所述处理单元本次的业务处理结果更新所述第二存储单元中所述消息列表对应的业务处理结果;

所述第二写入单元,具体用于将包含所述消息的所述消息列表写入第一存储单元。

根据本发明一优选实施方式,所述处理单元,还用于将所述消息及其对应的业务处理结果放入写入队列;

所述第一写入单元和所述第二写入单元利用所述写入队列中的内容执行写入的操作。

根据本发明一优选实施方式,所述第一写入单元,具体用于从所述写入队列中取出一个缓存节点,所述一个缓存节点中包含消息及其对应的业务处理结果,将所述缓存节点中的内容写入所述第二存储单元,将所述缓存节点中的消息放入去重存储写入队列;

所述第二写入单元,具体用于从去重存储写入队列中取出消息并写入第一存储单元。

根据本发明一优选实施方式,该装置还包括:

第四判断单元,用于在所述第一判断单元的判断结果为否时,判断所述写入队列和所述去重写入队列中是否已经存在所述消息,如果是,则不对所述消息进行业务处理;否则,触发所述第二判断单元执行判断的操作。

根据本发明一优选实施方式,所述第一写入单元在将所述缓存节点中的内容写入所述第二存储单元之前,还用于判断所述去重存储写入队列中是否已经存在与所述缓存节点所包含消息具有相同计算标识的消息,如果是,则将所述缓存节点放回所述写入队列,等待重新取出;否则,继续执行将所述缓存节点中的内容写入所述第二存储单元的操作。

由以上技术方案可以看出,将消息连同处理结果对应写入第二存储单元,即便消息写入第一存储单元失败,下次接收到相同的消息时,由于第二存储单元中已经存在该消息对应的业务处理结果,不必再次对该消息进行业务处理,仅将该消息写入第一存储单元即可,保证了消息仅被业务处理一次,提高了系统性能和效率。

【附图说明】

图1为本发明实施例提供的一个处理流程图;

图2为本发明实施例提供的消息处理方法的流程图;

图3为本发明实施例提供的计算存储单元和去重存储单元的写入流程图;

图4为本发明实施例提供的消息处理装置的结构图。

【具体实施方式】

为了使本发明的目的、技术方案和优点更加清楚,下面结合附图和具体实施例对本发明进行详细描述。

在本发明中使用两个存储单元:计算存储单元(第二存储单元)和去重存储单元(第一存储单元)。其中,计算存储单元用于存储对消息的业务处理结果,去重存储单元存储进行过业务处理的消息,用于做去重以避免消息的重复业务处理。

当接收到一个消息时,处理流程可以如图1中所示,包括以下流程:

在101中,判断去重存储单元中是否已经存储有该接收到的消息,如果是,不再对该消息进行处理;否则,执行102。

在102中,对该消息进行业务处理。

在本发明实施例中涉及的对消息进行的业务处理可以由具体的业务需求来确定,可能会利用历史处理结果,如果需要利用历史处理结果,则在业务处理时,可以首先从计算存储单元中获取历史处理结果,然后利用获取的历史处理结果对该消息进行处理。在某些业务需求下,对消息进行的业务处理可以是利用消息进行的计算,例如,当消息2是对A类用户的总订单量进行统计,如果此前已经存在消息1也是对A类用户的总订单量进行统计,那么在针对消息2进行计算时,就可以从计算存储单元中获取消息1的计算结果,将该计算结果与消息2中包含的A类用户的订单量进行相加后得到消息2的计算结果。

在103中,将业务处理结果写入计算存储单元。

在104中,将该消息写入去重存储单元。

当接收到新的消息时,重新转至102开始执行。

上述方法可以在一定程度上减少对消息的重复处理,但如果在执行103之后,在104时发生诸如系统宕机等故障导致104执行失败,这就会造成业务处理结果写入计算存储单元成功,但消息写入去重存储单元失败。这种情况下,仍会导致消息被重复业务处理,从而影响系统性能和效率。例如,当再次接收到该消息时,判断去重存储单元中不存在该消息,则再次对该消息进行业务处理,并将业务处理结果写入计算存储单元,将该消息写入去重存储单元。

针对上述的问题,本发明实施例进一步提供了一种解决方案,其执行流程可以如图2中所示,当接收到一个消息时,执行以下步骤:

在201中,判断去重存储单元中是否已经存储有该接收到的消息,如果是,不再对该消息进行处理;否则,执行202。

在202中,判断计算存储单元中是否已经存在该消息对应的业务处理结果,如果是,不再对该消息进行业务处理,直接执行步骤205;否则,执行203。

在判断计算存储单元中是否已经存在该消息对应的业务处理结果时,可以首先确定计算存储单元中是否存在业务处理结果,然后通过判断计算存储单元中是否已经存在接收到的消息来实现。如果计算存储单元中存在业务处理结果并且计算存储单元中已经存在该接收到的消息,则确定计算存储单元中已经存在该消息对应的业务处理结果,无需再次对接收到的消息进行业务处理。

在203中,对该消息进行业务处理。

在204中,将该消息与该消息的业务处理结果对应写入计算存储单元。

在205中,将该消息写入去重存储单元。

以几个场景举例如下:

假设第一次接收到消息a,判断出去重存储单元中没有该消息且计算存储单元中也不存在该消息对应的业务处理结果,则对该消息进行业务处理, 将消息a以及消息a的业务处理结果对应写入计算存储单元,并将消息a写入去重存储单元。

假设消息a写入去重存储单元失败。

再次接收到消息a,判断出去重存储单元中不存在该消息,但计算存储单元中已经存在该消息a对应的业务处理结果,则不必再次对该消息进行业务处理,直接将消息a写入去重存储单元。显然,这种方式避免了对消息a再次进行业务处理和写入计算存储单元,提高了系统性能和效率。

另外,为了提高效率,可以将去重存储单元中的内容映射至BloomFilter(布隆过滤器),在接收到消息时,首先判断该消息是否命中BloomFilter,如果否,说明该消息在去重存储单元中不存在,则在图2所示执行流程中继续执行步骤202;如果命中BloomFilter,则说明去重存储单元中可能存储有该消息,则在图2所示执行流程中继续执行步骤201。

上述图2所示的流程中,可能存在这样一种场景,消息A的业务处理依赖于消息B的业务处理结果,这种情况下,消息A和消息B就具有相同的计算key(计算标识),例如某消息是对用户u的订单量进行累加,需要将该消息中包含的用户u的订单量与利用之前消息的业务处理结果的用户u的订单量进行累加,这些消息都具有相同的计算key,该计算key可以采用用户u的标识等。对于这种场景,为了更加准确地保证去重,在203中对消息进行业务处理时,如果计算存储单元中已经存在与该接收到的消息具有相同计算key的消息列表,则利用计算存储单元中与接收到的消息具有相同计算key的消息列表对应的业务处理结果,对接收到的消息进行业务处理。在204中,将该接收到的消息加入上述的消息列表,并利用本次业务处理结果更新计算存储单元中该消息列表对应的业务处理结果。在205中将包含接收到的消息的上述消息列表写入去重存储单元。

举一个例子:

假设接收到消息a,判断去重存储单元中不包含消息a,计算存储单元中也不包含消息a,那么对该消息a进行业务处理,得到业务处理结果,将该 消息a及其对应的业务处理结果a写入计算存储单元,此时计算存储单元中该业务处理结果a对应的消息列表中仅包含消息a;将消息a写入去重存储单元。

在此基础上又接收到消息b,判断去重存储单元中不包含消息b,计算存储单元中也不包含消息b,但由于计算存储单元中包含了与消息b具有相同计算key的消息列表,因此,利用计算存储单元中的业务处理结果a对消息b进行业务处理,得到业务处理结果b。将消息b加入计算存储单元的上述消息列表,此时消息列表中包含消息a和消息b,利用业务处理结果b更新业务处理结果a,此时包含消息a和消息b的消息列表对应的业务处理结果为业务处理结果b。将消息a和消息b写入去重存储单元。

如果接收到消息a时,将消息a写入去重存储单元失败,则会造成计算存储单元中包含消息a,而去重存储单元中不包含消息a。那么在此基础上如果接收到消息b,通过上述流程能够实现消息b的业务处理,并将消息a和消息b写入去重存储单元,即在接收到消息b时,将消息a补写入了去重存储单元。即便后续再次接收到消息a,也能够保证不会对该消息a进行重复的业务处理。

在图2中所示步骤203之后,可以将该消息以及消息的业务处理结果放入写入队列。另外,由于在流式业务处理系统中可以存在多线程处理的方式,因此,在执行步骤202之前,可以首先判断写入队列和去重存储写入队列(后续描述中将会涉及)中是否已经包含该消息,如果是,则不执行202,不再对本次接收到的消息进行处理;否则,再执行步骤202。

具体的写入流程,即图2中所示的步骤204和205可以如图3中所示,包括以下步骤:

在301中,从写入队列中取出一个CacheNode(缓存节点),一个CacheNode中包含消息及该消息对应的业务处理结果,其中消息可以是以消息列表的形式存在。

在302中,判断去重存储写入队列中是否已经存在与该CacheNode所包 含消息具有相同计算key的消息,如果是,将该CacheNode放回写入队列,等待重新执行301;否则,执行303。

为了防止消息尚未被存入去重存储单元就被具有相同计算key的消息覆盖掉,在本步骤中,先判断去重存储写入队列中是否已经存在与该CacheNode所包含消息具有相同计算key的消息,如果有,说明有相同计算key的消息正在被写入去重存储单元,应该等待写入完成之后在写入新的消息,因此先将该CacheNode放回写入队列,等待重试。

在303中,将CacheNode中的内容写入计算存储单元。

在304中,将CacheNode中的消息放入去重存储写入队列。

在305中,从去重存储写入队列中取出消息,将消息写入去重存储单元。

需要说明的是,上述的写入队列实际上是一个总的队列,主要用于计算存储单元的写入,而去重存储写入队列仅用于去重存储单元的写入。可以看出,计算存储单元的写入和去重存储单元的写入采用异步的方式,从而提高吞吐量。

图4为本发明实施例提供的装置结构图,该装置可以设置于流式业务处理系统中需要对消息进行处理的设备中。如图4中所示,该装置可以包括:接收单元01、第一判断单元02、第二判断单元03、处理单元04、第一写入单元05和第二写入单元06,还可以进一步包括第三判断单元07和第四判断单元08。其中,各组成单元的主要功能如下:

接收单元01负责接收消息。

第一判断单元02负责判断去重存储单元中是否已经存储有该消息,如果判断结果为是,不再对该消息进行处理。在第一判断单元02的判断结果为否时,第二判断单元03判断计算存储单元中是否已经存在消息对应的业务处理结果。在第二判断单元03的判断结果为是时,处理单元04不对消息进行处理;在第二判断单元03的判断结果为否时,处理单元04对消息进行业务处理。

第一写入单元05负责将消息的业务处理结果写入计算存储单元。第二写入单元06在第一写入单元05完成写入后,或者在第二判断单元03的判断结果为 否时,将消息写入去重存储单元。

优选地,为了提高效率,可以将去重存储单元中的内容映射至BloomFilter。在接收单元01接收到消息后,可以先由第三判断单元07判断该消息是否命中BloomFilter,如果否,说明该消息在去重存储单元中一定不存在,触发第二判断单元03执行判断的操作;如果是,说明去重存储单元中可能存储有该消息,则触发第一判断单元02执行判断的操作。

对于需要利用历史业务处理结果进行业务处理的场景,为了更加准确地保证去重,优选采用以下方式:即如果计算存储单元中已经存在与接收到的消息具有相同计算key的消息列表,则处理单元04利用与该消息具有相同计算key的消息列表对应的业务处理结果,对该消息进行业务处理。

此时,第一写入单元05将该消息加入消息列表,并利用处理单元04本次的业务处理结果更新计算存储单元中消息列表对应的业务处理结果。第二写入单元06将包含本次接收到的消息的消息列表写入去重存储单元。

另外,处理单元04还可以将该消息(包含该消息的消息队列)及其对应的业务处理结果放入写入队列。第一写入单元05和第二写入单元06利用写入队列执行写入的操作。

具体地,第一写入单元05可以从写入队列中取出一个CacheNode,一个CacheNode中包含消息(消息列表)及其对应的业务处理结果,将CacheNode中的内容写入计算存储单元,将CacheNode中的消息放入去重存储写入队列。第二写入单元06从去重存储写入队列中取出消息并写入去重存储单元。可以看出,计算存储单元的写入和去重存储单元的写入采用异步的方式,从而提高吞吐量。

优选地,在上述第一判断单元02的判断结果为否时,第四判断单元08判断写入队列和去重写入队列中是否已经存在消息,如果是,则不对消息进行处理;否则,触发第二判断单元03执行判断的操作。

更进一步地,第一写入单元05在将CacheNode中的内容写入计算存储单元之前,可以先判断去重存储写入队列中是否已经存在与CacheNode所包 含消息具有相同计算key的消息,如果是,则将CacheNode放回写入队列,等待重新取出;否则,继续执行将CacheNode中的内容写入计算存储单元的操作。

需要说明的是,本发明实施例提供的方法和装置并不限于JStorm和Storm,可以适用于任何采用类似机制的流式业务处理系统的消息处理。

在本发明所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。

上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本发明各个实施例所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。

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