掌桥专利:专业的专利平台
掌桥专利
首页

消息传输方法、装置、设备及存储介质

文献发布时间:2023-06-19 11:26:00


消息传输方法、装置、设备及存储介质

技术领域

本申请实施例涉及物联网技术领域,特别涉及一种消息传输方法、装置、设备及存储介质。

背景技术

消息队列(Message Queue,MQ)是基础数据结构中“先进先出”的一种数据结构,一般用于解决应用解耦、异步消息、流量削峰等问题。生产者产生消息并把消息放入队列,然后由消费者接收队列中的消息并进行相应处理。

相关技术中的MQ主要通过消息中间件、数据库实现,或者直接缓存在设备内存中,生产者将消息发送至MQ,MQ再将接收到的消息复制到各个消费通道中,消费者从对应的消费通道进行消费。

然而,相关技术的消息传输方式中,MQ需要将消息复制到消费通道才能使消费者成功获取消息,当消费通道较多时,消息传输效率较低,消费者可能需要等待,并且相关技术为了提高MQ的吞吐量,通常不会按照消息的时序进行消息接收和发布,从而导致无法满足物联网(The Internet of Things,IOT)边缘端设备的顺序消费需求。

发明内容

本申请实施例提供了一种消息传输方法、装置、设备及存储介质。所述技术方案如下:

一方面,本申请实施例提供了一种消息传输方法,所述方法包括:

按照消息生成时间的先后顺序,将消息生产方发送的队列消息持久化写入磁盘;

基于消息消费方已读取消息的索引信息,按照所述队列消息的写入顺序调整消费通道的消息读取位置,所述消息读取位置用于指示所述队列消息在磁盘中的存储位置;

基于所述消息读取位置,通过所述消费通道从磁盘中读取所述队列消息;

响应于所述消息消费方在线,将所述消费通道读取到的所述队列消息发送至所述消息消费方。

另一方面,本申请实施例提供了一种消息传输装置,所述装置包括:

写入模块,用于按照消息生成时间的先后顺序,将消息生产方发送的队列消息持久化写入磁盘;

第一调整模块,用于基于消息消费方已读取消息的索引信息,按照所述队列消息的写入顺序调整消费通道的消息读取位置,所述消息读取位置用于指示所述队列消息在磁盘中的存储位置;

读取模块,用于基于所述消息读取位置,通过所述消费通道从磁盘中读取所述队列消息;

发送模块,用于响应于所述消息消费方在线,将所述消费通道读取到的所述队列消息发送至所述消息消费方。

另一方面,本申请实施例提供了一种计算机设备,所述计算机设备包括处理器和存储器;所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由所述处理器加载并执行以实现如上述方面所述的消息传输方法。

另一方面,本申请实施例提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有至少一条计算机程序,所述计算机程序由处理器加载并执行以实现如上述方面所述的消息传输方法。

根据本申请的一个方面,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备实现上述方面的各种可选实现方式中提供的消息传输方法。

本申请实施例提供的技术方案带来的有益效果至少包括:

本申请实施例中,当接收到消息生产方发送的队列消息后,先将队列消息持久化到磁盘,相比于相关技术中写入内存的方式,能够避免设备异常时数据丢失;并且,按照消息生成时间的先后顺序存储队列消息,并在消息消费方进行消费时,按照队列消息的写入顺序调整消费通道的消息读取位置,能够满足IOT边缘设备对消息时间顺序的需求;此外,基于索引信息所指示的消息读取位置向消息消费方发送消息,只需持久化一次队列消息,相比于相关技术中需要将队列消息依次复制到各个消费通道的方式,在消费通道较多的情况下能够大幅度提高消息传输效率,避免消息传输时间过长导致消息消费方需要等待的情况。

附图说明

图1是本申请一个示例性实施例提供的实施环境的示意图;

图2是本申请一个示例性实施例提供的消息传输方法的流程图;

图3是本申请另一个示例性实施例提供的消息传输方法的流程图;

图4是本申请另一个示例性实施例提供的消息传输方法的流程图;

图5是本申请另一个示例性实施例提供的消息传输方法的流程图;

图6是本申请另一个示例性实施例提供的消息传输方法的流程图;

图7是本申请一个示例性实施例提供的第一消费模式的示意图;

图8是本申请一个示例性实施例提供的第二消费模式的示意图;

