消息消费、消息分发方法、装置、服务器及存储介质与流程

文档序号:25543520发布日期:2021-06-18 20:40
消息消费、消息分发方法、装置、服务器及存储介质与流程

本发明实施例涉及计算机应用技术领域,尤其涉及一种消息消费、消息分发方法、装置、服务器及存储介质。



背景技术:

为了提高物品获取量,越来越多的电子商务平台间存在对接关系,即用户可以从某个电子商务平台上获取到与其存在对接关系的另一电子商务平台上的物品,此时,两个电子商务平台间针对一次物品获取任务中的各物品获取状态会采用异步消息来同步。

由于一次物品获取任务中的各种物品获取状态的生产过程是存在顺序的,那么电子商务平台需要按照物品获取状态的生产顺序对其依次进行消费。目前主要是采用消息应答机制来达到顺序消费的目的,即某个电子商务平台在接收到另一电子商务平台发送的已对前一消息处理完毕的反馈后,再向其发送下一消息,循环往复,直至本次的物品获取任务中全部的消息处理完毕。

在实现本发明的过程中,发明人发现现有技术中存在以下技术问题:因为大部分的时间都在等待反馈、网络波动和/或消息未处理成功导致无法收到反馈等等原因,现有技术的吞吐量较低。



技术实现要素:

本发明实施例提供了一种消息消费、消息分发方法、装置、服务器及存储介质,以实现待消费消息的高吞吐的顺序消费的效果。

第一方面,本发明实施例提供了一种消息消费方法,应用于消费服务器,该方法可以包括:

确定分发服务器的各分区中与消费服务器一一对应的目标分区,并从目标分区中获取待消费消息,确定待消费消息的消息标识,其中消息标识表示待消费消息所属的消息消费任务,且分发服务器是根据消息标识将待消费消息分发到目标分区上的;

根据消息标识从消费服务器的各内存队列中确定出目标内存队列,并将待消费消息发送给目标内存队列;

确定消费服务器的各线程中与目标内存队列一一对应的目标线程,基于目标线程对目标内存队列中的待消费消息进行消费。

第二方面,本发明实施例还提供了一种消息分发方法,应用于分发服务器,该方法可以包括:

接收生产服务器生产后推送的待消费消息,并确定待消费消息的消息标识,其中消息标识表示待消费消息所属的消息消费任务;

根据消息标识从分发服务器的各分区中确定出目标分区,将待消费消息分发到目标分区上,以使与目标分区一一对应的消费服务器将从目标分区中获取到的待消费消息发送给根据消息标识从各内存队列中确定出的目标内存队列,并基于各线程中与目标内存队列一一对应的目标线程对待消费消息进行消费。

第三方面,本发明实施例还提供了一种消息消费装置,配置于消费服务器,该装置可以包括:

第一消息标识确定模块,用于确定分发服务器的各分区中与消费服务器一一对应的目标分区,并从目标分区中获取待消费消息,确定待消费消息的消息标识,其中消息标识表示待消费消息所属的消息消费任务,且分发服务器是根据消息标识将待消费消息分发到目标分区上的;

待消费消息发送模块,用于根据消息标识从消费服务器的各内存队列中确定出目标内存队列,并将待消费消息发送给目标内存队列;

待消费消息消费模块,用于确定消费服务器的各线程中与目标内存队列一一对应的目标线程,基于目标线程对目标内存队列中的待消费消息进行消费。

第四方面,本发明实施例还提供了一种消息分发装置,配置于分发服务器,该装置可以包括:

第二消息标识确定模块,用于接收生产服务器生产后推送的待消费消息,并确定待消费消息的消息标识,消息标识表示待消费消息所属的消息消费任务;

待消费消息分发模块,用于根据消息标识从分发服务器的各分区中确定出目标分区,将待消费消息分发到目标分区上,以使与目标分区一一对应的消费服务器将从目标分区中获取到的待消费消息发送给根据消息标识从各内存队列中确定出的目标内存队列,并基于各线程中与目标内存队列一一对应的目标线程对待消费消息进行消费。

第五方面,本发明实施例还提供了一种消费服务器,可以包括:

一个或多个处理器;

存储器,用于存储一个或多个程序;

当一个或多个程序被一个或多个处理器执行,使得一个或多个处理器实现本发明任意实施例所提供的消息消费方法。

第六方面,本发明实施例还提供了一种分发服务器,可以包括:

一个或多个处理器;

存储器,用于存储一个或多个程序;

当一个或多个程序被一个或多个处理器执行,使得一个或多个处理器实现本发明任意实施例所提供的消息分发方法。

第七方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现本发明任意实施例所提供的消息消费方法或是消息分发方法。

