消息处理方法、装置以及设备与流程

文档序号:19664422发布日期:2020-01-10 21:26阅读:119来源:国知局
消息处理方法、装置以及设备与流程

本说明书涉及计算机软件技术领域,尤其涉及一种消息处理方法、装置以及设备。



背景技术:

流数据可以看成是一组组离散事件的集合体,由成千上万个数据源,源源不断的持续生成送。面向流数据的计算可以被称为流计算。

对于流计算来说,上游将数据源生成的流数据实时发送至下游进行处理,下游对流数据进行处理得到结果数据。上游的流数据是实时的且持续的,下游的结果数据也是持续的,且实时更新的。

流计算的源头可以是各种消息中间件,且每收到一条消息会直接进行处理。但是消息中间件发送的流数据并不能保证消息的顺序性,假设消息中间件先发送了第一消息,后发送了第二消息两条数据。在下游进行处理时,先接收到了第二消息,后接收到了第一消息,则会先对第二消息进行处理,后对第一消息进行处理,导致消息处理顺序错误,可能会导致消息处理结果出错,影响消息处理结果的准确性。



技术实现要素:

本说明书实施例提供一种消息处理方法、装置以及设备,用以解决如下技术问题:消息中间件发送的流数据不能保证消息的顺序性,可能会导致消息处理结果出错,影响消息处理结果的准确性。

为解决上述技术问题,本说明书实施例是这样实现的:

本说明书实施例提供的一种消息处理方法,包括:

开始第一计时,得到第一计时时长;

接收消息中间件发送的第一消息;

将所述第一消息加入到消息缓存;

判断所述第一计时时长是否达到第一预设时长,得到第一判断结果;

若所述第一判断结果表示所述第一计时时长达到所述第一预设时长,则判断所述消息缓存中的目标消息生成时刻的先后顺序与在所述消息缓存中的排列顺序是否一致,得到第二判断结果,其中,所述目标消息包括所述第一消息和在所述第一消息之前加入所述消息缓存中的消息;

若所述第二判断结果表示所述目标消息生成时刻的先后顺序与在所述消息缓存中的排列顺序不一致,则按所述目标消息的生成时刻对所述目标消息进行排序。

本说明书实施例提供的一种消息处理装置,包括:

第一计时模块,用于开始第一计时,得到第一计时时长;

接收模块,用于接收消息中间件发送的第一消息;

加入模块,用于将所述第一消息加入到消息缓存;

第一判断模块,用于判断所述第一计时时长是否达到第一预设时长,得到第一判断结果;

第二判断模块,用于若所述第一判断结果表示所述第一计时时长达到所述第一预设时长,则判断所述消息缓存中的目标消息生成时刻的先后顺序与在所述消息缓存中的排列顺序是否一致,得到第二判断结果,其中,所述目标消息包括所述第一消息和在所述第一消息之前加入所述消息缓存中的消息;

排序模块,用于若所述第二判断结果表示所述目标消息生成时刻的先后顺序与在所述消息缓存中的排列顺序不一致,则按所述目标消息的生成时刻对所述目标消息进行排序。

本说明书实施例提供的一种消息处理设备,包括:

至少一个处理器;以及,

与所述至少一个处理器通信连接的存储器;其中,

所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够:

开始第一计时,得到第一计时时长;

接收消息中间件发送的第一消息;

将所述第一消息加入到消息缓存;

判断所述第一计时时长是否达到第一预设时长,得到第一判断结果;

若所述第一判断结果表示所述第一计时时长达到所述第一预设时长,则判断所述消息缓存中的目标消息生成时刻的先后顺序与在所述消息缓存中的排列顺序是否一致,得到第二判断结果,其中,所述目标消息包括所述第一消息和在所述第一消息之前加入所述消息缓存中的消息;

若所述第二判断结果表示所述目标消息生成时刻的先后顺序与在所述消息缓存中的排列顺序不一致,则按所述目标消息的生成时刻对所述目标消息进行排序。

本说明书实施例采用的上述至少一个技术方案能够达到以下有益效果:通过对达到预设时长的消息进行排序,使得在消息缓存中的消息都是有序的,提高了消息最终处理结果的准确性。且避免了每接收到一条消息就进行一次排序,提高了处理效率,拉长了消息的接收时间,增加了接收到的消息的数量,提高了整体消息排序结果的准确性。

附图说明

为了更清楚地说明本说明书实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本说明书实施例提供的一种消息处理方法的系统架构示意图;

图2为本说明书另一实施例提供的一种消息处理方法的系统架构示意图;

图3为本说明书实施例提供的一种消息处理方法的流程示意图;