图9是本申请一个示例性实施例提供的第三消费模式的示意图;

图10是本申请一个示例性实施例提供的消息传输装置的结构框图;

图11是本申请一个示例性实施例提供的计算机设备的结构框图。

具体实施方式

为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。

在本文中提及的“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。

相关技术中,消息生产方将消息发送至MQ,MQ再将接收到的消息复制到各个消费通道中,消息消费方从对应的消费通道进行消费。然而,相关技术的消息传输方式中,MQ需要将消息复制到消费通道才能使消费者成功获取消息,当消费通道较多时,消息传输效率较低,消费者可能需要等待,并且相关技术为了提高MQ的吞吐量,通常不会按照消息的时序进行消息接收和发布,从而导致无法满足物联网(The Internet of Things,IOT)边缘端设备的顺序消费需求。

为了解决上述技术问题,本申请实施例提供了一种消息传输方法,通过将队列消息持久化到磁盘,并在消息消费方进行消费时,按照队列消息的写入顺序调整消费通道的消息读取位置,满足了IOT边缘设备对消息时间顺序的需求;此外,基于索引信息所指示的消息读取位置向消息消费方发送消息,只需持久化一次队列消息,在消费通道较多的情况下能够大幅度提高消息传输效率,避免消息传输时间过长导致消息消费方需要等待的情况。

图1示出了本申请实施例示出的实施环境的示意图。消息生产方110将生产的队列消息发送至消息中间件120,由消息中间件120向消息消费方130转发该队列消息。其中,消息中间件中包含至少一个队列主题(Topic)121,每个队列主题121都对应有一份持久化消息存储文件122,消息消费方130通过消费通道(Channel)123进行消费,读取消息存储文件122中的队列消息。消息存储文件122中,队列消息按照消息生成时间的先后顺序存储,同一队列主题121下的各个消费通道123按照消息存储文件122的文件生成时间的先后顺序读取队列消息,并基于消息消费方130的索引信息调整消息读取位置。

消息生产方110以及消息消费方130可以是具有数据生成以及数据传输功能的设备,也可以是应用程序,消息生产方110、消息消费方130与消息中间件120可以属于同一台计算机设备,也可以分别设置在独立的计算机设备中。

图1中仅示出了一个消息生产方110以及一个队列主题121,在其它的实施方式中,还可能存在更多的消息生产方110以及队列主题121一个消息生产方110可以对应多个队列主题121,多个消息生产方110也可以对应同一个队列主题121,本申请实施例对此不作限定。

图2示出了本申请一个示例性实施例提供的消息传输方法的流程图。本实施例以该方法用于具有消息存储和消息传输功能的计算机设备为例进行说明,该方法包括如下步骤:

步骤201,按照消息生成时间的先后顺序,将消息生产方发送的队列消息持久化写入磁盘。

在一种可能的实施方式中,计算机设备中的消息中间件接收到消息后,首先将队列消息持久化写入磁盘,例如写入一个用于存储队列消息的磁盘文件。通常,由于消息生产方向消息中间件传输消息的过程可能存在延迟,因此会导致队列消息实际到达中间件的顺序与队列消息生成的顺序不一致,即消息生产方后生成的队列消息反而先到达中间件的情况。为了保证能够按照队列消息的生成顺序进行存储和消费,满足IOT边缘设备对消息时序性的需求,计算机设备严格按照消息生成时间的先后顺序进行消息持久化。

消息生产方在向消息中间件发送队列消息时,会携带队列消息的时间戳一起发送,该时间戳即为队列消息的消息生成时间,以便消息中间件判断各条队列消息的先后顺序。

示意性的,某一消息生产方每隔1秒生成并发送一次队列消息,消息中间件上一次接收到的队列消息对应的时间戳为00:01:00,而当前接收到的队列消息的时间戳为00:01:02,则计算机设备暂停存储当前接收到的队列消息,等到时间戳为00:01:01的队列消息到达后,按照时间戳的先后顺序进行存储;或者,计算机设备每隔预定时长对接收到的队列消息进行集中存储,从而对预定时长内接收到的队列消息先排序后存储。

步骤202,基于消息消费方已读取消息的索引信息,按照队列消息的写入顺序调整消费通道的消息读取位置,消息读取位置用于指示队列消息在磁盘中的存储位置。