本发明实施例的技术方案,由于分发服务器中每个分区内的各待消费消息是由该分发服务器根据各自的消息标识将它们分发到该分区上的消息,该消息标识可以表示该待消费消息所属的消息消费任务,因此,消费服务器可以从各分区中确定出与自身一一对应的目标分区,并从该目标分区中获取待消费消息,以使隶属于同一消息消费任务的各待消费消息可以被同一消费服务器获取到;针对每个待消费消息,消费服务器可以根据其的消息标识从自身的各内存队列中确定出目标内存队列,并将待消费消息发送给该目标内存队列,以使隶属于同一消息消费任务的各个待消费消息可以被发送到同一内存队列;进而,消费服务器可以确定自身的各线程中与该目标内存队列一一对应的目标线程,基于目标线程对该目标内存队列中的待消费消息进行消费,以使属于同一消息消费任务的各待消费消息可以被同一线程消费。上述技术方案,消费服务器根据各待消费消息的消息标识对它们进行拆分,以使隶属于同一消息消费任务的各待消费消息可以进入到同一分区、同一消费服务器内同一内存队列,进而被同一线程消费,由此保证了它们的消费顺序;与此同时,消费服务器从与自身对应的目标分区中获取到被拆分到该目标分区中的待消费消息,并且将获取到的各待消费消息分别拆分到相应的线程中进行消费,多分区多线程的应用达到了高吞吐的效果。

附图说明

图1是本发明实施例一中的一种消息消费方法的流程图;

图2是本发明实施例二中的一种消息消费方法的流程图;

图3是本发明实施例三中的一种消息分发方法的流程图;

图4是本发明实施例三中的一种消息分发方法中可选示例的示意图;

图5是本发明实施例四中的一种消息消费装置的结构框图;

图6是本发明实施例五中的一种消息分发装置的结构框图;

图7是本发明实施例六中的一种消费服务器的结构示意图;

图8是本发明实施例七中的一种分发服务器的结构示意图。

具体实施方式

下面结合附图和实施例对本发明作进一步详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。

在介绍本发明实施例之前,先对本发明实施例的应用场景进行示例性说明:以在公众号或者h5页面上对接第三方生鲜平台的应用场景为例,双方之间的订单状态会采用异步消息来同步。需要说明的是,一方面,属于同一订单的各订单状态之间是存在生产顺序的,比如创建状态、待支付状态、已支付状态、已发货状态、配送中状态和已收货状态是依次生产的订单状态,那么这些订单状态的消费过程也是要依据它们各自的生产顺序进行消费,比如消费者一定要保证先消费待支付状态才能消费已支付状态,正确的消费顺序是订单有效进行的前提条件;另一方面,公众号和h5页面所在的生产服务器和第三方生鲜平台所在的消费服务器通常是由不同的开发方进行开发的服务器,那么为了保证二者的开发过程互不影响,此处采用了异步消息进行消息同步。

在此基础上,针对需要采用异步消息来同步存在顺序的各消息的应用场景,为了既可以保证消息的顺序消费又可以实现高吞吐的效果,本发明各个实施例提出了下述消息消费方法和消息分发方法。

实施例一

图1是本发明实施例一中提供的一种消息消费方法的流程图。本实施例可适用于保证属于同一消息消费任务的各个待消费消息按照生产顺序依次消费的情况,尤其适用于在保证属于同一消息消费任务的各待消费消息按照生产顺序依次消费的同时,实现高吞吐的情况。该方法可以由本发明实施例提供的消息消费装置来执行,该装置可以由软件和/或硬件的方式实现,该装置可以集成在消费服务器上。

参见图1,本发明实施例的方法具体包括如下步骤:

s110、确定分发服务器的各分区中与消费服务器一一对应的目标分区,并从目标分区中获取待消费消息,确定待消费消息的消息标识,其中,消息标识表示待消费消息所属的消息消费任务,且分发服务器是根据消息标识将待消费消息分发到目标分区上的。

其中,生产服务器可以是用于生产待消费消息的服务器,即生产者所在的服务器,其可以将自身生产的待消费消息发送到分发服务器上。在此基础上,分发服务器可以是用于将生产服务器发送过来的待消费消息分发到相应的分区(partition)上的服务器,即消息队列所在的服务器,而由至少两个分发服务器构成的集群可以称为消息集群,在本发明实施例的应用场景中,其也可以称为异步消息集群。在实际应用中,可选的,分区可以是某主题(topic)下的分区,而各待消费消息可以是均隶属于同一topic下的消息。具体的,分发服务器可以根据待消费消息的消息标识将该待消费消息分发到相应的分区上,其中,消息标识可以表示该待消费消息隶属于哪个消息消费任务,由此使得属于同一消息消费任务的各待消费消息均被分发到同一分区上,以便对这些待消费消息进行分堆处理。换言之,当隶属于同一消息消费任务的各待消费消息顺序到达分发服务器后,由于这些待消费消息的消息标识相同,分发服务器可以将它们分发到同一分区上,以便由同一消费服务器对这些待消费消息进行消费。