图4为本说明书实施例提供的对应于图3的一种消息处理装置的结构示意图;

图5为本说明书实施例提供的对应于图3的一种消息处理设备的结构示意图。

具体实施方式

本说明书实施例提供基于信用担保的业务处理方法、装置以及设备。

为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本说明书实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。

现有技术中,消息中间件接收的数据源头可以是商户端的业务系统,商户端的业务系统将产生的流数据存储至消息中间件,消息中间件再将存储的流数据发送至消费者端的业务系统进行处理。但是,部分消息中间件发送的消息并不能保证消息的顺序性。也就是说源头先产生的数据,在消费者端的业务系统可能后接收到,而源头后产生的数据,在消费者端的业务系统可能先接收到。

具体可以参考如下场景:

一、计算商户订单总金额的场景。

商户端的业务系统会先创建一笔金额为100元的订单,形成一条消息a,再将该订单金额更改为200元,再形成一条消息b,将消息a和b发送至消息中间件。消息中间件会依次将第一条消息a发送到消费者端的业务系统,然后将第二条消息b发送到消费者端的业务系统。消费者端的业务系统在处理的过程中会接收到两条消息。正常情况下,消费者端的业务系统先收到消息a再收到消息b,最终商户的订单金额由100元更新为200元。但是,如果在消息发送或者消费过程中,消息顺序错乱,导致消费者端的业务系统先收到消息b再收到消息a,则最终商户端的订单金额会变为100元,与实际情况不符。

二、确定用户流量来源的场景

网站的流量会有不同的来源,例如,可以包括广告联盟引流、搜索引擎引流、自然流量等来源。流量来源区分通常是根据用户第一访问页面的相关信息来确定的。例如,可以根据用户访问的第一个页面的referurl来确定。在这种场景下,如果用户的访问消息乱序,会造成流量归属错误,即流量来源错误。比如,用户d通过广告联盟引流的方式点击进入了淘宝的一个活动页面a,然后点击活动页面a中的一个商品进入商品详情页b,再购买该商品进入下单支付页面c,最终生成订单。正常情况下,页面访问顺序为页面a、页面b、页面c。根据用户访问的第一个页面的referurl来进行判断,即根据页面a的referurl来进行判断,确定这笔订单是广告联盟引流带来的效果。如果消息到达顺序乱序,最终到达的顺序是页面b、页面c、页面a,则会认为这笔订单是自然流量带来的效果,导致流量来源判断出错,影响后续的数据处理。

目前,通常的处理方式是发现消息有乱序的情况下,直接丢弃乱序的消息。例如,当前处理到的时间戳为e,新接收到的消息的时间戳是f,并且时间戳f早于时间戳e,即新接收到的消息的生成时间要早于先前接收到的消息的生成时间,则直接不处理后接收到的消息。该种处理方式,对于部分场景是试用的。例如,对于场景一中需要计算商户的订单总金额的场景是适应的,如果先收到消息b,再收到消息a,这个时候直接忽略消息a,则商户订单总金额仍然为200。但是有些场景并不适用,例如,对于场景二中确定用户流量来源的场景,直接丢弃后到的页面c和页面a的referurl,最终确定出的结果还是页面b的referurl,结果还是错误的。

因此,本申请鉴于消息乱序在流计算中对后续结果会产生的各种影响,提供了一种可以减少消息乱序的方案,提高了数据处理结果的准确性。

如图1所示,为本申请实施例提供的一种消息处理方法的系统架构示意图,该实施例可以应用在storm系统中,storm系统是一个分布式的、可靠的、容错率高的数据流处理系统。

流数据的源头是消息中间件发送的源源不断的消息,在对消息顺序强依赖的场景下,需要对接收到的消息进行处理,保证消息的顺序性。在普通的流计算场景中,为了保证消息的时效性,在接收到消息时,需要立马处理接收到的消息,这样可以保证数据的时效性。但是在判断消息是否有序的时候,不仅要考虑到当前的消息,还要根据后面接收到的消息综合进行判断。因此,为了保证消息顺序的准确性,需要在时效性上做部分让步。

在storm系统中,包括spout和bolt两种接口,spout会从外部流数据的源头(消息中间件)读取消息,然后封装成tuple形式,之后将封装好的tuple发送到stream(一个没有边界的、源源不断的、连续的tuple序列就组成了stream)中。spout接口内部有nexttuple函数,storm框架会不停的调用该函数。bolt可以接收任意多个输入的stream,并根据输入的stream对应着进行处理。