在一种可能的实施方式中,消息消费方负责维护索引信息,例如,消息中间件的消费通道将一条队列消息发送至消息消费方后,消息消费方若成功接收到该条队列消息,则消息消费方向对应的消费通道发送索引信息,从而使消费通道调整消息读取位置,使消息读取位置移动至已读取消息的下一条队列消息。

值得注意的是,同一条消费通道可能对应多个消息消费方,对应同一消费通道的消息消费方之间为竞争关系,共同维护一份索引信息,例如,消费通道A对应有消息消费方a和消息消费方b,消费通道C对应有消息消费方c,则消息消费方c单独对消费通道C所传送的队列消息进行消费,而消息消费方a和消息消费方b竞争获取消费通道A所传送的数据,即消息消费方a和消息消费方b所消费的队列消息数量之和为消费通道A所传输的队列消息数量。因此,消费通道接收到一个消息消费方发送的索引信息即可调整消息读取位置。

消息中间件接收到索引信息后,按照队列消息的写入顺序调整消费通道的消息读取位置,例如,消费通道A对应的磁盘文件中按照顺序存储有队列消息1和队列消息2,当通过索引信息确定消息消费方已接收队列消息1后,消息中间件将消费通道A的消息读取位置从队列消息1的存储位置调整至队列消息2的存储位置。

步骤203,基于消息读取位置,通过消费通道从磁盘中读取队列消息。

消息中间件调整消费通道的消息读取位置后,控制消费通道读取消息读取位置对应的队列消息。本申请实施例通过这一方式能够实现队列消息的顺序写入和顺序消费,保证消息消费方能够按照消息生成时间的先后顺序接收队列消息。

步骤204,响应于消息消费方在线,将消费通道读取到的队列消息发送至消息消费方。

当消息消费方在线时,消息中间件将消费通道读取到的队列消息发送至消息消费方。可选的,消息中间件检测到消息消费方在线,则通过消费通道向消息消费方发送队列消息;或者,消息消费方通过主动轮询的方式,上线后从消费通道中获取队列消息,本申请实施例对此不作限定。

综上所述,本申请实施例中,当接收到消息生产方发送的队列消息后,先将队列消息持久化到磁盘,相比于相关技术中写入内存的方式,能够避免设备异常时数据丢失;并且,按照消息生成时间的先后顺序存储队列消息,并在消息消费方进行消费时,按照队列消息的写入顺序调整消费通道的消息读取位置,能够满足IOT边缘设备对消息时间顺序的需求;此外,基于索引信息所指示的消息读取位置向消息消费方发送消息,只需持久化一次队列消息,相比于相关技术中需要将队列消息依次复制到各个消费通道的方式,在消费通道较多的情况下能够大幅度提高消息传输效率,避免消息传输时间过长导致消息消费方需要等待的情况。

本申请实施例中,消息中间件将消息生产方发送的队列消息持久化到磁盘,为了方便对队列消息的管理并提高消息中间件对队列消息的加载速度,在一种可能的实施方式中,消息中间件对消息队列进行分块存储。图3示出了本申请另一个示例性实施例提供的消息传输方法的流程图。本实施例以该方法用于具有消息存储和消息传输功能的计算机设备为例进行说明,该方法包括如下步骤:

步骤301,获取消息生产方发送的队列消息。

计算机设备中的消息中间件实时获取消息生产方发送的队列消息,并将获取到的队列消息持久化到磁盘中。其中,队列消息的持久化是异步的,消息生产方向消息中间件发送队列消息后,无需等待持久化结束再返回,因此消息生产方的生产周期更短,消息中间件的吞吐量能够得到提升。

步骤302,基于目标消息存储文件的数据量,按照消息生成时间的先后顺序,将队列消息写入消息存储文件,目标消息存储文件为磁盘中文件生成时间最晚的消息存储文件。

在一种可能的实施方式中,为了提高消息中间件的高可用性以及消息传输效率,消息中间件对队列消息进行分块存储,当某一消息存储文件损坏时,依然能够保证其它文件中队列消息的安全性,并且消息中间件读取队列消息时无需加载所有的消息存储文件,只需加载需要读取的队列消息所在的文件即可,消息读取所需的内存大小也会相应减少。步骤302还包括如下步骤:

步骤302a,响应于目标消息存储文件的数据量未达到预设数据量,按照消息生成时间的先后顺序将队列消息写入目标消息存储文件。