消费服务器可以是用于从分区中读取待消费消息,并对该待消费消息进行消费的服务器。为了保证属于同一消息消费任务的各待消费消息的顺序消费,每个消费服务器均可以存在与其一一对应的分区,这使得该分区内的属于同一消息消费任务的各待消费消息可以被同一消费服务器读取到。在实际应用中,可选的,分发服务器中分区的数量和消费服务器的数量相同,各分区和各消费服务器间存在一一对应的关系。因此,针对每个消费服务器,其可以确定分发服务器的各分区中与消费服务器一一对应的目标分区,并从该目标分区中获取待消费消息。与此同时,消费服务器还可以确定该待消费消息的消息标识。

在实际应用中,可选的,结合到本发明实施例可能涉及到的应用场景,待消费消息可以包括物品获取任务中的物品获取状态,该物品获取状态可以包括创建状态、待支付状态、已支付状态、已发货状态、配送中状态和已收货状态中的至少一个,这些物品获取状态是存在消费顺序的状态。在此基础山,上述消息消费任务可以理解为对某个物品获取任务中的各物品获取状态进行消费的任务。

s120、根据消息标识从消费服务器的各内存队列中确定出目标内存队列,并将待消费消息发送给目标内存队列。

其中,当隶属于同一消息消费任务的各待消费消息按照生产顺序依次到达消费服务器后,为了保证这些待消费消息的消费顺序,需要令它们进入到同一内存队列中并且被同一线程消费。在此基础上,考虑到消费服务器获取到的待消费消息可能来源于不同的消息消费任务,据此,针对每个待消费消息,消费服务器可以根据其的消息标识从自身的各内存队列中确定出目标内存队列,该目标内存队列可以是专门用于处理该消息标识对应的各待消费消息的内存队列;进而,消费服务器可以将该待消费消息发送给该目标内存队列,此时,隶属于同一消息消费任务中的各待消费消息进入到了同一个内存队列中。

s130、确定消费服务器的各线程中与目标内存队列一一对应的目标线程,基于目标线程对目标内存队列中的待消费消息进行消费。

其中,正如上文所述,为了保证属于同一消息消费任务中的待消费消息的消费顺序,需要令它们进入到同一内存队列中且被同一线程消费,目前,这些待消费消息已经被发送到同一内存队列中,那么为了保证它们可以被同一线程消费,各内存队列和各线程之间可以存在一一对应的关系,即消费服务器内的内存队列的数量可以根据该消费服务器内的线程的数量设置,而该线程的数量可以根据该消费服务器的性能和业务需求设置。

据此,针对待消费消息所在的目标内存队列,消费服务器可以从自身的各线程中确定出与该目标内存队列一一对应的目标线程,进而基于该目标线程对该目标内存队列中的待消费消息进行消费,由此实现了同一消息消费任务中的各待消费消息被同一线程消费的效果。

本发明实施例的技术方案,由于分发服务器中每个分区内的各待消费消息是由该分发服务器根据各自的消息标识将它们分发到该分区上的消息,该消息标识可以表示该待消费消息所属的消息消费任务,因此,消费服务器可以从各分区中确定出与自身一一对应的目标分区,并从该目标分区中获取待消费消息,以使隶属于同一消息消费任务的各待消费消息可以被同一消费服务器获取到;针对每个待消费消息,消费服务器可以根据其的消息标识从自身的各内存队列中确定出目标内存队列,并将待消费消息发送给该目标内存队列,以使隶属于同一消息消费任务的各个待消费消息可以被发送到同一内存队列;进而,消费服务器可以确定自身的各线程中与该目标内存队列一一对应的目标线程,基于目标线程对该目标内存队列中的待消费消息进行消费,以使属于同一消息消费任务的各待消费消息可以被同一线程消费。上述技术方案,消费服务器根据各待消费消息的消息标识对它们进行拆分,以使隶属于同一消息消费任务的各待消费消息可以进入到同一分区、同一消费服务器内同一内存队列,进而被同一线程消费,由此保证了它们的消费顺序;与此同时,消费服务器从与自身对应的目标分区中获取到被拆分到该目标分区中的待消费消息,并且将获取到的各待消费消息分别拆分到相应的线程中进行消费,多分区多线程的应用达到了高吞吐的效果。

实施例二

图2是本发明实施例二中提供的一种消息消费方法的流程图。本实施例以上述各技术方案为基础进行优化。在本实施例中,可选的,根据消息标识从消费服务器的各内存队列中确定出目标内存队列,可包括:基于预先设置的负载均衡策略对消息标识进行处理,得到处理标识;获取消费服务器的各内存队列的队列数量,根据处理标识和队列数量从各内存队列中确定出目标内存队列。其中,与上述各实施例相同或相应的术语的解释在此不再赘述。

参见图2,本实施例的方法具体可以包括如下步骤:

s210、确定分发服务器的各分区中与消费服务器一一对应的目标分区,并从目标分区中获取待消费消息,确定待消费消息的消息标识,其中,消息标识表示待消费消息所属的消息消费任务,且分发服务器是根据消息标识将待消费消息分发到目标分区上的。

s220、基于预先设置的负载均衡策略对消息标识进行处理,得到处理标识。