本实施例中,可以设计一个通用的排序bolt接口,接在spout之后,排序bolt后面是对应的业务处理bolt。通过通用的排序bolt,对接收到的流数据进行处理,减少了流数据中消息的乱序,提高了数据处理结果的准确性。

如图2所示,为本申请另一实施例提供的一种消息处理方法的系统架构示意图,该实施例可以应用在flink系统中,flink系统是一个针对流数据和批数据的分布式处理引擎。且其主要可以处理的场景为流数据运算的场景。

流数据的源头是消息中间件发送的源源不断的消息,在对消息顺序强依赖的场景下,需要对接收到的消息进行处理,保证消息的顺序性。在普通的流计算场景中,为了保证实时性,接收到消息时,需要立马消费接收到的消息,这样可以保证数据的时效性。但是在判断消息是否有序的时候,不仅要考虑到当前的消息,还要根据后面接收到的消息综合进行判断。因此,为了保证消息顺序的准确性,需要在时效性上做部分让步。

在flink系统中,可以包括整个处理流程的入口source、终点sink和函数function。可以设计一个通用的排序function函数,来对source接收到消息中间件发送的消息进行排序。通过排序function处理后,消息即变为有序的消息。再将消息发送至对应的业务处理模块进行处理。业务处理模块在进行处理时,不用再关心消息的有序性,只需处理具体的业务即可。减少了流数据中消息的乱序,提高了数据处理结果的准确性。

图3为本说明书实施例提供的一种消息处理方法的流程示意图,从程序角度而言,流程的执行主体可以为部署在服务器端的应用程序。图3中的流程可以包括以下步骤:

步骤301,开始第一计时,得到第一计时时长。

在整个处理流程开始时,即开始进行第一计时。第一计时可以采用计时器的方式计时。

若采用计时器的方式进行计时,在开始计时之前,分配一个线程用来启动计时器进行计时,且将启动计时器的时刻设置为该计时器的开始时刻。

步骤302,接收消息中间件发送的第一消息。

在流程开始之后,可能会收到消息中间件发送的消息。消息中间件为流数据的源头,会源源不断的发送消息至处理模块进行处理。例如,可以发送商品详情页消息至消费者端进行浏览处理,还可以发送订单支付消息至消费者端的处理模块进行支付处理。但是消息中间件并不保证消息的顺序性。即接收到的消息并不能保证是有序的,且消息到达的时刻也可能会断断续续,消息之间的间隔也是不一定的。

消息中间件有多种,可以包括但不限于timetunnel、rocketmq、kafka和rabbitmq等日志采集消息中间件,能支持实时采集消息数据,解决分布式系统之间消息的传递,提高业务的处理效率。

例如,新用户注册的场景可以使用消息中间件。注册流程可以包含三个步骤:(1)注册处理以及写入数据库;(2)发送注册成功的手机短信至用户端;(3)发送注册成功的邮件信息至用户端。假设用户注册处理以及写入数据库需要50ms,发送注册成功的手机短信至用户端需要50ms,发送注册成功的邮件信息至用户端需要50ms。

在没有使用消息中间件的时候,一般是在注册成功后,使用两个线程分别去做发送邮件至用户端和发送短信至用户端的操作,需要用时为100ms(50ms+50ms)。

如果使用消息中间件,则不用再创建线程,直接在注册成功后,发送消息给消息中间件(大约需要6ms),然后让邮件服务和短信服务自己去消息中间件里面取消息,取到消息后再做对应的业务操作。采用这种方式后,需要用时为56ms(50ms+6ms),提高了业务的处理效率。

步骤303,将所述第一消息加入到消息缓存。

在消息缓存中,按照消息到达消息缓存的时刻有序进行存储。最先到达的消息存储在缓存中位置的最前边,后到达的消息存储在前一个到达的消息所处位置的后一位置处。例如,消息缓存w中有有序的三个位置a0、a1和a2,第一个到达的消息a存储在消息缓存中的第一个位置a0处,第二个到达的消息b存储在消息缓存中的第二个位置a1处,第三个到达的消息c为第一消息,存储在消息缓存中的第三个位置a2处。

步骤304,判断所述第一计时时长是否达到第一预设时长,得到第一判断结果。

在收到新的消息时,需要先判断第一计时时长是否达到了第一预设时长t3。只有在第一计时时长达到第一预设时长时,才会去进行后续操作处理。若第一计时时长没有到达第一预设时长,则不进行后续操作处理,继续等待新的消息。直到新的消息到来时,才可以重新判断第一计时时长是否到第一达预设时长。若第一计时时长达到第一预设时长时,则进行后续操作处理,否则,继续等待新消息的到来。避免了每来一次新的消息就直接执行后续操作,提高了流程的处理效率,同时会拉长等待消息的时间,使得其可以接收尽可能多的消息,提高了消息排序的准确率。