在一种可能的实施方式中,消息中间件中预先设置有消息存储文件的预设数据量(例如30M),消息中间件按序将队列消息写入一个消息存储文件,当该消息存储文件的数据量达到预设数据量时,则创建一个新的消息存储文件,并在新创建的消息存储文件中继续写入队列消息。目标消息存储文件为磁盘中文件生成时间最晚的消息存储文件,消息中间件接收到队列消息后,确认目标消息存储文件的数据量,若未达到预设数据量,则确定目标消息存储文件中还能够继续存储队列消息。

步骤302b,响应于目标消息存储文件的数据量达到预设数据量,生成新建消息存储文件,并按照消息生成时间的先后顺序将队列消息写入新建消息存储文件。

当目标消息存储文件的数据量达到预设数据量时,消息中间件需要创建新的消息存储文件,并按照消息生成时间的先后顺序将后续接收到的队列消息写入新建消息存储文件。

步骤303,基于索引信息中的文件标识确定已读取消息对应的已读消息存储文件,并基于索引信息中的消息标识确定已读取消息在已读消息存储文件中的存储位置。

其中,消息存储文件中关联存储有队列消息以及队列消息的消息标识,索引信息中包含已读取消息的文件标识和消息标识。例如,消息中间件在消息存储文件中关联存储消息标识、队列消息、时间戳、以及消息属性等信息,从而使消费通道基于消息标识确定队列消息在消息存储文件中的存储位置,并读取队列消息。由于本申请实施例中消息中间件对队列消息进行分块存储,因此还需要为各个消息存储文件设置唯一的文件标识。

在一种可能的实施方式中,消息消费方接收到队列消息后,向对应的消费通道发送用于表示成功接收队列数据的索引信息,消费通道接收到该索引信息后,确定消息消费方已成功消费对应的队列数据,并基于索引信息调整消息读取位置。

步骤304,基于已读取消息在已读消息存储文件中的存储位置以及队列消息的写入顺序,将消息读取位置移动至下一个队列消息的存储位置。

例如,消息中间件所在的计算机设备的磁盘中,存储有3个消息存储文件,包括文件(file)1、file2和file3,按照消息生成时间的先后顺序,file1中存储有消息标识分别为001、002和003的队列消息,file2中存储有消息标识分别为001、002和003的队列消息,file3中存储有消息标识分别为001和002的队列消息,当消费通道接收到消息消费方发送的包含(file2,001)的索引信息时,消息中间件将消费通道的消息读取位置移动至(file2,002),当消费通道接收到消息消费方发送的包含(file2,003)的索引信息时,消息中间件将消费通道的消息读取位置移动至(file3,001)。

步骤305,基于消息读取位置,通过消费通道从磁盘中读取队列消息。

步骤306,响应于消息消费方在线,将消费通道读取到的队列消息发送至消息消费方。

步骤305至步骤306的具体实施方式可以参考上述步骤203至步骤204,本申请实施例在此不再赘述。

本申请实施例中,消息中间件对队列消息进行分块存储,当一个消息存储文件损坏时,依然能够保证其它文件中队列消息的安全性,并且消息中间件读取队列消息时无需加载所有的消息存储文件,只需加载需要读取的队列消息所在的文件即可,消息读取所需的内存大小也会相应减少;并且,消息中间件基于消息消费方所维护的索引信息,按序调整消费通道的消息读取位置,无需将消息存储文件复制到消费通道中,进一步提升了消息传输的效率。

上述实施例说明了消息中间件接收、存储队列消息以及向消息消费方发送消息的过程,在一种可能的实施方式中,为了减少消息存储文件所占用的磁盘大小,消息中间件通过预设方式对消息存储文件进行清除,并且由于队列消息分块存储,因此消息中间件清除文件较为方便。图4示出了本申请另一个示例性实施例提供的消息传输方法的流程图。本实施例以该方法用于具有消息存储和消息传输功能的计算机设备为例进行说明,该方法包括如下步骤:

步骤401,响应于消息存储文件中所有的队列消息已被目标队列主题下各个消费通道获取,删除消息存储文件。

当消息存储文件中所有的队列消息已被其所属的目标队列主题下所有的消费通道获取时,说明后续不会再有消息消费方获取该消息存储文件中的队列消息,因此,该消息存储文件即可被删除。