其中,负载均衡策略可以是预先设置的用于将将负载(即工作任务)进行平衡、分摊到多个操作单元上进行运行的策略。结合本发明实施例可能涉及到的应用场景,具体的,负载均衡策略可以是用于对各消息标识进行处理,或者可以称为对各消息标识进行扰动,以使由此得到的各消息标识分别对应的处理标识尽可能呈现正态分布(即均衡分布)的策略,其在与后续步骤相互配合时,可以令各待消费消息尽可能均衡分布到各内存队列中,以便充分利用每个内存队列,即充分利用消费服务器上的各个资源,在最大程度上提高吞吐量。

s230、获取消费服务器的各内存队列的队列数量,根据处理标识和队列数量从各内存队列中确定出目标内存队列,并将待消费消息发送给目标内存队列。

其中,在提高吞吐量的同时,还需要保证隶属于同一消息消费任务的各待消费消息可以被发送到同一内存队列中,此时,可以获取消费服务器的各内存队列的队列数量,根据该队列数量和扰动后的处理标识确定相应的待消费消息可以被发送到哪个内存队列中,即确定出与该待消费消息具有同一处理标识的其余的待消费消息已经被发送到哪个内存队列中,以便将该待消费消息也发送到这个内存队列(即目标内存队列)中,以使隶属于同一消息消费任务的各待消费消息可以被发送到同一内存队列中。

s240、确定消费服务器的各线程中与目标内存队列一一对应的目标线程,基于目标线程对目标内存队列中的待消费消息进行消费。

本发明实施例的技术方案,通过预先设置的负载均衡策略对消息标识进行处理后得到处理标识,各待消费消息的处理标识的分布趋势较为均衡;进而,根据消费服务器的各内存队列的队列数量和被打散的处理标识从各内存队列中确定出目标内存队列,该目标内存队列是具有同一处理标识的各待消费消息待被发送到的内存队列,由此达到了各待消费消息的负载均衡且隶属于同一消息消费任务的各待消费消息被发送到同一内存队列的效果。

一种可选的技术方案,基于预先设置的负载均衡策略对消息标识进行处理,得到处理标识,可以包括:对消息标识进行映射,得到预设位数的数字类型的映射标识;将预设位数的一半更新为预设位数,并基于预设位数对映射标识进行位移,得到位移标识;将映射标识和位移标识进行异或处理,得到处理标识。

其中,由于各待消费消息的消息标识不一定是连续的标识,示例性,假设内存队列的队列数量是3,某些消息标识是1、4、7,并且未存在2、3、5、6,此时如果直接根据队列数量和消息标识确定目标内存队列,那么有可能将全部的消息标识对应的待消费消息全部分布到第1个内存队列中,即将第1个内存队列作为与全部的消息标识均对应的目标内存队列,此时明显存在负载不均衡的问题。为了解决这一问题,可以对消息标识进行映射,得到预设位数的数字类型的映射标识,预设位数的具体设置与具体的映射方式有关;将预设位数除以2的结果作为预设位数,基于该预设位数对映射标识进行位移,由此得到的位移标识是在位移上进行了扰动的标识;将映射标识和位移标识进行异或处理,即将映射标识中的高位和低位进行异或处理,从而打散了各个消息标识在内存队列上的分布,达到了在预设位数上的负载均衡的效果。

为了更好地理解上述技术方案的实现过程,在此以hashcode()函数为具体的映射方式为例,对其进行示例性的说明。通过调用hashcode()函数来将消息标识映射为32位的数字类型的散列值h,即h=hashcode(消息标识);其中,hashcode函数可以把任意长度的输入(又称为预映射,pre-maping)通过散列算法变换成固定长度的输出,该输出就是散列值。将h右移16位,该16位是32位的一半,再与h进行异或操作,即将h中的高位的16位和低位的16位进行异或操作,即m=h^(h>>>16),从而打散了消息标识在内存队列上的分布,达到负载均衡的效果,即在32位的数值上基本呈现出正态分布。

一种可选的技术方案,根据处理标识和队列数量从各内存队列中确定出目标内存队列,可以包括:对队列数量进行减一操作,得到减一数量,并将减一数量和处理标识进行与操作,得到队列编号;或是,将队列数量和处理标识进行取模操作,得到队列编号;将各内存队列中与队列编号对应的内存队列作为目标内存队列。其中,每个内存队列均具有各自的队列编号,确定各内存队列中的目标内存队列的过程也可以理解为确定目标内存队列的队列编号的过程。据此,队列编号的确定过程可以是对队列数量进行减一操作,得到减一数量,并将减一数量和处理标识进行与操作后得到队列编号。需要说明的是,由于与操作相当于取模操作,那么队列编号的确定过程还可以是将队列数量和处理标识进行取模操作后得到队列编号。相对于取模操作,与操作在计算机实现过程中更为简单。进而,将各内存队列中与队列编号对应的内存队列作为目标内存队列,由此达到了目标内存队列的准确确定的效果,而且被发送到该目标内存队列中的各待消费消息均是属于同一消息消费任务中的消息。