其中,第一预设时长可以根据实际情况进行设置,可以为0-2分钟之间。具体的,可以为1分钟。

步骤305,若所述第一判断结果表示所述第一计时时长达到所述第一预设时长,则判断所述消息缓存中的目标消息生成时刻的先后顺序与在所述消息缓存中的排列顺序是否一致,得到第二判断结果,其中,所述目标消息包括所述第一消息和在所述第一消息之前加入所述消息缓存中的消息。

当第一计时时长达到第一预设时长时,代表自流程开始时,已经经过了长于或等于第一预设时长的时间。理论上认为,在这段时间内,已经有一定数量的消息存储到消息缓存中了,可以进行乱序判断了。

每个目标消息都有一个生成时刻t1,可以根据生成时刻t1确定各目标消息生成的先后顺序。其中,生成时刻t1可以以时间戳的形式存储。

每个目标消息到达消息缓存的时间为t2,可以根据到达消息缓存的时间t2确定各目标消息在消息缓存中的停留时间。其中,到达消息缓存的时间t2可以以时间戳的形式存储。

例如,继续以消息缓存w为例进行说明,第一个到达的消息a存储在消息缓存中的第一个位置a0处,第二个到达的消息b存储在消息缓存中的第二个位置a1处,第三个到达的消息c为第一消息,存储在消息缓存中的第三个位置a2处。消息a的生成时间为15:30:50,消息b的生成时间为15:30:35,消息c的生成时间为15:30:20,根据消息a、消息b和消息c的生成时间进行排序可知,消息a、消息b和消息c的生成时间先后顺序为消息c、消息b、消息a,而上述三个消息在消息缓存中的排列顺序为消息a、消息b和消息c,即消息生成时间的先后顺序与其在消息缓存中存储的排列顺序不一致。

若消息a的生成时间为15:30:20,消息b的生成时间为15:30:35,消息c的生成时间为15:30:50,根据消息a、消息b和消息c的生成时间进行排序可知,消息a、消息b和消息c的生成时间先后顺序为消息a、消息b和消息c。

目标消息为消息缓存中的所有消息,既包括之前存入消息缓存中的消息,又包括新接收到的存储到消息缓存中的消息。且不限制消息的数量,新接收到的消息可以是一个,也可以是多个。之前存入消息缓存中的消息可以是一个,也可以是多个。

步骤306,若所述第二判断结果表示所述目标消息生成时刻的先后顺序与在所述消息缓存中的排列顺序不一致,则按所述目标消息的生成时刻对所述目标消息进行排序。

仍然以消息缓存w为例进行说明,消息a的生成时刻为15:30:50,消息b的生成时刻为15:30:35,消息c的生成时刻为15:30:20。根据消息a、消息b和消息c的生成时刻进行排序可知,消息a、消息b和消息c的生成时刻先后顺序为消息c、消息b、消息a,而上述三个消息在消息缓存中的排列顺序为消息a、消息b和消息c,上述消息生成时刻的先后顺序与在消息缓存中的排列顺序不一致,则按照消息的生成时刻对消息a、消息b和消息c进行排序,排序之后的消息在消息缓存中的存储顺序为消息c在消息缓存中的第一个位置a0处,消息b在消息缓存中的第二个位置a1处,消息a在消息缓存中的第三个位置a2处。

其中,对缓存中的消息进行排序,可以选用冒泡算法、也可以选用快速排序算法等现有的算法进行排序。

若采用冒泡算法进行排序,则先将消息缓存中a0处与a1处的内容进行比较,经过比较可知,消息b的生成时间要早于消息a的生成时间,故将消息b与消息a的位置对调,然后将消息a与消息c进行比较,发现消息c的生成时间要早于消息a的生成时间,故将消息c与消息a的顺序对调,经过比较之后,生成时间最晚的消息a已经位于最末尾a2处。此时消息的排列顺序为消息b、消息c、消息a。然后再比较消息b和消息c,发现消息b的生成时间要晚于消息c的生成时间,故将消息b与消息c的顺序对调,最终排列好的顺序为消息c、消息b、消息a。

若采用快速排序算法进行排序,首先可以选择消息b,分别与消息a和消息c进行比较,消息a的生成时间晚于消息b,消息c的生成时间早于消息b,因此将消息a调至消息b的后一位,将消息c调至消息b的前一位,排序完成,最终排列好的顺序为消息c、消息b、消息a。