示意性的,Topc1中包含消费通道A和消费通道B,且Topc1对应的消息存储文件为file1和file2,当file1中所有的队列消息机被消费通道A也被消费通道B获取时,消息中间件删除file1。在一种可能的实施方式中,消息中间件基于各个消费通道的消息读取位置判断是否存储在所有队列消息已被所有消费通道获取的消息存储文件。

和/或,步骤402,响应于磁盘中目标队列主题中的消息存储文件的文件数量大于预设文件数量,按照预设文件数量,将目标队列主题中文件创建时间最早的n个消息存储文件删除,n为正整数。

在一种可能的实施方式中,消息中间件预先设置有每个队列主题所能拥有的最多的消息存储文件,即预设文件数量,

可选的,消息中间件按照文件生成顺序,对各个消息存储文件进行编号,当新建消息存储文件对应的编号指示目标队列主题中消息存储文件的文件数量大于预设文件数量时,消息中间件进行文件删除操作;或者,消息中间件每隔预定时长检测一次各个队列主题对应的消息存储文件的文件数量,并进行文件清理。

示意性的,每个队列主题对应的预设文件数量为5,按照文件生成时间的先后顺序,Topic1对应的消息存储文件包括file1、file2、file3、file4、file5和file6,则消息中间件将Topic1中的file1删除,假设文件删除之前存在消息读取位置位于file1的消费通道,则消息中间件将该消费通道的消息读取位置调整至file2中第一个队列消息所在的位置。

和/或,步骤403,响应于目标队列主题下不存在消息消费方,保留目标队列主题中文件创建时间最晚的m个消息存储文件,并删除目标队列主题中的其它消息存储文件,m为正整数。

在一种可能的实施方式中,可能存在某一队列主题下的消息消费方长时间不进行消费,或所有的消息消费方均取消对队列消息的订阅的情况,即可认为该队列主题下不存在消息消费方,此时消息中间件保存较多的消息存储文件会浪费磁盘资源,因此,消息中间件只保存最新的m个消息存储文件。

示意性的,当目标队列主题下不存在消息消费方时,消息中间件仅保留目标队列主题中最新的1个消息存储文件,例如,Topic1下不存在消息消费方,消息中间件在file1中持续存储队列消息,当file1的数据量达到预设数据量时,消息中间件创建file2,继续在file2中写入队列消息,并删除flie1。

本申请实施例提供了三种消息存储文件的删除策略,用户可以根据实际的业务情况,设置合适的一个或多个删除策略,从而有效清理磁盘。

示意性的,当同时采取上述三种删除策略时,消息中间件清除消息存储文件的流程如图5所示:

步骤501,获取目标队列主题下消息存储文件的文件数量。

步骤502,判断文件数量是否大于预设文件数量。是则执行步骤503,否则执行步骤507。

步骤503,获取目标队列主题下各个消费通道的消息读取位置。

步骤504,判断是否需要移动消息读取位置。是则执行步骤505,否则执行步骤506。

步骤505,移动消息读取位置。

步骤506,将目标队列主题中文件创建时间最早的n个消息存储文件删除。

步骤507,判断是否存在消息消费方。是则执行步骤509,否则执行步骤508。

步骤508,保留目标队列主题中文件创建时间最晚的m个消息存储文件,并删除其它消息存储文件。

步骤509,判断目标消息存储文件中所有的队列消息是否被各个消费通道获取。是则执行步骤510,否则结束流程。

步骤510,删除目标消息存储文件。

相关技术中,消息中间件的各个队列主题通常均采用相同的消费模式,然而在IOT的应用场景中,边缘端设备业务模块较多,其产生的队列消息类型也较多,因此相关技术中的消费模式较为单一,为了满足边缘端设备对各个业务场景的需求,相关技术还需要部署更多的组件。在一种可能的实施方式中,不同属性的队列消息属于不同的队列主题,同一队列主题下包含至少一个消费通道,队列主题设置有消费模式,用户可以根据实际的业务需求,为各个队列主题设置合适的消费模式,不同队列主题的消费模式可以不同。在图3的基础上,请参考图6,步骤302还包括步骤302a:

步骤302a,基于目标消息存储文件的数据量,以及队列主题对应的消费模式,按照消息生成时间的先后顺序,将队列消息写入消息存储文件。

当队列主题的消费模式为第一消费模式(正常模式)时,步骤302a包括如下步骤:

步骤一,响应于目标消息存储文件的数据量未达到预设数据量,按照消息生成时间的先后顺序将队列消息写入目标消息存储文件。

步骤二,响应于所述目标消息存储文件的数据量达到所述预设数据量,生成新建消息存储文件,并按照所述消息生成时间的先后顺序将所述队列消息写入所述新建消息存储文件。

正常模式下,消息中间件持续接受并存储消息生产方发送的队列消息,并持续向在线的消息消费方发送队列消息,二者互不干扰。即消息消费方在线时,按照消息生成时间的先后顺序进行消费,当消息消费方离线时,队列消息也不会丢失。因此,消息中间件按照消息存储文件的预设数据量,正常存储队列消息。如图7所示,第一消费模式的流程为:步骤701,消息生产方发布队列消息;步骤702,消息中间件存储队列消息;步骤703;消息消费方在线消费。

正常模式主要应用于常规的设备间通讯的场景,或者不允许消息队列丢失的场景,例如风机等设备将采集到的数据发送至上游设备,或者消息中间件暂存部分某些消息,以便后续使用等。

当队列主题的消费模式为第二消费模式(广播模式)时,步骤302a包括如下步骤:

步骤三,响应于队列主题下的消息消费方均处于离线状态,丢弃队列消息。

广播模式下,对于消息生产方发布的队列消息,消息消费方在线时消费,不在线时不消费,消息中间件将消息消费方均处于离线状态期间接收到的队列消息丢弃。广播模式主要用于实时消息的传递,例如上游设备下发控制指令至下游的风机设备,该类消息不能积压,风机设备只需在线接收最新的控制指令即可。

步骤四,响应于队列主题下存在处于在线状态的消息消费方,基于目标消息存储文件的数据量,按照消息生成时间的先后顺序,将队列消息写入消息存储文件。

当存在处于在线状态的消息消费方时,消息中间件将接收到的队列消息发送给在线的消息消费方。如图8所示,第二消费模式对应的消息传输过程为:步骤801消息生产方发布队列消息;步骤802,消息中间件判断消息消费方是否在线,是则执行步骤803,否则执行步骤804;步骤803,消息消费方在线消费;步骤804,丢弃队列消息。

当队列主题的消费模式为第三消费模式(超时模式)时,本申请实施例中的消息传输方法还包括如下步骤:

步骤五,基于队列主题中最早写入的队列消息的消息生成时间与当前时刻,确定时间差。

超时模式下消息中间件只保留一定时间范围内的队列消息,对于超时的队列消息,无论有没有被消息消费方消费,消息中间件都会将其丢弃。

超时模式主要应用于传输通知类型的消息,例如云端下发了资源到边缘端,边缘端的某个设备接收到消息后,会将该消息转发至消息中间件,从而通知其它设备进行资源更新,此时有的设备可能更新较快,有的设备可能更新较慢,因此消息中间件允许该类消息存储一定时长。

步骤六,响应于时间差大于预设时间差,删除最早写入的队列消息。

时间差大于预设时间差时,说明该最早写入的队列消息已超时,则消息中间件将其丢弃。如图9所示,第三消费模式对应的消息传输过程为:步骤901,消息生产方发布队列消息;步骤902,消息中间件判断队列小时是否超时,是则执行步骤903,否则执行步骤904;步骤903,丢弃队列消息;步骤904;消息消费方在线消费。

在一种可能的实施方式中,用户可以通过设置队列主题的属性设置消费模式,从而可以根据需求随时切换各个队列主题的消费模式,本申请实施例中的消息传输方法还包括如下步骤:

步骤七,通过所述队列主题对应的模式切换接口接收模式切换指令,所述模式切换指令用于设置所述模式切换接口中的消费模式参数。

在一种可能的实施方式中,消息中间件中设置有面向用户的模式切换接口,用户调用模式切换接口,即可设置队列主题的属性。该模式切换接口中包含消费模式参数,用户可以通过交互界面选择相应的消费模式,从而使消息中间件接收到模式切换指令。

步骤八,将所述队列主题的消费模式切换为所述消费模式参数对应的所述消费模式。

消息中间件接收到模式切换指令后,立即将消费模式参数调整为模式切换指令所指示的消费模式参数,并继续按照调整后的消费模式参数对应的消费模式,进行队列消息的存储和传输。