为了更好地理解上述技术方案的实现过程,在此继续以上述例子为例,对其进行示例性的说明。假设内存队列的队列数量n,将m与(n-1)进行与操作,得到队列编号i,即i=(n-1)&m,进而将i对应的内存队列作为目标内存队列,由此保证了属于同一消息消费任务中的各待消费消息进入了同一内存队列中。

综上所述,i=(n-1)&(hashcode(消息标识)^(hashcode(消息标识)>>>16)),由此实现了负载均衡和属于同一消息消费任务中的各待消费消息进入了同一内存队列中的效果。当然,还可以在其余的负载均衡策略的基础上来进行相应的属于同一消息消费任务中的各待消费消息进入了同一内存队列中的确定性的改造,在此未做具体限定。

实施例三

图3是本发明实施例三中提供的一种消息分发方法的流程图。本实施例可适用于保证属于同一消息消费任务的各个待消费消息被分发到分发服务器中的同一分区中的情况,尤其适用于保证属于同一消息消费任务的各个待消费消息被分发到分发服务器中的同一分区中,并且保证它们在消费服务器中按照各自的生产顺序依次的高吞吐消费的情况。该方法可以由本发明实施例提供的消息分发装置来执行,该装置可以由软件和/或硬件的方式实现,该装置可以集成在分发服务器上。

参见图3,本发明实施例的方法具体包括如下步骤:

s310、接收生产服务器生产后发送的待消费消息,并确定待消费消息的消息标识,其中消息标识表示待消费消息所属的消息消费任务。

其中,生产服务器可以是用于生产待消费消息的服务器,即生产者所在的服务器,其可以将自身生产的待消费消息发送到分发服务器上。分发服务器在接收到该待消费消息后,可以确定用于表示该待消费消息所属的消息消费任务的消息标识。

s320、根据消息标识从分发服务器的各分区中确定出目标分区,将待消费消息分发到目标分区上,以使与目标分区一一对应的消费服务器将从目标分区中获取到的待消费消息发送给根据消息标识从各内存队列中确定出的目标内存队列,并基于各线程中与目标内存队列一一对应的目标线程对待消费消息进行消费。

其中,在实际应用中,分区(partition)可以是某主题(topic)下的分区,而各待消费消息可以是均属于同一topic下的消息。分发服务器根据待消费消息的消息标识可以将该待消费消息分发到相应的分区上,该相应的分区可以是各分区中与该消息标识对应的目标分区,由此使得隶属于同一消息消费任务的各待消费消息均可被分发到同一分区上,以便对这些待消费消息进行分堆处理。换言之,当隶属于同一消息消费任务的各待消费消息顺序到达分发服务器后,由于这些待消费消息的消息标识相同,分发服务器可以将它们分发到同一分区,以便由同一消费服务器对这些待消费消息进行消费。该消费服务器的消息消费过程已在上述各实施例中进行详细说明,在此不再赘述。

需要说明的是,分发服务器可以理解为消息队列所在的服务器,而该消息队列可以为mq。由至少两个分发服务器构成的集群可以称为消息集群,在本发明实施例的应用场景中,其也可以称为异步消息集群。该消息集群可以是高可用的消息集群,即其中可以包括主分发服务器和从分发服务器,主分发服务器的数量可以是至少一个,并且从分发服务器的数量也可以是至少一个。生产服务器在向该消息集群发送待消费消息时,其可以向其中的至少一个分发服务器上发送,而且每个分发服务器上均可以设置有用于记载每台分发服务器分别存储有哪些待消费消息的目录,由此,消费服务器可以从任一个分发服务器的目录中确定自己待获取的待消费消息位于哪个分发服务器上,以便从该分发服务器上的与自己一一对应的分区中获取待消费消息。

本发明实施例的技术方案,分发服务器通过接收生产服务器生产后发送的待消费消息,并确定用于表示该待消费消息所属的消息消费任务的消息标识;进而,分发服务器根据该消息标识从自身的各分区中确定出目标分区,并将该待消费消息分发到该目标分区上,即将属于同一消息消费任务的各待消费消息分发到同一分区中,且将属于不同的消息消费任务的各待消费消息分发到不同的分区中,由于各分区和各消费服务器间存在一一对应关系,这有助于各消费服务器可以分别从各自对应的分区中获取待消费消息,并对该待消费消息进行消费,由此保证了各消费服务器的充分利用和属于同一消息消费任务的各个待消费消息的顺序消费的效果。上述技术方案,分发服务器根据各个待消费消息的消息标识对它们进行分发,以使属于同一消息消费任务的各待消费消息可以进入到同一分区中,进而与消费服务器相互配合,以使它们可以再进入到同一消费服务器内的同一内存队列,进而被同一线程消费,由此保证了它们的消费顺序;与此同时,通过将各待消费消息拆分到相应的分区中来充分利用各消费服务器的方式达到了高吞吐的效果。