采用上述方案后,通过对达到预设时长的消息进行排序,使得在消息缓存中的消息都是有序的,提高了消息最终处理结果的准确性。且避免了每接收到一条消息就进行一次排序,提高了处理效率,拉长了消息的接收时间,增加了接收到的消息的数量,提高了整体消息排序结果的准确性。

基于图3的方法,本说明书实施例还提供了该方法的一些具体实施方案,下面进行说明。

在本说明书实施方式中,在所述按所述目标消息的生成时刻对所述目标消息进行排序之后,还可以包括:

确定排序之后在所述消息缓存中被缓存的时长超过第二预设时长的消息,得到消息集合。依次输出所述消息集合中的各消息。

在对消息缓存中的消息进行排序之后,因为本次排序有乱序的消息,理论上来说,下一次接收到的消息乱序的可能性比较大,所以排序之后,为了保证消息的有序性,不对消息进行输出。但是,为了避免因一直有乱序的消息存在,导致消息一直不能输出,使得消息在消息缓存中缓存的时间过长的情况出现,设置一个第二预设时长t4。第二预设时长t4的含义为消息理论上在消息缓存中停留的最大时长。每次在对乱序的消息进行排序之后,判断排序之后的消息中是否有在消息缓存中被缓存的时长超过第二预设时长的消息。其中,消息在消息缓存中被缓存的时长可以根据当前时刻和消息到达消息缓存的时刻确定。其中,t4可以根据实际情况进行设置,可以为2-5分钟。例如,可以为3分钟。

若判断出在消息缓存中有被缓存的时长超过第二预设时长的消息,得到消息集合,并依次输出消息集合中的各消息至相应的处理模块进行处理。

若判断出在消息缓存中没有被缓存的时长超过第二预设时长的消息,则不对消息进行处理。

在本说明书实施方式中,在所述按所述目标消息的生成时刻对所述目标消息进行排序之后,还可以包括:

清空所述第一计时时长。重新开始第一计时,得到新的第一计时时长。

为了避免消息过多时,每条消息都需要进行排序操作,影响整体的计算效率,可以设置一个第一预设时长。在流程开始时,即开始第一计时,得到第一计时时长。每次有消息到来时,先判断是否达到第一预设时长,达到第一预设时长了再进行后续消息是否乱序的判断。若没有达到第一预设时长,则继续等待新消息的到来。通过第一预设时长的配置,延长了等待消息到来的时长,可以将第一预设时长内到来的所有消息集中到一起进行判断,不用每次来一个消息就进行一次是否乱序的判断,提高了整体的计算效率。

在按目标消息的生成时刻对目标消息进行排序之后,可以将第一计时时长清空,重新开始第一计时,等待在新的第一预设时长的时间段内新消息的到来。

通过第一预设时长的设置,避免了每接收到一条消息就进行一次排序,提高了处理效率。同时会拉长消息接收时间,提高了消息接收数量,保证了最终消息排序的准确性。

其中,在按目标消息的生成时刻对目标消息进行排序之后,在清空第一计时时长之前,还可以包括确定排序之后在所述消息缓存中被缓存的时长超过第二预设时长的消息,得到消息集合。依次输出所述消息集合中的各消息。

此外,在按目标消息的生成时刻对目标消息进行排序之后,在清空第一计时时长之前,不用每次都执行确定排序之后在所述消息缓存中被缓存的时长超过第二预设时长的消息的操作。可以根据实际情况中乱序的消息数量进行调节。若乱序的消息较少,不用一直进行排序,消息输出比较及时,则可以降低确定排序之后在所述消息缓存中被缓存的时长超过第二预设时长的消息的操作步骤的频率。例如,可以排序两到三次之后,再执行确定排序之后在所述消息缓存中被缓存的时长超过第二预设时长的消息的操作。若乱序的消息较多,一直在进行排序,消息输出不及时,可以在每次排序完成后,在清空第一计时时长之前,都执行一次确定排序之后在消息缓存中被缓存的时长超过第二预设时长的消息的操作。

其中,清空第一计时时长的方式有两种。

第一种,可以将第一计时清零,重新开始第一计时。例如,从00:00的时候开始第一计时,当第一计时为01:00时,第一计时时长达到预设的第一预设时长1分钟了,将第一计时清零,从00:00重新开始第一计时,得到新的第一计时时长。直到第一计时又达到01:00时,第一计时时长又达到预设的第一预设时长1分钟了,重新将第一计时清零,从00:00开始新的计时,如此循环清空第一计时时长,进行计时。