本申请实施例中,提供了三种消费模式,每个队列主题设置单独的消费模式,并且用户可以随时切换任意一个队列主题的消费模式,满足了IOT边缘端复杂业务场景对消息传输的不同需求,提高了消息传输效率,避免存储和传输无效的队列消息。

图10是本申请一个示例性实施例提供的消息传输装置的结构框图,该装置包括:

写入模块1001,用于按照消息生成时间的先后顺序,将消息生产方发送的队列消息持久化写入磁盘;

第一调整模块1002,用于基于消息消费方已读取消息的索引信息,按照所述队列消息的写入顺序调整消费通道的消息读取位置,所述消息读取位置用于指示所述队列消息在磁盘中的存储位置;

读取模块1003,用于基于所述消息读取位置,通过所述消费通道从磁盘中读取所述队列消息;

发送模块1004,用于响应于所述消息消费方在线,将所述消费通道读取到的所述队列消息发送至所述消息消费方。

可选的,所述写入模块1001,包括:

获取单元,用于获取所述消息生产方发送的所述队列消息;

写入单元,用于基于目标消息存储文件的数据量,按照所述消息生成时间的先后顺序,将所述队列消息写入消息存储文件,所述目标消息存储文件为磁盘中文件生成时间最晚的所述消息存储文件。

可选的,所述第一写入单元,还用于:

响应于所述目标消息存储文件的数据量未达到预设数据量,按照所述消息生成时间的先后顺序将所述队列消息写入所述目标消息存储文件;

响应于所述目标消息存储文件的数据量达到所述预设数据量,生成新建消息存储文件,并按照所述消息生成时间的先后顺序将所述队列消息写入所述新建消息存储文件。

可选的,所述消息存储文件中关联存储有所述队列消息以及所述队列消息的消息标识,所述索引信息中包含所述已读取消息的文件标识和所述消息标识;

所述第一调整模块1002,包括:

确定单元,用于基于所述索引信息中的所述文件标识确定所述已读取消息对应的已读消息存储文件,并基于所述索引信息中的所述消息标识确定所述已读取消息在所述已读消息存储文件中的存储位置;

调整单元,用于基于所述已读取消息在所述已读消息存储文件中的存储位置以及所述队列消息的写入顺序,将所述消息读取位置移动至下一个所述队列消息的存储位置。

可选的,不同属性的所述队列消息属于不同的队列主题,同一所述队列主题下包含至少一个所述消费通道,所述消息消费方通过目标消费通道获取目标队列主题下的所述队列消息;

所述装置还包括:

第一删除模块,用于响应于所述消息存储文件中所有的所述队列消息已被所述目标队列主题下各个所述消费通道获取,删除所述消息存储文件;

和/或,

第二删除模块,用于响应于磁盘中所述目标队列主题中的所述消息存储文件的文件数量大于预设文件数量,按照所述预设文件数量,将所述目标队列主题中文件创建时间最早的n个所述消息存储文件删除,n为正整数;

和/或,

第三删除模块,用于响应于所述目标队列主题下不存在所述消息消费方,保留所述目标队列主题中所述文件创建时间最晚的m个所述消息存储文件,并删除所述目标队列主题中的其它消息存储文件,m为正整数。

可选的,不同属性的所述队列消息属于不同的队列主题,同一所述队列主题下包含至少一个所述消费通道,所述队列主题设置有消费模式;

所述写入单元,还用于:

基于所述目标消息存储文件的数据量,以及所述队列主题对应的所述消费模式,按照所述消息生成时间的先后顺序,将所述队列消息写入所述消息存储文件。

可选的,所述队列主题的所述消费模式为第一消费模式;

所述写入单元,还用于

响应于所述目标消息存储文件的数据量未达到预设数据量,按照所述消息生成时间的先后顺序将所述队列消息写入所述目标消息存储文件;

响应于所述目标消息存储文件的数据量达到所述预设数据量,生成新建消息存储文件,并按照所述消息生成时间的先后顺序将所述队列消息写入所述新建消息存储文件。

可选的,所述队列主题的所述消费模式为第二消费模式;

所述写入单元,还用于:

响应于所述队列主题下的所述消息消费方均处于离线状态,丢弃所述队列消息;

响应于所述队列主题下存在处于在线状态的所述消息消费方,基于所述目标消息存储文件的数据量,按照所述消息生成时间的先后顺序,将所述队列消息写入所述消息存储文件。

可选的,所述队列主题对应的所述消费模式为第三消费模式;