一种可选的技术方案,根据消息标识从分发服务器的各分区中确定出目标分区,可以包括:基于预先设置的负载均衡策略对消息标识进行处理,得到处理标识;获取分发服务器的各分区的分区数量,根据处理标识和分区数量从各分区中确定出目标分区。

其中,负载均衡策略可以是预先设置的用于将将负载(即工作任务)进行平衡、分摊到多个操作单元上进行运行的策略。结合本发明实施例可能涉及到的应用场景,具体的,负载均衡策略可以是用于对各消息标识进行处理,或者可以称为对各消息标识进行扰动,以使由此得到的各消息标识分别对应的处理标识尽可能呈现正态分布(即均衡分布)的策略,其在与后续步骤相互配合时,可以令各待消费消息尽可能均衡分布到各分区中,以便充分利用与各分区一一对应的消费服务器,在最大程度上提高吞吐量。

在提高吞吐量的同时,还需要保证属于同一消息消费任务的各待消费消息可以被分发到同一分区中,此时,可以获取分发服务器的各分区的分区数量,根据该分区数量和扰动后的处理标识确定相应的待消费消息可以被分发到哪个分区中,即确定出与该待消费消息具有同一处理标识的其余的待消费消息已经被分发到哪个分区中,以便将该待消费消息也分发到这个分区(即目标分区)。上述技术方案,达到了各待消费消息的负载均衡且隶属于同一消息消费任务的各待消费消息被分发到同一分区中的效果。

需要说明的是,上述处理标识的得到过程可以是:对消息标识进行映射,得到预设位数的数字类型的映射标识;将预设位数的一半更新为预设位数,并基于预设位数对映射标识进行位移,得到位移标识;将映射标识和位移标识进行异或处理,得到处理标识。和/或,上述目标分区的确定过程可以是:对分区数量进行减一操作,得到减一数量,将减一数量和处理标识进行与操作,得到分区编号;或是,将分区数量和处理标识进行取模操作,得到分区编号;将各分区中与分区编号对应的分区作为目标分区。当然,还可以采用其余方案确定处理标识和/或目标分区,在此未做具体限定。

为了更好地理解上述步骤的具体实现过程,下面继续以上文中的在公众号或者h5页面上对接第三方生鲜平台的应用场景为例,对各本发明实施例中的消息消费方法和消息分发方法的实现过程和配合过程进行示例性的说明。

示例性的,如图4所示,接下来分别对本发明实施例中的2个重点:消息消费拆分保证顺序和高吞吐的逻辑和定制的负载均衡算法(即负载均衡策略)进行详细阐述。

一、消息消费拆分保证顺序+高吞吐

为了保证一个订单的全部的订单状态均能进入同一分区(partition)、同一消费者、同一内存队列、同一线程来实现顺序消费的同时,实现高吞吐的效果,

1)当各个订单状态顺序到达消息队列(kafka)后,根据负载均衡算法1保证同一订单的各订单状态进入同一partition中。其中,partition的数量是可以依据消费者(即消费者所在的消费服务器)的数量确定,二者等同,且每个partition对应唯一的一个消费者。另外,kafka是jmq下的一种实现方式,其是最新版本的jmq的底层封装的内容。

2)消费者可以根据自身的性能和业务需求设置支持高吞吐的线程的数量来一起进行消息消费。然后设置跟线程的数量数相同的消息队列,且每一个线程都有唯一的一个线程队列与之对应。当各个订单状态顺序到达消费者后,根据负载均衡算法2来保证同一订单的各订单状态进入同一消费者和同一内存队列中被同一线程消费来保证消费顺序。

二、定制的负载均衡算法

假设partition或者内存队列从1开始进行编号,如图4中所示(1,2,3)

1)对订单的订单标识调用hashcode()函数映射为数字类型的散列值h,即h=hashcode(消息标识);

2)将h右移16位,再与h进行异或操作,m=h^(h>>>16),从而打散了订单标识在分区或是内存队列上的分布,达到负载均衡的效果;

3)n为partition或内存队列的数量,将m与(n-1)进行与操作,得到编号i,即i=(n-1)&m,其中i对应的内存队列或是分区即为订单状态待进入的内存队列或是分区,由于保证了同一个订单的全部的订单状态可以进入同一partition或者同一内存队列。

综上所述,i=(n-1)&(hashcode(订单标识)^(hashcode(订单标识)>>>16))。

实施例四

图5为本发明实施例四提供的消息消费装置的结构框图,该装置用于执行上述任意实施例所提供的消息消费方法。该装置与上述各实施例的消息消费方法属于同一个发明构思,在消息消费装置的实施例中未详尽描述的细节内容,可以参考上述消息消费方法的实施例。参见图5,该装置可配置于消费服务器,具体可包括:第一消息标识确定模块410、待消费消息发送模块420和待消费消息消费模块430。