第二种,不将第一计时清零,在第一计时的基础上继续进行计时,但是第一计时时长是从继续进行计时的时刻重新开始计算的。例如,从00:00的时候开始第一计时,当第一计时为01:00时,第一计时时长达到预设的第一预设时长1分钟了,此时,将第一计时时长清零。然后,将01:00作为新的第一计时时长开始时刻进行计时,当第一计时达到02:00时,用02:00减去01:00得到新的第一计时时长,当新的第一计时时长又重新达到预设的第一预设时长1分钟时,继续将第一计时时长清零,然后接着02:00继续进行计时。

在一条消息存储到消息缓存中之后,可能当前排序发现没有乱序,将消息直接输出了,但是下一条消息到来之后,发现跟输出的消息存在乱序的情况,但是消息已经输出了,就不能在进行排序了,为了减少这种情况出现,在一条消息存储到消息缓存中时,最好保证该消息在消息缓存中存储足够长的时间。

因此,若所述第二判断结果表示所述目标消息的生成时刻的先后顺序与在所述消息缓存中的排列顺序一致,可以输出所述目标消息中在所述消息缓存中被缓存的时长超过所述第一预设时长的消息,即在消息缓存中被缓存的时长超过t3时长的消息,保证了消息在消息缓存中存储一段时间,提高了消息排序的准确性。

此外,还可以输出排序之后前预设数量条消息。对于消息缓存中后边几条消息和以后新来的消息可能会存在乱序的情况,在消息缓存中的消息不用进行排序时,也不是将消息缓存中的消息全部输出,而是输出目标消息中前预设数量条消息,使得消息可以在消息缓存中等待一段时间再输出,也保证了消息在消息缓存中可以存储一段时间,提高了消息排序的准确性。

其中,前预设数量条消息可以根据实际情况进行设置。例如,可以为第一条消息。也可以为前1-3条消息。还可以根据消息缓存中实际的消息数量输出前三分之一条消息。例如,消息缓存中有9条消息,则输出前三条消息。若消息缓存中有10条消息,则可以默认输出前四条消息。当然,本实施例只是具体的举例说明,其他输出条数和输出方式的实施例也在本方案的保护范围之内。

此外,消息经过排序处理之后,最小的时间延迟为第一预设时长。即所有在第一预设时长内到达的消息与消息缓存中本来存储的消息是有序的,不用进行排序。在第一预设时长刚开始时,就接收到了新的消息,且第一预设时长刚结束时,又接收到了新的消息。此时,在第一预设时长内第一预设时长刚开始时接收到的消息的延迟最小,为第一预设时长。即第一预设时长也为最小的时间延迟。

在本说明书实施方式中,每条消息均携带身份标识,所述身份标识用于表示消息所属的用户,所述第一消息携带第一身份标识,所述将所述第一消息加入到消息缓存,具体可以包括:

判断现有的消息缓存中是否存在包括所述第一身份标识的消息,得到第三判断结果。

若所述第三判断结果表示现有的消息缓存中存在包括所述第一身份标识的消息,则将所述第一消息加入到存在包括所述第一身份标识的消息对应的消息缓存中。

在本说明书实施方式中,还可以包括:

若所述第三判断结果表示现有的消息缓存中不存在包括所述第一身份标识的消息,则申请新的缓存。

将所述第一消息加入到新申请的缓存中。

其中,消息的身份标识用于表示消息所属的用户,具有同一身份标识的消息属于同一用户,具有不同身份标识的消息属于不同的用户。若消息属于同一用户,可以将消息放置在一个消息缓存中。若消息不属于同一个用户,可以将属于不同用户的消息放置在不同的消息缓存中。同一用户的消息之间可能存在关联,将同一用户的消息放置在一个消息缓存中,并且将消息按顺序排列,在对消息进行处理时,可以直接在同一个缓存中进行消息的提取,提高了消息的处理效率。

例如,在一个网站中有几万个用户,可以对每个用户的消息进行处理。例如,用户a在第一次访问时,根据访问消息中用户a的身份标识判断之前有没有用户a的访问记录消息。若没有,则用户a需要先进行注册,注册成功之后,会为用户a分配一个新的消息缓存。此后,当新接收到携带用户a的身份标识的消息时,将新接收到的消息存储到为用户a分配的消息缓存中。

此外,身份标识的形式可以有多种,可以为数字、大写字母、小写字母或者前边几个相结合产生的字符。

在本说明书实施方式中,还可以包括:

在对所述第一计时时长开始计时的同时,开始第二计时,得到第二计时时长。

判断所述第二计时时长是否达到第三预设时长,得到第四判断结果。

若所述第四判断结果表示所述第二计时时长达到所述第三预设时长,判断所述消息缓存中是否有在所述消息缓存中被缓存的时长超过所述第二预设时长的消息,得到第五判断结果。