所述装置还包括:

确定模块,用于基于所述队列主题中最早写入的队列消息的所述消息生成时间与当前时刻,确定时间差;

第四删除模块,用于响应于所述时间差大于预设时间差,删除所述最早写入的队列消息。

可选的,所述装置还包括:

接收模块,用于通过所述队列主题对应的模式切换接口接收模式切换指令,所述模式切换指令用于设置所述模式切换接口中的消费模式参数;

第二调整模块,用于将所述队列主题的消费模式切换为所述消费模式参数对应的所述消费模式。

请参考图11,其示出了本申请一个示例性实施例提供的计算机设备的结构示意图。具体来讲:所述计算机设备1100包括中央处理单元(Central Processing Unit,CPU)1101、包括随机存取存储器1102和只读存储器1103的系统存储器1104,以及连接系统存储器1104和中央处理单元1101的系统总线1105。所述计算机设备1100还包括帮助计算机内的各个器件之间传输信息的基本输入/输出系统(Input/Output,I/O系统)1106,和用于存储操作系统1113、应用程序1114和其他程序模块1115的大容量存储设备1107。

所述基本输入/输出系统1106包括有用于显示信息的显示器1108和用于用户输入信息的诸如鼠标、键盘之类的输入设备1109。其中所述显示器1108和输入设备1109都通过连接到系统总线1105的输入输出控制器1110连接到中央处理单元1101。所述基本输入/输出系统1106还可以包括输入输出控制器1110以用于接收和处理来自键盘、鼠标、或电子触控笔等多个其他设备的输入。类似地,输入输出控制器1110还提供输出到显示屏、打印机或其他类型的输出设备。

所述大容量存储设备1107通过连接到系统总线1105的大容量存储控制器(未示出)连接到中央处理单元1101。所述大容量存储设备1107及其相关联的计算机可读介质为计算机设备1100提供非易失性存储。也就是说,所述大容量存储设备1107可以包括诸如硬盘或者驱动器之类的计算机可读介质(未示出)。

不失一般性,所述计算机可读介质可以包括计算机存储介质和通信介质。计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模块或其他数据等信息的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括随机存取记忆体(RAM,Random Access Memory)、只读存储器(ROM,Read Only Memory)、闪存或其他固态存储其技术,只读光盘(Compact Disc Read-Only Memory,CD-ROM)、数字通用光盘(Digital Versatile Disc,DVD)或其他光学存储、磁带盒、磁带、磁盘存储或其他磁性存储设备。当然,本领域技术人员可知所述计算机存储介质不局限于上述几种。上述的系统存储器1104和大容量存储设备1107可以统称为存储器。

存储器存储有一个或多个程序,一个或多个程序被配置成由一个或多个中央处理单元1101执行,一个或多个程序包含用于实现上述方法的指令,中央处理单元1101执行该一个或多个程序实现上述各个方法实施例提供的方法。

根据本申请的各种实施例,所述计算机设备1100还可以通过诸如因特网等网络连接到网络上的远程计算机运行。也即计算机设备1100可以通过连接在所述系统总线1105上的网络接口单元1111连接到网络1112,或者说,也可以使用网络接口单元1111来连接到其他类型的网络或远程计算机系统(未示出)。

所述存储器还包括一个或者一个以上的程序,所述一个或者一个以上程序存储于存储器中,所述一个或者一个以上程序包含用于进行本申请实施例提供的方法中由计算机设备所执行的步骤。

本申请实施例还提供了一种计算机可读存储介质,该计算机可读存储介质存储有至少一条指令,所述至少一条指令由处理器加载并执行以实现如上各个实施例所述的消息传输方法。

根据本申请的一个方面,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述方面的各种可选实现方式中提供的消息传输方法。

本领域技术人员应该可以意识到,在上述一个或多个示例中,本申请实施例所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读存储介质中或者作为计算机可读存储介质上的一个或多个指令或代码进行传输。计算机可读存储介质包括计算机存储介质和通信介质,其中通信介质包括便于从一个地方向另一个地方传送计算机程序的任何介质。存储介质可以是通用或专用计算机能够存取的任何可用介质。

以上所述仅为本申请的可选实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

相关技术
  • 消息中间件消息传输方法、装置、计算机设备和存储介质
  • 一种消息传输方法、消息转发设备及存储介质
技术分类

06120112923401