其中,第一消息标识确定模块410,用于确定分发服务器的各分区中与消费服务器一一对应的目标分区,并从目标分区中获取待消费消息,确定待消费消息的消息标识,其中消息标识表示待消费消息所属的消息消费任务,且分发服务器是根据消息标识将待消费消息分发到目标分区上的;

待消费消息发送模块420,用于根据消息标识从消费服务器的各内存队列中确定出目标内存队列,并将待消费消息发送给目标内存队列;

待消费消息消费模块430,用于确定消费服务器的各线程中与目标内存队列一一对应的目标线程,并基于目标线程对目标内存队列中的待消费消息进行消费。

可选的,待消费消息发送模块420,具体可以包括:

第一处理标识得到子模块,用于基于预先设置的负载均衡策略对消息标识进行处理,得到处理标识;目标内存队列确定子模块,用于获取消费服务器的各内存队列的队列数量,根据处理标识和队列数量从各内存队列中确定出目标内存队列。

在此基础上,可选的,第一处理标识得到子模块,具体可以包括:

映射标识得到单元,用于对消息标识进行映射,得到预设位数的数字类型的映射标识;位移标识得到单元,用于将预设位数的一半更新为预设位数,并基于预设位数对映射标识进行位移,得到位移标识;处理标识得到单元,用于将映射标识和位移标识进行异或处理,得到处理标识。

在此基础上,可选的,目标内存队列确定子模块,具体可以包括:

队列编号得到单元,用于对队列数量进行减一操作,得到减一数量,并将减一数量和处理标识进行与操作,得到队列编号;或是,将队列数量和处理标识进行取模操作,得到队列编号;目标内存队列确定单元,用于将各内存队列中与队列编号对应的内存队列作为目标内存队列。

可选的,待消费消息包括物品获取任务中的物品获取状态,物品获取状态包括创建状态、待支付状态、已支付状态、已发货状态、配送中状态和已收货状态中的至少一个。

本发明实施例四提供的消息消费装置,由于分发服务器中每个分区内的各待消费消息是由该分发服务器根据各自的消息标识将它们分发到分区上的消息,该消息标识可以表示该待消费消息所属的消息消费任务,因此消费服务器通过第一消息标识确定模块从各分区中确定出与自身一一对应的目标分区,并从该目标分区中获取待消费消息,以使隶属于同一消息消费任务的各待消费消息可以被同一消费服务器获取到;针对每个待消费消息,消费服务器通过待消费消息发送模块根据其的消息标识从自身的各内存队列中确定出目标内存队列,并将待消费消息发送给该目标内存队列,以使隶属于同一消息消费任务的各个待消费消息可以被发送到同一内存队列;进而,消费服务器通过待消费消息消费模块确定自身的各线程中与该目标内存队列一一对应的目标线程,基于目标线程对该目标内存队列中的待消费消息进行消费,以使属于同一消息消费任务的各待消费消息可以被同一线程消费。上述装置,消费服务器根据各待消费消息的消息标识对它们进行拆分,以使隶属于同一消息消费任务的各待消费消息可以进入到同一分区、同一消费服务器内同一内存队列,进而被同一线程消费,由此保证了它们的消费顺序;与此同时,消费服务器从与自身对应的目标分区中获取到被拆分到该目标分区中的待消费消息,并且将获取到的各待消费消息分别拆分到相应的线程中进行消费,多分区多线程的应用达到了高吞吐的效果。

本发明实施例所提供的消息消费装置可执行本发明任意实施例所提供的消息消费方法,具备执行方法相应的功能模块和有益效果。

值得注意的是,上述消息消费装置的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。

实施例五

图6为本发明实施例五提供的消息分发装置的结构框图,该装置用于执行上述任意实施例所提供的消息分发方法。该装置与上述各实施例的消息分发方法属于同一个发明构思,在消息分发装置的实施例中未详尽描述的细节内容,可以参考上述消息分发方法的实施例。参见图6,该装置可配置于分发服务器,具体包括:第二消息标识确定模块510和待消费消息分发模块520。

其中,第二消息标识确定模块510,用于接收生产服务器生产后推送的待消费消息,并确定待消费消息的消息标识,其中消息标识表示待消费消息所属的消息消费任务;

待消费消息分发模块520,用于根据消息标识从分发服务器的各分区中确定出目标分区,将待消费消息分发到目标分区上,以使与目标分区一一对应的消费服务器将从目标分区中获取到的待消费消息发送给根据消息标识从各内存队列中确定出的目标内存队列,并基于各线程中与目标内存队列一一对应的目标线程对待消费消息进行消费。

可选的,待消费消息分发模块520,具体可以包括:

第二处理标识得到子模块,用于基于预先设置的负载均衡策略对消息标识进行处理,得到处理标识;

目标分区确定子模块,用于获取分发服务器的各分区的分区数量,根据处理标识和分区数量从各分区中确定出目标分区。

