CN114979249A - 消息句柄的创建方法、消息推送方法及相关装置和系统 - Google Patents
消息句柄的创建方法、消息推送方法及相关装置和系统 Download PDFInfo
- Publication number
- CN114979249A CN114979249A CN202210331159.6A CN202210331159A CN114979249A CN 114979249 A CN114979249 A CN 114979249A CN 202210331159 A CN202210331159 A CN 202210331159A CN 114979249 A CN114979249 A CN 114979249A
- Authority
- CN
- China
- Prior art keywords
- message
- handle
- queue
- server
- timing task
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 73
- 238000012790 confirmation Methods 0.000 claims description 53
- 230000002085 persistent effect Effects 0.000 claims description 23
- 238000004590 computer program Methods 0.000 claims description 22
- 238000003860 storage Methods 0.000 claims description 21
- 238000006073 displacement reaction Methods 0.000 claims description 3
- 238000012546 transfer Methods 0.000 claims description 2
- 206010033799 Paralysis Diseases 0.000 abstract description 3
- 230000003111 delayed effect Effects 0.000 abstract description 3
- 230000000694 effects Effects 0.000 abstract description 2
- 230000002411 adverse Effects 0.000 abstract 1
- 238000010586 diagram Methods 0.000 description 12
- 230000008569 process Effects 0.000 description 6
- 238000005516 engineering process Methods 0.000 description 4
- 230000006870 function Effects 0.000 description 4
- 238000012545 processing Methods 0.000 description 4
- 230000007246 mechanism Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 3
- 230000004048 modification Effects 0.000 description 3
- 230000004044 response Effects 0.000 description 3
- 230000002159 abnormal effect Effects 0.000 description 1
- 238000009825 accumulation Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000002360 preparation method Methods 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/14—Session management
- H04L67/146—Markers for unambiguous identification of a particular session, e.g. session cookie or URL-encoding
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L69/00—Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
- H04L69/22—Parsing or analysis of headers
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L69/00—Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
- H04L69/28—Timers or timing mechanisms used in protocols
Abstract
本发明公开了一种消息句柄的创建方法、消息推送方法和相关装置和系统。所述消息句柄的创建方法包括:响应于接收到的消费者客户端发送的对队列的订阅请求,从预先保存的所述订阅请求对应的队列中读取消息;为读取的所述消息创建消息句柄和对应的定时任务,所述定时任务用于在所述消息对应的预设的消息重试间隔到达时,触发服务端删除所述消息对应的消息句柄,以使得服务端能够重新推送所述消息。本发明可避免服务端被大量的消息句柄占满内存而瘫痪,也可避免消息长时间未被消费或者延迟消费对相关应用带来的不良影响。
Description
技术领域
本发明涉及消息中间件技术领域,特别涉及一种消息句柄的创建方法、消息推送方法和相关装置和系统。
背景技术
在AMQP(一种面向消息中间件设计的应用层协议,是一个标准的开放协议)消息模型下,消费者客户端订阅某些队列(Queue)的消息,服务端会将这些queue中的消息推送给消费者客户端。当订阅Queue时设置的消息确认机制为手动确认,在这种机制下,服务端在没有收到消费者客户端的确认报文之前,不会认为用户已经成功消费该条消息。
开源RabbitMQ是用Erlang语言实现了高级消息队列协议(AMQP)的开源消息代理软件,在开源RabbitMQ的实现中,消费者客户端与服务端建立的连接(Connection)没有与服务端断开之前,且服务端没有收到消费者客户端的确认,消息不会重投给用户,这就给了用户足够的时间去消费一条消息,但与此同时也带来了一些问题:
对于服务端而言,当大量的消息都处于待消费者客户端确认的状态,开源RabbitMQ的服务端内存会一直存储这些消息的句柄,从而在积累一定量的情况下,服务端因内存爆满不断垃圾回收(GC)而瘫痪。
另外,如果消费者客户端因为某些问题出现异常而无法关闭Connection,或是无法通过心跳方式而由服务端关闭Connection,则待消费者确认的消息将一直处于“未被消费”的状态,而对于大多数应用而言,其产生的消息需要被及时消费,如果消息的长时间不被消费或者被延迟消费,对这些应用来说是无法忍受的。
发明内容
鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的一种消息句柄的创建方法、消息推送方法和相关装置和系统。
第一方面,本发明实施例提供一种消息句柄的创建方法,包括:
响应于接收到的消费者客户端发送的对队列的订阅请求,从预先保存的所述订阅请求对应的队列中读取消息;
为读取的所述消息创建消息句柄和对应的定时任务,所述定时任务用于在所述消息对应的预设的消息重试间隔到达时,触发服务端删除所述消息对应的消息句柄,以使得服务端能够重新推送所述消息。
在一个实施例中,从预先保存的所述订阅请求对应的队列中读取消息之后,还包括:
为读取的所述消息创建唯一的消息标识,所述消息标识包括:连接标识、通道标识和传送标签。
在一个实施例中,为读取的所述消息创建消息句柄,包括:
创建消息句柄的数据内容,并将消息句柄的数据内容存储于预设的堆外区域;
将所述消息句柄的数据内容在所述堆外区域的存储地址作为所述消息句柄的索引;
将所述消息标识和所述消息句柄的索引,存储于预设的堆内区域。
在一个实施例中,所述创建消息句柄的数据内容,包括:
创建下述任一项或多项数据:
所述消息持久化存储所在队列的队列标识;
所述消息所在的定时任务的标识;
所述消息在持久化存储所在队列中的逻辑位移信息;
所述消息的标识;
所述消息的重试次数。
在一个实施例中,为读取的所述消息创建对应的定时任务,包括:
将当前时间戳和所述消息对应的预设消息重试间隔作为所述消息对应的定时任务标识;
根据所述当前时间戳和预设的消息重试间隔,创建对应的定时任务;所述消息重试间隔为所述定时任务的所述超时时间;
若多个消息的当前时间戳和预设消息重试间隔均相同,则所述多个消息共享同一定时任务。
在一个实施例中,所述方法还包括:
若所述消息对应的定时任务的超时时间到达,则删除所述堆内区域所述消息对应的消息标识和消息句柄的索引,以及所述堆外区域所述消息句柄的数据内容。
第二方面,本发明实施例提供一种消息的推送方法,包括:
将消息队列中消费者客户端订阅的消息发送给消费者客户端;
若接收到消费者客户端发送的确认报文,则查看是否存在所述消息所对应的消息句柄;所述消息句柄对应定时任务,所述定时任务用于在所述消息对应的预设的消息重试间隔到达时,触发服务端删除所述消息对应的消息句柄,以使得服务端能够重新推送所述消息;
若不存在,则确定所述确认报文无效;
若存在,则确定所述确认报文有效。
在一个实施例中,确定所述确认报文有效之后,还包括:
删除预设堆内区域缓存的所述消息对应的消息标识和消息句柄的索引,以及预设的堆外区域缓存的所述消息句柄的数据内容;
删除所述消息句柄对应的所述定时任务,或者删除多个消息句柄共享的所述定时任务中所述消息句柄对应的信息。
将所述消息的消费位点提交至所述消息队列所在的持久化存储空间,以使得所述消息不再被消费者客户端消费。
在一个实施例中,所述方法还包括:
若所述定时任务的超时时间到达,则删除预设堆内区域缓存的所述消息对应的消息标识和消息句柄的索引,以及预设的堆外区域缓存的所述消息句柄的数据内容;
向所述消费者客户端重新发送所述消息。
在一个实施例中,向所述消费者客户端重新发送所述消息之后,还包括:
记录重新发送所述消息的次数,若所记录的重新发送所述消息的次数达到预设的重发上限值,则停止重新发送所述消息至所述消费者客户端;
判断消息所在的消息队列是否预先配置有死信路由属性,若有,则将消息发送至该消息队列对应的死信队列,若无,则丢弃所述消息。
第三方面,本发明实施例提供一种消息的推送方法,包括:
将消息队列中消费者客户端订阅的消息发送给消费者客户端;
若接收到消费者客户端发送的确认报文,则查看是否存在所述消息所对应的消息句柄;
若不存在,则确定所述确认报文无效;
若存在所述消息句柄,则确定所述确认报文有效;
所述消息句柄是通过如前述的消息句柄的创建方法生成的。
第四方面,本发明实施例提供一种消息句柄的创建装置,包括:
消息读取模块,用于响应于接收到的消费者客户端发送的对队列的订阅请求,从预先保存的所述订阅请求对应的队列中读取消息;
创建模块,用于为读取的所述消息创建对应的消息句柄和定时任务,所述定时任务用于在所述消息对应的预设的消息重试间隔到达时,触发服务端删除所述消息对应的消息句柄,以使得服务端能够重新推送所述消息。
第五方面,本发明实施例提供一种消息的推送装置,包括:
发送模块,用于将消息队列中消费者客户端订阅的消息发送给消费者客户端;
消息句柄确认模块,用于若接收到消费者客户端发送的确认报文,则查看是否存在所述消息所对应的消息句柄;所述消息句柄对应定时任务,所述定时任务用于在所述消息对应的预设的消息重试间隔到达时,触发服务端删除所述消息对应的消息句柄,以使得服务端能够重新推送所述消息;
报文确认模块,用于若消息句柄确认模块确认消息句柄不存在,则确定所述确认报文无效;若消息句柄确认模块确认消息句柄存在,则确定所述确认报文有效。
第六方面,本发明实施例提供一种服务器,包括:存储器、处理器及存储于存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如前述的消息句柄的创建方法,和/或实现如前述的消息的推送方法。
第七方面,本发明实施例提供一种消息的转发系统,包括至少一消费者客户端和如前述的服务器;
所述消费者客户端,用于与所述服务器建立连接,接收所述服务器转发的所订阅的队列中的消息。
第八方面,本发明实施例提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如前述的消息句柄的创建方法,和/或实现如前述的消息的推送方法。
第九方面,本发明实施例提供一种计算机程序产品,所述计算机程序产品包括计算机程序,所述计算机程序被处理器执行时实现如前述的消息句柄的创建方法,和/或实现如前述的消息的推送方法。
本发明实施例提供的上述技术方案的有益效果至少包括:
本发明实施例提供的上述消息句柄的创建方法、消息推送方法和相关装置和系统,服务端为读取的队列中的消息,创建消息句柄和对应的定时任务,定时任务在消息对应的预设的消息重试间隔达到时,可触发服务端删除该消息句柄,并为服务端重新推送该消息做准备,这样的设计,在服务端在预设的消息重试间隔到达时,即使未收到消费者客户端的消息确认报文,也会将消息重新推送给消费者客户端,这样可避免服务端被大量的消息句柄占满内存而瘫痪,也可避免消息长时间未被消费或者延迟消费对相关应用带来的不良影响。另外,本发明实施例中,对于消息重新间隔,由于可以预先自由定义,相对于固定的时间间隔而言,可以更灵活地满足不同消息种类、不同消费者客户端类型的消息重试的需求。
本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
附图说明
附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。在附图中:
图1为本发明实施例中消息句柄的创建方法的流程图;
图2为本发明实施例中为读取的所述消息创建对应的消息句柄的实现流程图;
图3为本发明实施例中消息的推送方法的流程图;
图4和图5为本发明实施例中实例的流程示意图;
图6为本发明实施例中消息句柄的创建装置的结构框图;
图7为本发明实施例中消息的推送装置的结构框图;
图8为本发明实施例中消息的转发系统的结构框图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
消息中间件技术中,消息(Message)是指在应用间传送的数据,消息所在的消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到MQ中而不用管谁来取,消息使用者只管从MQ中取消息而不管是谁发布的。例如开源的RabbitMQ或者类似技术,通常涉及到三方,即消息生产者、服务端和消费者客户端,消息生产者产生消息并发布,服务端负责将消息存储于队列中并持久化存储,在消费者客户端订阅了队列中的消息时,向消费者客户端推送对应的消息,消费者客户端接收消息并确认,也即“消费”了消息。
现有技术中,消费者客户端与服务端之间的连接未断开之前,服务端还未收到消费者客户端的确认报文,消息不会重投给消费者客户端。一方面,这样做会造成大量的消息处于待消费者客户端确认的状态,服务端内存会一直存储这些这些消息的句柄,积累到一定量,可能会导致服务端因内存爆满而瘫痪,同时,对于消息的产生者(例如应用)而言,更多地是希望该消息能够尽早被消费者客户端消费。基于这些问题,本发明的发明人,对服务端的对消息句柄的创建流程以及消息的推送流程进行了改进,提供了一种消息重试机制,以解决现有技术中存在的上述问题。
本发明实施例提供了一种消息句柄的创建方法,参照图1所示,包括:
S11、响应于接收到的消费者客户端发送的对队列的订阅请求,从预先保存的订阅请求对应的队列中读取消息;
S12、为读取的消息创建消息句柄和对应的定时任务,定时任务用于在消息对应的预设的消息重试间隔到达时,触发服务端删除消息对应的消息句柄,以使得服务端能够重新推送所述消息。
本发明实施例提供的上述消息句柄的创建方法,为读取的队列中的消息,创建消息句柄和对应的定时任务,定时任务在消息对应的预设的消息重试间隔达到时,可触发服务端删除该消息句柄,并为服务端重新推送该消息做准备,这样的设计,在服务端在预设的消息重试间隔到达时,即使未收到消费者客户端的消息确认报文,也会将消息重新推送给消费者客户端,这样可避免服务端被大量的消息句柄占满内存而瘫痪,也可避免消息长时间未被消费或者延迟消费对相关应用带来的不良影响。另外,本发明实施例中,对于消息重新间隔,由于可以预先自由定义,相对于固定的时间间隔而言,可以更灵活地满足不同消息种类、不同消费者客户端类型的消息重试的需求。
需要进行说明的是,在上述步骤S11之前,服务端接收消息发布者发布的消息并将其放入对应的队列中,将队列持久化存储(例如存储于磁盘当中),并且消费者客户端已经与服务端建立了连接,这种连接例如可以是TCP连接,在每个TCP连接中,可进一步建立多个通道(Channel),每个通道代表一个会话任务。
当消费者客户端想要订阅某种队列的消息,则会触发上述步骤S11和S12的执行。
基于上述S11前序的步骤,则步骤S11中可以从预先保存的订阅请求对应的队列所在的持久化存储结构中读取消息。
在一个实施例中,执行上述步骤S11从预先保存的订阅请求对应的队列中读取消息后,还可以为读取的该消息创建唯一的消息标识,消息标识例如包括下述字段信息:连接标识(Connection)、通道标识(Channel)和传送标签(DeliveryTag)。
步骤S12中,为读取的所述消息创建对应的消息句柄,参照图2所示,例如可以通过下述方式实现:
S21、创建消息句柄的数据内容,并将消息句柄的数据内容存储于预设的堆外区域;
S22、将消息句柄的数据内容在堆外区域的存储地址作为消息句柄的索引;
S23、将消息标识和消息句柄的索引,存储于预设的堆内区域。
堆内区域也即堆内内存(heap)的区域,堆外区域也即非堆内内存的区域。
在本发明实施例中,将消息标识和消息句柄的索引、消息句柄的数据内容分开存储,将占用大量内存的消息句柄的数据内容放在堆外区域,可以避免堆内内存频繁使用影响性能,使用时,消息标识、消息句柄的索引关联存储于堆内区域,通过消息标识可确定消息句柄的索引,通过消息句柄的索引,可以更快地在内存中查询到消息句柄的本身的数据,提高了服务端的处理消息的效率,使得消费者客户端可以更快地消费到该消息。
在一个实施例中,消息句柄的数据内容可包含下述任一项或多项数据:
消息持久化存储所在队列的队列标识;
消息所在的定时任务的标识;
消息在持久化存储所在队列中的逻辑位移信息;
消息的标识(msgId);
消息的重试次数。
上述消息的重试次数是可能随着重试次数的变化而实时记录的,即当服务端确定在预设的消息重试间隔内未收到消费者客户端对消息的确认报文,就认为消费者客户端此次消费消息失败,就会重投这条消息给该消费者客户端,这种操作就算一次消息重试,这个消息的重试次数的数据会根据重试的实际产生次数而更新。
在一个实施例中,为读取的所述消息创建对应的定时任务,例如可以通过下述方式实现:
将当前时间戳和消息对应的预设消息重试间隔作为消息对应的定时任务标识;
根据当前时间戳和预设的消息重试间隔,创建对应的定时任务;消息重试间隔为所述定时任务的所述超时时间。
例如建立一个二元组[当前时间戳(单位秒),消息重试间隔(单位秒)]来唯一标识一个定时任务。
较佳地,若多个消息的当前时间戳和预设消息重试间隔均相同,则在服务端,多个消息可共享同一定时任务。
例如,如果多个消息均拥有相同的二元组信息,则多个消息可以复用同一个定时任务。
针对同一秒所有连接(Connection)下所有通道(Channel)的未确认消息,若其预设的消息重试间隔相同,则都可使用同一个定时任务(定时的超时时长为预设的队列的消息重试间隔),相比现有技术中,消息队列RabbitMQ为每条消息都创建一个定时任务,可节省大量的堆内存空间,使得内存可以存放更多的消息句柄。
在本发明实施例中,若所述消息对应的定时任务的超时时间到达,则删除堆内区域中消息对应的消息标识和消息句柄的索引,以及堆外区域中消息句柄的数据内容。
消息句柄的索引和数据内容均被删除后,服务端可为消息者客户端重新推送该消息,一方面避免消息句柄占用大量内存导致服务端的崩溃,另一方面可使得服务端可再次推送该消息,避免消息的长时间延迟消费引发的例如应用卡顿、延迟响应等一系列问题。
在本发明实施例中,若消息对应的定时任务未到达超时时间,服务端就已经收到了消费者客户端回复的确认报文,则也会执行删除消息句柄的操作,并且到持久化存储中提交该消息的位点,该消息将不再被其他消费者客户端消息费到。具体的流程详见本发明实施例提供的下述消息的推送方法。
参照图3所示,本发明实施例提供的消息的推送方法,包括下述步骤:
S31、将消息队列中消费者客户端订阅的消息发送给消费者客户端;
S32、若接收到消费者客户端发送的确认报文,则查看是否存在消息所对应的消息句柄;该消息句柄对应定时任务,定时任务用于在消息对应的预设的消息重试间隔到达时,触发服务端删除所述消息对应的消息句柄,以使得服务端能够重新推送该消息;若不存在,则执行下述步骤S33;若存在,则执行下述步骤S34;
S33、确定该确认报文无效;
S34、确定该确认报文有效。
若消息句柄的相关信息和数据,在收到确认报文之前已经被删除(根据定时任务,服务端已将消息句柄的索引和数据内容从堆内区域和堆外区域删除),则该确认报文的发送间隔已经超出了消息重试间隔,当前确认报文无效,流程结束。
反之,若消息句柄的相关信息和数据,在收到确认报文之前未被删除,则确认该报文的发送间隔未超出消息重试间隔,该确认报文有效。
上述步骤S34确定该确认报文有效后,也会执行删除消息句柄的数据的步骤,即删除预设堆内区域缓存的所述消息对应的消息标识和消息句柄的索引,以及预设的堆外区域缓存的所述消息句柄的数据内容;删除所述消息句柄对应的所述定时任务,或者删除多个消息句柄共享的定时任务中消息句柄对应的信息。
由于报文已确认有效,则其消息对应的定时任务也自然失去了作用,因此虽然还未到超时时间(即预设的消息重试间隔),但也可删除定时任务中该消息的标识。
若该定时任务只与一个消息句柄对应,那么可以直接删除该定时任务,若该定时任务为多个消息句柄所共享,则将定时任务中与该句柄相关的信息进行删除即可。
在一个实施例中,上述步骤S34确定该确认报文有效之后,还需要将消息的消费位点提交至消息队列所在的持久化存储空间,以使得消息不再被其他消费者客户端消费。
在一个实施例中,若所述定时任务的超时时间到达,则删除预设堆内区域缓存的消息对应的消息标识和消息句柄的索引,以及预设的堆外区域缓存的消息句柄的数据内容;向消费者客户端重新发送该消息。
在一个实施例中,在向所述消费者客户端重新发送所述消息之后,记录重新发送消息的次数,若所记录的重新发送消息的次数达到预设的重发上限值,则停止重新发送所述消息至所述消费者客户端。进一步地,还可以通过提交所述消息在持久化存储空间的消费位点,并判断该消息所在的消息队列是否预先配置有死信路由属性,若配置有,则将消息发送至该消息队列对应的死信队列,若未配置有死信路由属性,则直接丢弃。
为了更好地说明本发明实施例提供的上述消息句柄的创建方法和消息推送方法,下面以一个具体的实例进行说明:
在该实例中,消息中间件技术采用高级消息队列协议(AMQP),在该实例中,涉及到消息生产者、AMQP服务器和消费者客户端。
该实例的流程可参照图4和图5。该流程的步骤包括:
1.消息生产者发送AMQP协议消息至AMQP服务端;
2.AMQP服务端路由组件通过消息路由属性,将受到的消息发送到对应的queue中。
3.AMQP服务端将消息存入持久化存储空间中(例如磁盘中)。
参照图4所示,AMQP服务端将queue1和queue2进行持久化存储。queue1和queue2中分别包含若干个消息例如msg1、msg2等。
4.消费者客户端与AMQP服务端之间创建Connection和Channel,并订阅某个队列(queue)的消息。参照图4所示,例如订阅了queue2的消息。
5.AMQP服务端根据消费者客户端订阅情况,从磁盘中读取相应queue的消息。
6.AMQP服务端为读取的消息在当前channel上创建唯一的deliveryTag。
AMQP服务端在本地创建三元组:[connection(连接标识),channel(通道号),deliveryTag(传输标签)]用于服务端与消费者客户端唯一标识一条消息。
AMQP服务端在本地创建二元组:[当前时间戳(单位秒),消息重试间隔(单位秒)]唯一标识一个定时任务,AMQP服务端通过该二元组信息[当前时间戳,queue的重试间隔],为该消息寻找一个定时任务(若没有,则创建一个),即所有拥有相同二元组的消息可复用同一个定时任务。
7.AMQP服务端为读取的消息创建消息句柄。
该消息句柄用于消费者客户端确认消息时,AMQP服务端在持久化存储中提交该消息的消费位点。
通过堆外缓存框架offHeapMap在堆内区域存储消息句柄的索引(也即在堆外区域),消息句柄的实际数据内容存储在堆外区域缓存框架offHeapMap管理的堆外内存中,消息句柄的数据结构包含:
1)队列(queue)标识:表征该消息持久化存储所在的queue。
2)超时时间(ackTimeout):表征该消息持久化存储所在queue的消息重试间隔,是该消息的重试间隔,也是该消息所在定时任务的超时时间;超时若没有收到消费者客户端的确认报文,则AMQP服务端会认为该消息消费失败。
3)定时任务标识(taskId):该消息所在定时任务,定时任务到期后,会将自己所管理的没有收到消费者客户端确认报文的消息句柄从内存中逐出,为服务端重新推送该消息做准备。
4)持久化存储信息,具体包括:消息在持久化存储中在所属queue中的逻辑位移等信息,如果消费者客户端在ackTimeout时间内发送报文确认该消息,会提交该消息的消费位点。
5)其他:该消息的其他信息,诸如:msgId,消息重试次数等。
例如如图4所示,在堆内区域,存储有消息的消息的标识(channel=1deliveryTag=1等等)、定时任务的信息(timer task1、timer task2等)。
queue1的msg1消息和queue1的msg2消息复用同一定时任务即timer task1。Queue2的msg1消息和queue2的msg2消息复用同一定时任务即timer task2。
堆外区域存储有各个消息句柄的实际数据内容,每个消息句柄的数据内容(msghandler data)包括:队列标识(例如queue1、queue2等)、定时任务预设的超时时间(即消息的重试间隔)为60s(ackTimerout=60s),定时任务的标识(taskId=1、taskId=2等),各消息对应的持久化存储信息等。
8.AMQP服务端将该消息发送给消费者客户端。
9.消费者客户端1和消费者客户端2发送确认报文到AMQP服务端。
10.AMQP服务端收到确认报文后,将会查看内存中是否还存在标识为三元组[connection,channel,deliveryTag]的消息对应的消息句柄;此时分为下面两种不同的情况:
a.AMQP服务端发现消费者客户端1的确认报文对应的消息句柄还在内存中,则转向步骤11。
b.AMQP服务端发送消费者客户端2的确认报文对应的消息句柄已不再内存中(在此之前该消息的定时任务2已经将该消息句柄从堆内区域和堆外区域清除),则表示当前消费者客户端2确认报文的发送间隔超过了消息重试间隔,则当前确认报文无效,流程结束。
11.AMQP服务端存在该消息句柄,则表示当前确认报文合法。
例如堆外缓存框架(offHeapMap)会将该消息的句柄从堆外区域和堆内区域清除,定时任务也会清除该消息相关内容(因为多个消息共享同一个定时任务,删除时不能将该定时任务删除,只能将定时任务中与该消息相关的信息删除)。
参照图5所示,确认报文合法后,将堆内区域中消息的标识、消息句柄的索引,以及堆外区域中消息句柄的数据内容,均删除。
12.AMQP服务端到持久化存储中提交该消息的位点,该消息将不会再被其他消费者客户端消费到。
参照图5所示,AMQP服务端到持久化存储提交该消息的位点后,该消息不会再被消费者客户端消费。
本发明实施例还提供了另一种消息的推送方法,该方法的步骤与前述消息的推送方法类似,包括下述步骤:
将消息队列中消费者客户端订阅的消息发送给消费者客户端;
若接收到消费者客户端发送的确认报文,则查看是否存在所述消息所对应的消息句柄;
若不存在,则确定所述确认报文无效;
若存在所述消息句柄,则确定所述确认报文有效;
其中,上述步骤中的消息句柄可由前述实施例中消息句柄的创建方法得到。
基于同一发明构思,本发明实施例还提供了一种消息句柄的创建装置、消息的推送装置和服务器和消息转发系统,由于这些装置、服务器和系统所解决问题的原理与前述消息句柄的创建方法、消息的推送方法相似,因此该装置、服务器和系统的实施可以参见前述方法的实施,重复之处不再赘述。
本发明实施例提供的一种消息句柄的创建装置,参照图6所示,包括:
消息读取模块61,用于响应于接收到的消费者客户端发送的对队列的订阅请求,从预先保存的所述订阅请求对应的队列中读取消息;
创建模块62,用于为读取的所述消息创建对应的消息句柄和定时任务,所述定时任务用于在所述消息对应的预设的消息重试间隔到达时,触发服务端删除所述消息对应的消息句柄,以使得服务端能够重新推送所述消息。
本发明实施例提供的一种消息的推送装置,参照图7所示,包括:
发送模块71,用于将消息队列中消费者客户端订阅的消息发送给消费者客户端;
消息句柄确认模块72,用于若接收到消费者客户端发送的确认报文,则查看是否存在所述消息所对应的消息句柄;所述消息句柄对应定时任务,所述定时任务用于在所述消息对应的预设的消息重试间隔到达时,触发服务端删除所述消息对应的消息句柄,以使得服务端能够重新推送所述消息;
报文确认模块73,用于若消息句柄确认模块确认消息句柄不存在,则确定所述确认报文无效;若消息句柄确认模块确认消息句柄存在,则确定所述确认报文有效。
本发明实施例提供了一种服务器,包括:存储器、处理器及存储于存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如前述的消息句柄的创建方法,和/或实现如前述的消息的推送方法。
本发明实施例提供了一种消息的转发系统,参照图8所示,包括至少一消费者客户端81和如前述的服务器82;
消费者客户端81,用于与所述服务器82建立连接,接收所述服务器转发的所订阅的队列中的消息。
本发明实施例提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如前述的消息句柄的创建方法,和/或实现如前述的消息的推送方法。
本发明实施例提供了一种计算机程序产品,所述计算机程序产品包括计算机程序,所述计算机程序被处理器执行时实现如前述的消息句柄的创建方法,和/或实现如前述的消息的推送方法。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器和光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
Claims (14)
1.一种消息句柄的创建方法,其特征在于,包括:
响应于接收到的消费者客户端发送的对队列的订阅请求,从预先保存的所述订阅请求对应的队列中读取消息;
为读取的所述消息创建消息句柄和对应的定时任务,所述定时任务用于在所述消息对应的预设的消息重试间隔到达时,触发服务端删除所述消息对应的消息句柄,以使得服务端能够重新推送所述消息。
2.如权利要求1所述的方法,其特征在于,从预先保存的所述订阅请求对应的队列中读取消息之后,还包括:
为读取的所述消息创建唯一的消息标识,所述消息标识包括:连接标识、通道标识和传送标签。
3.如权利要求2所述的方法,其特征在于,为读取的所述消息创建消息句柄,包括:
创建消息句柄的数据内容,并将消息句柄的数据内容存储于预设的堆外区域;
将所述消息句柄的数据内容在所述堆外区域的存储地址作为所述消息句柄的索引;
将所述消息标识和所述消息句柄的索引,存储于预设的堆内区域。
4.如权利要求3所述的方法,其特征在于,所述创建消息句柄的数据内容,包括:
创建下述任一项或多项数据:
所述消息持久化存储所在队列的队列标识;
所述消息所在的定时任务的标识;
所述消息在持久化存储所在队列中的逻辑位移信息;
所述消息的标识;
所述消息的重试次数。
5.如权利要求3所述的方法,其特征在于,为读取的所述消息创建对应的定时任务,包括:
将当前时间戳和所述消息对应的预设消息重试间隔作为所述消息对应的定时任务标识;
根据所述当前时间戳和预设的消息重试间隔,创建对应的定时任务;所述消息重试间隔为所述定时任务的所述超时时间;
若多个消息的当前时间戳和预设消息重试间隔均相同,则所述多个消息共享同一定时任务。
6.如权利要求5所述的方法,其特征在于,还包括:
若所述消息对应的定时任务的超时时间到达,则删除所述堆内区域所述消息对应的消息标识和消息句柄的索引,以及所述堆外区域中所述消息句柄的数据内容。
7.一种消息的推送方法,其特征在于,包括:
将消息队列中消费者客户端订阅的消息发送给消费者客户端;
若接收到消费者客户端发送的确认报文,则查看是否存在所述消息所对应的消息句柄;所述消息句柄对应定时任务,所述定时任务用于在所述消息对应的预设的消息重试间隔到达时,触发服务端删除所述消息对应的消息句柄,以使得服务端能够重新推送所述消息;
若不存在,则确定所述确认报文无效;
若存在,则确定所述确认报文有效。
8.如权利要求7所述的方法,其特征在于,确定所述确认报文有效之后,还包括:
删除预设堆内区域缓存的所述消息对应的消息标识和消息句柄的索引,以及预设的堆外区域缓存的所述消息句柄的数据内容;
删除所述消息句柄对应的所述定时任务,或者删除多个消息句柄共享的所述定时任务中所述消息句柄对应的信息;
将所述消息的消费位点提交至所述消息队列所在的持久化存储空间,以使得所述消息不再被消费者客户端消费。
9.如权利要求7或8所述的方法,其特征在于,还包括:
若所述定时任务的超时时间到达,则删除预设堆内区域缓存的所述消息对应的消息标识和消息句柄的索引,以及预设的堆外区域缓存的所述消息句柄的数据内容;
向所述消费者客户端重新发送所述消息。
10.如权利要求9所述的方法,其特征在于,向所述消费者客户端重新发送所述消息之后,还包括:
记录重新发送所述消息的次数,若所记录的重新发送所述消息的次数达到预设的重发上限值,则停止重新发送所述消息至所述消费者客户端;
判断消息所在的消息队列是否预先配置有死信路由属性,若有,则将消息发送至该消息队列对应的死信队列,若无,则丢弃所述消息。
11.一种消息的推送方法,其特征在于,包括:
将消息队列中消费者客户端订阅的消息发送给消费者客户端;
若接收到消费者客户端发送的确认报文,则查看是否存在所述消息所对应的消息句柄;
若不存在,则确定所述确认报文无效;
若存在所述消息句柄,则确定所述确认报文有效;
所述消息句柄是通过如权利要求1-7任一项所述的消息句柄的创建方法生成的。
12.一种服务器,其特征在于,包括:存储器、处理器及存储于存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如权利要求1-6任一项所述的消息句柄的创建方法,和/或实现如权利要求7-11任一项所述的消息的推送方法。
13.一种消息的转发系统,其特征在于,包括至少一消费者客户端和如权利要求12所述的服务器;
所述消费者客户端,用于与所述服务器建立连接,接收所述服务器转发的所订阅的队列中的消息。
14.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1-6任一项所述的消息句柄的创建方法,和/或实现如权利要求7-11任一项所述的消息的推送方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210331159.6A CN114979249A (zh) | 2022-03-30 | 2022-03-30 | 消息句柄的创建方法、消息推送方法及相关装置和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210331159.6A CN114979249A (zh) | 2022-03-30 | 2022-03-30 | 消息句柄的创建方法、消息推送方法及相关装置和系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114979249A true CN114979249A (zh) | 2022-08-30 |
Family
ID=82975732
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210331159.6A Pending CN114979249A (zh) | 2022-03-30 | 2022-03-30 | 消息句柄的创建方法、消息推送方法及相关装置和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114979249A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115878639A (zh) * | 2022-09-07 | 2023-03-31 | 贝壳找房(北京)科技有限公司 | 二级缓存的一致性处理方法及分布式服务系统 |
Citations (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106453613A (zh) * | 2016-10-31 | 2017-02-22 | 北京小米移动软件有限公司 | 消息重发方法及装置 |
CN107231283A (zh) * | 2016-03-23 | 2017-10-03 | 阿里巴巴集团控股有限公司 | 消息管理方法及装置、消息预读方法及装置 |
CN107453845A (zh) * | 2016-03-31 | 2017-12-08 | 阿里巴巴集团控股有限公司 | 应答确认方法及设备 |
CN108009022A (zh) * | 2017-11-06 | 2018-05-08 | 联动优势科技有限公司 | 一种消息处理方法及服务器 |
CN109428682A (zh) * | 2017-08-23 | 2019-03-05 | 北京国双科技有限公司 | 一种消息处理确认方法及装置 |
CN111049729A (zh) * | 2019-11-29 | 2020-04-21 | 苏州浪潮智能科技有限公司 | 一种持久化消息传输方法与装置 |
CN111427711A (zh) * | 2020-04-01 | 2020-07-17 | 山东汇贸电子口岸有限公司 | 一种基于RabbitMQ的消息推送方法 |
CN111897825A (zh) * | 2020-06-01 | 2020-11-06 | 中国人民财产保险股份有限公司 | 分布式事务处理方法和装置 |
CN112445626A (zh) * | 2019-08-29 | 2021-03-05 | 北京京东振世信息技术有限公司 | 一种基于消息中间件的数据处理方法和装置 |
US11005959B1 (en) * | 2020-02-12 | 2021-05-11 | T-Mobile Usa, Inc. | Systems and methods for asynchronous publish-subscribe messaging and acknowledgments |
CN112925661A (zh) * | 2021-03-09 | 2021-06-08 | 广州虎牙科技有限公司 | 消息处理方法、装置、计算机设备及存储介质 |
CN112995239A (zh) * | 2021-05-24 | 2021-06-18 | 武汉中科通达高新技术股份有限公司 | 一种数据处理方法和装置 |
CN113742107A (zh) * | 2021-09-03 | 2021-12-03 | 广州新丝路信息科技有限公司 | 一种避免消息队列中消息丢失的处理方法及相关设备 |
CN114063936A (zh) * | 2022-01-18 | 2022-02-18 | 苏州浪潮智能科技有限公司 | 一种优化定时任务的方法、系统、设备和存储介质 |
-
2022
- 2022-03-30 CN CN202210331159.6A patent/CN114979249A/zh active Pending
Patent Citations (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107231283A (zh) * | 2016-03-23 | 2017-10-03 | 阿里巴巴集团控股有限公司 | 消息管理方法及装置、消息预读方法及装置 |
CN107453845A (zh) * | 2016-03-31 | 2017-12-08 | 阿里巴巴集团控股有限公司 | 应答确认方法及设备 |
CN106453613A (zh) * | 2016-10-31 | 2017-02-22 | 北京小米移动软件有限公司 | 消息重发方法及装置 |
CN109428682A (zh) * | 2017-08-23 | 2019-03-05 | 北京国双科技有限公司 | 一种消息处理确认方法及装置 |
CN108009022A (zh) * | 2017-11-06 | 2018-05-08 | 联动优势科技有限公司 | 一种消息处理方法及服务器 |
CN112445626A (zh) * | 2019-08-29 | 2021-03-05 | 北京京东振世信息技术有限公司 | 一种基于消息中间件的数据处理方法和装置 |
CN111049729A (zh) * | 2019-11-29 | 2020-04-21 | 苏州浪潮智能科技有限公司 | 一种持久化消息传输方法与装置 |
US11005959B1 (en) * | 2020-02-12 | 2021-05-11 | T-Mobile Usa, Inc. | Systems and methods for asynchronous publish-subscribe messaging and acknowledgments |
CN111427711A (zh) * | 2020-04-01 | 2020-07-17 | 山东汇贸电子口岸有限公司 | 一种基于RabbitMQ的消息推送方法 |
CN111897825A (zh) * | 2020-06-01 | 2020-11-06 | 中国人民财产保险股份有限公司 | 分布式事务处理方法和装置 |
CN112925661A (zh) * | 2021-03-09 | 2021-06-08 | 广州虎牙科技有限公司 | 消息处理方法、装置、计算机设备及存储介质 |
CN112995239A (zh) * | 2021-05-24 | 2021-06-18 | 武汉中科通达高新技术股份有限公司 | 一种数据处理方法和装置 |
CN113742107A (zh) * | 2021-09-03 | 2021-12-03 | 广州新丝路信息科技有限公司 | 一种避免消息队列中消息丢失的处理方法及相关设备 |
CN114063936A (zh) * | 2022-01-18 | 2022-02-18 | 苏州浪潮智能科技有限公司 | 一种优化定时任务的方法、系统、设备和存储介质 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115878639A (zh) * | 2022-09-07 | 2023-03-31 | 贝壳找房(北京)科技有限公司 | 二级缓存的一致性处理方法及分布式服务系统 |
CN115878639B (zh) * | 2022-09-07 | 2023-10-24 | 贝壳找房(北京)科技有限公司 | 二级缓存的一致性处理方法及分布式服务系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10601754B2 (en) | Message delivery system using message metadata | |
US8516054B2 (en) | Message handling | |
JP2515075B2 (ja) | デジタルデ―タ処理システムのためのロ―カルエリアネットワ―ク | |
JP2009531879A (ja) | メッセージ再伝送のための方法およびシステム並びにシステム間メッセージ配信のための方法およびシステム | |
RU2004109133A (ru) | Улучшение доступности и масштабируемости в системе передачи сообщений способом, прозрачным для приложения | |
US8954994B2 (en) | System and method for message service with unit-of-order | |
US20030140149A1 (en) | Communication protocol for use in controlling communications in a monitoring service system | |
EP1715640A2 (en) | Email using queues in non-presistent memory | |
US8275905B2 (en) | System and method for store-and-forward for highly available message production | |
CN114500552B (zh) | 边缘计算场景下的云边消息可靠性传输方法及装置 | |
CN111970092B (zh) | 一种支持可靠性调节的多协议冗余网络异步通信方法 | |
CN114979249A (zh) | 消息句柄的创建方法、消息推送方法及相关装置和系统 | |
CN110442461A (zh) | 一种消息投递方法、存储介质 | |
CN101232466A (zh) | 一种消息传输方法以及消息传输装置 | |
US8370443B2 (en) | Reliable messaging using publish subscribe mechanism | |
US8332498B2 (en) | Synchronized relay messaging and coordinated network processing using SNMP | |
CN113489786B (zh) | 一种长连接网络弱网重连方法、重发方法 | |
CN110825505B (zh) | 任务调度方法、装置、计算机设备及存储介质 | |
US9800672B2 (en) | Computer work distribution system and method | |
CN113961372A (zh) | 一种mq多实例消息发送方法和装置 | |
CN116560874A (zh) | 一种Kafka消息消费处理方法、装置、设备及存储介质 | |
CN117319321A (zh) | 消息推送系统及消息推送方法 | |
KR200430084Y1 (ko) | 메시지 전송를 위한 휴대형 단말기 | |
JP3990742B2 (ja) | 電文処理システム | |
CN111741101A (zh) | 银行后台系统消息推送方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |