本发明属于消息队列消费顺序领域,更具体地说,尤其涉及一种基于泳道方式的消息队列消费顺序的方法。
背景技术:
1、消息队列在只有一个消费者的情况下,假如该消费者的机器发生故障,则无法完成对消息的完全消费,此时,如果要继续消费消息,则需要切换到其他机器进行操作,即在系统中设置多个消费者终端;而多个消费者消费消息又存在需要顺序执行的问题,在多消费者并行消费分布式消息队列消息的场景中,怎样保持多个消费者之间的顺序消费,是一个亟待解决的重要问题。
2、现有技术中,消息队列消费顺序无法保证顺序消费的同时,快速消费数据,因此,我们提出一种基于泳道方式的消息队列消费顺序的方法。
技术实现思路
1、本发明的目的是为了解决现有技术中存在的缺点,而提出的一种基于泳道方式的消息队列消费顺序的方法,本发明能自适应调整处理的进程数和处理的数据量,从而实现保证顺序消费的同时,快速消费数据。
2、为实现上述目的,本发明提供如下技术方案:
3、一种基于泳道方式的消息队列消费顺序的方法,包括如下步骤:
4、s1、生产者发送业务数据同时,并设置关键字,发送至消息队列集群;
5、s2、建立泳道队列,进行先进先出原则的顺序排序;
6、s3、设置消息控制模块,获取数据并根据业务数据关键字,进行泳道信息进行分区,获取对应的泳道信息;
7、s4、把数据发送到对应的泳道队列之中;
8、s5、队列顺序消费,一旦顺序消费失败,把业务数据发送至失败队列之中,并把关键字进行保存,后续相同关键字直接发送失败队列之中,保证数据完全顺序消费;
9、s6、失败队列循环消费,多次消费失败,下发短信和邮件通知生产者,并把后续相同关键字的业务数据全部失败,并通知生产者。
10、优选的,步骤s2中所述的泳道队列支持如下操作:
11、queue():创建一个空队列,不需要参数,且会返回一个空队列;
12、enqueue(item):在队列的尾部添加一个元素,需要一个元素作为参数,不返回任何值;
13、dequeue():从队列的头部移除一个元素,不需要参数,且会返回一个元素,并修改队列的内容;
14、isempty():检查队列是否为空,不需要参数,且会返回一个布尔值;
15、size():返回队列中元素的数目,不需要参数,且会返回一个整数。
16、优选的,所述先进先出原则的顺序排序中,循环队列的入队算法如下:
17、tail=tail+1 (1)
18、若tail=n+1,则tail=1;
19、若head=tail,即尾指针与头指针重合,则表示元素已装满队列,会施行上溢出错处理;否则q(tail)=x,结束整个过程,其中x表示新的入出元素。
20、优选的,步骤s5中,采用mq框架确保消息队列消费顺序准确性,具体如下:
21、将消息消费产生的业务数据以发送queue-1、queue-2、....、queue-n的队列形式发送至生产者的业务服务端口,并对多组发送的业务数据进行分区处理,且由时间戳对业务数据的时间进行标记;
22、将处理后生产者的业务服务端口产生的各业务数据发送至zfs-mqs进行全局消息(mongodb)保存和补偿;
23、将处理后的业务数据以发送queue-1、queue-2、....、queue-n的队列形式发送至mq端,对业务数据的消费消息进行处理,再根据fastdtw计算式计算判断redis是否存在。
24、优选的,若redis存在时,则调用业务服务完成业务处理,并到达消费者的业务服务端,然后再根据当前顺序业务数据的处理批次进行redis消费记录,最后再发送下一条业务数据消息,以此类推,直至所有顺序的队列业务数据处理完成为止;
25、若redis不存在时,返回生产者发送业务数据,并重新设置关键字发送至消息队列集群。
26、优选的,所述fastdtw计算式以redis消费记录的时间序列相似性、不确定时间序列以及期望距离作为判断依据;
27、在fastdtw计算式以时间序列相似性作为判断依据时,先对redis消费记录的时间序列按照c={s1、s1...sn}进行设定,其中n表示时间序列的数量,则fastdtw计算式为:rq(q、c、ε)={s|s∈c|distance(q,s)≤ε},其中ε为距离阔值。
28、优选的,步骤s1中,关键字设定具体为:
29、确定行程单的关键字;设置关键字的同义集合;确定每个关键字集合的优先级;按优先级对各关键字集合进行排序。
30、优选的,步骤s3中所述的泳道信息进行分区具体为:
31、获取泳道标识,将获取到的泳道标识放到消息中,发送给消息队列;
32、消费端拿到消息后,由骨干消费者解析消息里的泳道标识,转发到对应的泳道队列里,如果没有相应的泳道队列则新建一个泳道队列;
33、查看是否存在对应的泳道消费者,如果存在则由泳道消费者消费该含泳道标识的消息,如果不存在,则由骨干消费者消费该含泳道标识的消息。
34、优选的,所述查看是否存在对应的泳道消费者中,若存在对应的泳道消费者,但泳道消费者不在线,则等待泳道消费者上线再消费
35、存在对应的泳道消费者,但泳道消费者不在线超过设定时间阈值,则由骨干消费者消费。
36、本发明的技术效果和优点:本发明提供的一种基于泳道方式的消息队列消费顺序的方法,与现有的消息队列消费顺序相比,本发明能自适应调整处理的进程数和处理的数据量,从而实现保证顺序消费的同时,快速消费数据;
37、其次,本发明还能实现消息信息数据的分区队列划分和先进先出原则的顺序排序,保证在同一服务端口中的多个消息具有事务特性,使多个对列之间也可保证消息顺序性,能严格保证在集群和单机部署模式下的消息顺序性,以防消费失败,导致消息信息发生阻塞,同时也防止重复消费。
1.一种基于泳道方式的消息队列消费顺序的方法,其特征在于,包括如下步骤:
2.根据权利要求1所述的一种基于泳道方式的消息队列消费顺序的方法,其特征在于:步骤s2中所述的泳道队列支持如下操作:
3.根据权利要求2所述的一种基于泳道方式的消息队列消费顺序的方法,其特征在于:所述先进先出原则的顺序排序中,循环队列的入队算法如下:
4.根据权利要求1所述的一种基于泳道方式的消息队列消费顺序的方法,其特征在于:步骤s5中,采用mq框架确保消息队列消费顺序准确性,具体如下:
5.根据权利要求4所述的一种基于泳道方式的消息队列消费顺序的方法,其特征在于:若redis存在时,则调用业务服务完成业务处理,并到达消费者的业务服务端,然后再根据当前顺序业务数据的处理批次进行redis消费记录,最后再发送下一条业务数据消息,以此类推,直至所有顺序的队列业务数据处理完成为止;
6.根据权利要求4所述的一种基于泳道方式的消息队列消费顺序的方法,其特征在于:所述fastdtw计算式以redis消费记录的时间序列相似性、不确定时间序列以及期望距离作为判断依据;
7.根据权利要求1所述的一种基于泳道方式的消息队列消费顺序的方法,其特征在于:步骤s1中,关键字设定具体为:
8.根据权利要求1所述的一种基于泳道方式的消息队列消费顺序的方法,其特征在于:步骤s3中所述的泳道信息进行分区具体为:
9.根据权利要求8所述的一种基于泳道方式的消息队列消费顺序的方法,其特征在于:所述查看是否存在对应的泳道消费者中,若存在对应的泳道消费者,但泳道消费者不在线,则等待泳道消费者上线再消费