本发明实施例五提供的消息分发装置,分发服务器通过第二消息标识确定模块接收生产服务器生产后发送的待消费消息,并确定用于表示该待消费消息所属的消息消费任务的消息标识;进而,分发服务器通过待消费消息分发模块根据该消息标识从自身的各分区中确定出目标分区,并将该待消费消息分发到该目标分区上,即将属于同一消息消费任务的各待消费消息分发到同一分区中,且将属于不同的消息消费任务的各待消费消息分发到不同的分区中,由于各分区和各消费服务器间存在一一对应关系,这有助于各消费服务器可以分别从各自对应的分区中获取待消费消息,并对该待消费消息进行消费,由此保证了各消费服务器的充分利用和属于同一消息消费任务的各个待消费消息的顺序消费的效果。上述装置,分发服务器根据各个待消费消息的消息标识对它们进行分发,以使属于同一消息消费任务的各待消费消息可以进入到同一分区中,进而与消费服务器相互配合,以使它们可以再进入到同一消费服务器内的同一内存队列,进而被同一线程消费,由此保证了它们的消费顺序;与此同时,通过将各待消费消息拆分到相应的分区中来充分利用各消费服务器的方式达到了高吞吐的效果。

本发明实施例所提供的消息分发装置可执行本发明任意实施例所提供的消息分发方法,具备执行方法相应的功能模块和有益效果。

值得注意的是,上述消息分发装置的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。

实施例六

图7为本发明实施例六提供的一种消费服务器的结构示意图,如图7所示,该消费服务器包括存储器610、处理器620、输入装置630和输出装置640。消费服务器中的处理器620的数量可以是一个或多个,图7中以一个处理器620为例;消费服务器中的存储器610、处理器620、输入装置630和输出装置640可以通过总线或其它方式连接,图7中以通过总线650连接为例。

存储器610作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中的消息消费方法对应的程序指令/模块(例如,消息消费装置中的第一消息标识确定模块410、待消费消息发送模块420和待消费消息消费模块430)。处理器620通过运行存储在存储器610中的软件程序、指令以及模块,从而执行消费服务器的各种功能应用以及数据处理,即实现上述的消息消费方法。

存储器610可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据消费服务器的使用所创建的数据等。此外,存储器610可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器610可进一步包括相对于处理器620远程设置的存储器,这些远程存储器可以通过网络连接至设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

输入装置630可用于接收输入的数字或字符信息,以及产生与装置的用户设置以及功能控制有关的键信号输入。输出装置640可包括显示屏等显示设备。

实施例七

图8为本发明实施例七提供的一种分发服务器的结构示意图,如图8所示,该分发服务器包括存储器710、处理器720、输入装置730和输出装置740。分发服务器中的处理器720的数量可以是一个或多个,图8中以一个处理器720为例;分发服务器中的存储器710、处理器720、输入装置730和输出装置740可以通过总线或其它方式连接,图8中以通过总线750连接为例。

存储器710作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中的消息分发方法对应的程序指令/模块(例如,消息分发装置中的第二消息标识确定模块510和待消费消息分发模块520)。处理器720通过运行存储在存储器710中的软件程序、指令以及模块,从而执行分发服务器的各种功能应用及数据处理,即实现上述的消息分发方法。

存储器710可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据分发服务器的使用所创建的数据等。此外,存储器710可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器710可进一步包括相对于处理器720远程设置的存储器,这些远程存储器可以通过网络连接至设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

输入装置730可用于接收输入的数字或字符信息,以及产生与装置的用户设置以及功能控制有关的键信号输入。输出装置740可包括显示屏等显示设备。

实施例八

本发明实施例八提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行一种消息消费方法,应用于消费服务器,该方法包括:

确定分发服务器的各分区中与消费服务器一一对应的目标分区,并从目标分区中获取待消费消息,确定待消费消息的消息标识,其中消息标识表示待消费消息所属的消息消费任务,且分发服务器是根据消息标识将待消费消息分发到目标分区上的;

根据消息标识从消费服务器的各内存队列中确定出目标内存队列,并将待消费消息发送给目标内存队列;

确定消费服务器的各线程中与目标内存队列一一对应的目标线程,基于目标线程对目标内存队列中的待消费消息进行消费。

当然,本发明实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的方法操作,还可以执行本发明任意实施例所提供的消息消费方法中的相关操作。

实施例九

本发明实施例九提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行一种消息分发方法,应用于分发服务器,该方法包括:

接收生产服务器生产后推送的待消费消息,并确定待消费消息的消息标识,其中消息标识表示待消费消息所属的消息消费任务;

根据消息标识从分发服务器的各分区中确定出目标分区,将待消费消息分发到目标分区上,以使与目标分区一一对应的消费服务器将从目标分区中获取到的待消费消息发送给根据消息标识从各内存队列中确定出的目标内存队列,并基于各线程中与目标内存队列一一对应的目标线程对待消费消息进行消费。

当然,本发明实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的方法操作,还可以执行本发明任意实施例所提供的消息分发方法中的相关操作。

通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。依据这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、闪存(flash)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。

注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

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