若所述第五判断结果表示所述消息缓存中有在所述消息缓存中被缓存的时长超过所述第二预设时长的消息,则根据消息的生成时刻有序输出在所述消息缓存中被缓存的时长超过所述第二预设时长的消息。

其中,上述实施方式中大部分操作是以消息驱动来进行处理的。对于流计算来说,基于消息驱动来进行处理,可以在有消息的时候直接就进行处理,不用再额外的进行等待,便于后续流程更快的获取到消息进行处理,提高了整体流程的处理效率。但是,还可能会存在一些问题,例如,判断所述第一计时时长是否达到第一预设时长,得到第一判断结果时,需要在新消息到来时,才会去判断。若一直没有新消息到来,就一直不会去进行判断。假设有几条消息到来之后,存储到了消息缓存中之后,一直没有接收到新的消息,就不会触发上述判断第一计时时长是否达到第一预设时长的操作,导致消息一直存储在消息缓存中输不出来,造成较大的消息延迟。或者相邻的消息相隔的时间比较远,前一条消息到来之后,后一条消息很久之后才能到来,一直等待也会造成较大的消息延迟。

为了避免上述情况出现,现引入定时器机制。设置一个第三预设时长t5,在流程开始处理时开始计时。即在首次计时时,在第一计时时长开始第一计时时,也开启另一计时器开始第二计时,得到第二计时时长。为避免有消息在消息缓存中存储的时间过长,每隔一个第三预设时长,就判断一次在消息缓存中是否有被缓存的时长超过第二预设时长的消息,若判断出有被缓存的时长超过第二预设时长的消息,则将该消息输出。如此循环进行判断,保证了消息可以及时输出,避免了因一直没有消息到来,导致消息长时间缓存在缓存中的情况出现。

在进行判断时,可以先将消息缓存中的消息进行排序,方便后续是否是超时消息的判断和有消息在缓存中超时时消息的有序输出。

其中,第三预设时长可以根据实际情况进行设置,可以设置为2-5分钟。例如,在一个具体实施方式中,可以为3分钟。

第二预设时长t4的含义为消息理论上在消息缓存中停留的最大时长。所以,此处,也以第二预设时长t4为判断标准,判断在消息缓存中是否有被缓存的时长超过第二预设时长的消息,若有,则将该消息输出。

在本说明书实施方式中,在根据消息的生成时刻有序输出到达所述消息缓存的时长超过所述第二预设时长的消息之后,还可以包括:

清空所述第二计时时长。重新开始第二计时,得到新的第二计时时长。

即每隔一个第三预设时长就去判断一次在消息缓存中是否有被缓存的时长超过第二预设时长的消息,避免了因长时间没有接收到新消息时,导致消息一直存储在消息缓存中不能输出,造成较大的消息处理延迟,影响后续业务的操作处理。

基于同样的思路,本说明书实施例还提供了上述方法对应的装置,如图4所示。

图4为本说明书实施例提供的对应于图3的一种消息处理装置的结构示意图,所述装置可以包括:

第一计时模块401,用于开始第一计时,得到第一计时时长。

接收模块402,用于接收消息中间件发送的第一消息。

加入模块403,用于将所述第一消息加入到消息缓存。

第一判断模块404,用于判断所述第一计时时长是否达到第一预设时长,得到第一判断结果。

第二判断模块405,用于若所述第一判断结果表示所述第一计时时长达到所述第一预设时长,则判断所述消息缓存中的目标消息生成时刻的先后顺序与在所述消息缓存中的排列顺序是否一致,得到第二判断结果,其中,所述目标消息包括所述第一消息和在所述第一消息之前加入所述消息缓存中的消息。

排序模块406,用于若所述第二判断结果表示所述目标消息生成时刻的先后顺序与在所述消息缓存中的排列顺序不一致,则按所述目标消息的生成时刻对所述目标消息进行排序。

可选地,在所述排序模块406之后,还可以包括:

确定模块,用于确定排序之后在所述消息缓存中被缓存的时长超过第二预设时长的消息,得到消息集合。

第一输出模块,用于依次输出所述消息集合中的各消息。

可选地,在所述排序模块406之后,还可以包括:

清空模块,用于清空所述第一计时时长。

重新计时模块,用于重新开始第一计时,得到新的第一计时时长。

可选地,所述装置还可以包括:

第二输出模块,用于若所述第二判断结果表示所述目标消息的生成时刻的先后顺序与在所述消息缓存中的排列顺序一致,则输出所述目标消息中在所述消息缓存中被缓存的时长超过所述第一预设时长的消息。

可选地,所述装置还可以包括:

第二计时模块,用于在对所述第一计时时长开始计时的同时,开始第二计时,得到第二计时时长。

第三判断模块,用于判断所述第二计时时长是否达到第三预设时长,得到第四判断结果。

第四判断模块,用于若所述第四判断结果表示所述第二计时时长达到所述第三预设时长,判断所述消息缓存中是否有在所述消息缓存中被缓存的时长超过所述第二预设时长的消息,得到第五判断结果。

第三输出模块,用于若所述第五判断结果表示所述消息缓存中有在所述消息缓存中被缓存的时长超过所述第二预设时长的消息,则根据消息的生成时刻有序输出在所述消息缓存中被缓存的时长超过所述第二预设时长的消息。

可选地,每条消息均携带身份标识,所述身份标识用于表示消息所属的用户,所述第一消息携带第一身份标识,所述加入模块403,具体可以包括:

第五判断单元,用于判断现有的消息缓存中是否存在包括所述第一身份标识的消息,得到第三判断结果。

第一加入单元,用于若所述第三判断结果表示现有的消息缓存中存在包括所述第一身份标识的消息,则将所述第一消息加入到存在包括所述第一身份标识的消息对应的消息缓存中。

可选地,所述装置还可以包括:

申请单元,用于若所述第三判断结果表示现有的消息缓存中不存在包括所述第一身份标识的消息,则申请新的缓存。

第二加入单元,用于将所述第一消息加入到新申请的缓存中。

可选地,在所述第三输出模块之后,还包括:

清空单元,用于清空所述第二计时时长。

计时单元,用于重新开始第二计时,得到新的第二计时时长。

基于同样的思路,本说明书实施例还提供了上述方法对应的设备和非易失性计算机存储介质。

如图5所示,本说明书实施例提供的对应于图3的一种消息处理设备500,包括:

至少一个处理器510;以及,

与所述至少一个处理器510通信连接的存储器530;其中,

所述存储器530存储有可被所述至少一个处理器执行的指令520,所述指令520被所述至少一个处理器510执行,以使所述至少一个处理器510能够:

开始第一计时,得到第一计时时长。

接收消息中间件发送的第一消息。

将所述第一消息加入到消息缓存。

判断所述第一计时时长是否达到第一预设时长,得到第一判断结果。

若所述第一判断结果表示所述第一计时时长达到所述第一预设时长,则判断所述消息缓存中的目标消息生成时刻的先后顺序与在所述消息缓存中的排列顺序是否一致,得到第二判断结果,其中,所述目标消息包括所述第一消息和在所述第一消息之前加入所述消息缓存中的消息。

若所述第二判断结果表示所述目标消息生成时刻的先后顺序与在所述消息缓存中的排列顺序不一致,则按所述目标消息的生成时刻对所述目标消息进行排序。

上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、设备、非易失性计算机存储介质实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

本说明书实施例提供的装置、设备、非易失性计算机存储介质与方法是对应的,因此,装置、设备、非易失性计算机存储介质也具有与对应方法类似的有益技术效果,由于上面已经对方法的有益技术效果进行了详细说明,因此,这里不再赘述对应装置、设备、非易失性计算机存储介质的有益技术效果。

在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(programmablelogicdevice,pld)(例如现场可编程门阵列(fieldprogrammablegatearray,fpga))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片pld上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logiccompiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(hardwaredescriptionlanguage,hdl),而hdl也并非仅有一种,而是有许多种,如abel(advancedbooleanexpressionlanguage)、ahdl(alterahardwaredescriptionlanguage)、confluence、cupl(cornelluniversityprogramminglanguage)、hdcal、jhdl(javahardwaredescriptionlanguage)、lava、lola、myhdl、palasm、rhdl(rubyhardwaredescriptionlanguage)等,目前最普遍使用的是vhdl(very-high-speedintegratedcircuithardwaredescriptionlanguage)与verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。

控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(applicationspecificintegratedcircuit,asic)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:arc625d、atmelat91sam、microchippic18f26k20以及siliconelabsc8051f320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。

上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。

为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本说明书时可以把各单元的功能在同一个或多个软件和/或硬件中实现。

本领域内的技术人员应明白,本说明书实施例可提供为方法、系统、或计算机程序产品。因此,本说明书实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本说明书实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本说明书是参照根据本说明书实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。

还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。

本领域技术人员应明白,本说明书实施例可提供为方法、系统或计算机程序产品。因此,本说明书可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本说明书可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本说明书可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

以上所述仅为本说明书实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

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