CN111552575A - 基于消息队列的消息消费方法、装置及设备 - Google Patents

基于消息队列的消息消费方法、装置及设备 Download PDF

Info

Publication number
CN111552575A
CN111552575A CN201911417643.5A CN201911417643A CN111552575A CN 111552575 A CN111552575 A CN 111552575A CN 201911417643 A CN201911417643 A CN 201911417643A CN 111552575 A CN111552575 A CN 111552575A
Authority
CN
China
Prior art keywords
message
reading position
writing
length
file
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.)
Granted
Application number
CN201911417643.5A
Other languages
English (en)
Other versions
CN111552575B (zh
Inventor
张阳
崔昌栋
钱佳林
柴猛
崔永超
尹涛
陈慧敏
姜凯洋
朱树强
张朝旭
刘文杰
王仁斌
张宏振
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shanghai Envision Innovation Intelligent Technology Co Ltd
Envision Digital International Pte Ltd
Original Assignee
Shanghai Envision Innovation Intelligent Technology Co Ltd
Envision Digital International Pte Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Shanghai Envision Innovation Intelligent Technology Co Ltd, Envision Digital International Pte Ltd filed Critical Shanghai Envision Innovation Intelligent Technology Co Ltd
Priority to CN201911417643.5A priority Critical patent/CN111552575B/zh
Publication of CN111552575A publication Critical patent/CN111552575A/zh
Priority to PCT/SG2020/050799 priority patent/WO2021137768A1/en
Application granted granted Critical
Publication of CN111552575B publication Critical patent/CN111552575B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/546Message passing systems or structures, e.g. queues
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/54Indexing scheme relating to G06F9/54
    • G06F2209/548Queue

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Transfer Between Computers (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请公开了一种基于消息队列的消息消费方法、装置及设备,属于计算机数据通讯领域。该方法包括:将消息写入消息文件中对应的本次写入位置,消息是生产者程序生成的,本次写入位置是按照循环写入顺序在n个消息文件中确定出的写入位置,n为正整数;获取消费者程序在消息文件中对应的本次读取位置,本次读取位置是按照循环读取顺序在n个消息文件中确定出的读取位置;响应于本次写入位置与本次读取位置重合,将本次读取位置更新为目标读取位置,目标读取位置是沿循环写入顺序的写入方向上位于本次读取位置之后的读取位置;将目标读取位置读取到的所述消息文件中的消息,发送至消费者程序。

Description

基于消息队列的消息消费方法、装置及设备
技术领域
本申请涉及计算机数据通讯领域,特别涉及一种基于消息队列的消息消费方法、装置及设备。
背景技术
消息队列(Message Queue,MQ)是一种应用程序间的通信方式,应用程序在将消息发送至消息队列后可以立即返回,由消息***来确保消息的可靠传递。消息的生产者(消息发布者)将消息发布到消息队列中,消息的消费者(消息主动获取者)从消息队列中获取消息,生产者和消费者之间互不干扰。
发明内容
本申请实施例提供了一种基于消息队列的消息消费方法、装置及设备,使得消费速度较低的消费者在读取消息时对消息传输***中的生产者或其他消费者的影响降到最低。所述技术方案如下:
根据本申请的一个方面,一种基于消息队列的消息消费方法,所述方法包括:
将消息写入消息文件中对应的本次写入位置,所述消息是生产者程序生成的,所述本次写入位置是按照循环写入顺序在n个消息文件中确定出的写入位置,n为正整数;
获取消费者程序在所述消息文件中对应的本次读取位置,所述本次读取位置是按照循环读取顺序在所述n个消息文件中确定出的读取位置;
响应于所述本次写入位置与所述本次读取位置重合,将所述本次读取位置更新为目标读取位置,所述目标读取位置是沿所述循环写入顺序的写入方向上位于所述本次读取位置之后的读取位置;
将所述目标读取位置读取到的所述消息文件中的消息,发送至所述消费者程序。
根据本申请的另一方面,提供了一种基于消息队列的消息消费装置,所述装置包括:
写入模块,用于将消息写入消息文件中对应的本次写入位置,所述消息是生产者程序生成的,所述本次写入位置是按照循环写入顺序在n个消息文件中确定出的写入位置,n为正整数;
获取模块,用于获取消费者程序在所述消息文件中对应的本次读取位置,所述本次读取位置是按照循环读取顺序在所述n个消息文件中确定出的读取位置;
处理模块,用于响应于所述本次写入位置与所述本次读取位置重合,将所述本次读取位置更新为目标读取位置,所述目标读取位置是沿所述循环写入顺序的写入方向上位于所述本次读取位置之后的读取位置;
读取模块,用于将所述目标读取位置读取到的所述消息文件中的消息,发送至所述消费者程序。
根据本申请的另一方面,提供了一种计算机设备,所述计算机设备设置有传感器,所述计算机设备包括处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由所述处理器加载并执行以实现如上方面所述的基于消息队列的消息消费方法。
本申请实施例提供的技术方案带来的有益效果至少包括:
在本次写入位置与本次读取位置重合时,通过将本次读取位置更新为目标读取位置,即将本次读取位置沿循环写入顺序的写入方向进行更新,使得消费者程序的读取位置与写入位置重新保持一段距离,对于偶尔消费速度较低的消费者程序,只会丢失小部分消息。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请一个示例性实施例提供的计算机***的示意图;
图2是本申请一个示例性实施例提供的服务器的结构框图;
图3是本申请一个示例性实施例提供的消息***的结构示意图;
图4是本申请一个示例性实施例提供的基于消息队列的消息传输方法的流程图;
图5是本申请另一个示例性实施例提供的基于消息队列的消息传输方法的流程图;
图6是本申请另一个示例性实施例提供的消息***的结构示意图;
图7是本申请一个示例性实施例提供的消息队列进行写入操作的方法的流程图;
图8是本申请一个示例性实施例提供的某时刻消息文件的读取情况的示意图;
图9是本申请一个示例性实施例提供的基于消息队列的消息消费方法的流程图;
图10是本申请另一个示例性实施例提供的某时刻消息文件的读取情况的示意图;
图11是本申请另一个示例性实施例提供的基于消息队列的消息消费方法的流程图;
图12是本申请一个示例性实施例提供的基于消息队列的消息传输装置框图;
图13是本申请一个示例性实施例提供的基于消息队列的消息消费装置框图;
图14是本申请一个示例性实施例提供的计算机设备的装置结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
首先,对本申请实施例中涉及的名词进行介绍:
生产者:是指生成消息的应用程序或模块,比如,社交应用程序。
消费者:是指读取消息的应用程序或模块,可对读取到的消息进行后续处理。比如,社交应用程序需要从读取短信应用程序中的验证码。
图1示出了本申请一个示例性实施例提供的计算机***的结构框图。该计算机***100包括:支持发送消息的应用程序120(生产者程序)、支持获取消息的应用程序160(消费者程序)和消息队列140。
生产者程序120与消息队列140建立连接。生产者程序120包括:社交类应用程序、购物类应用程序、视频类应用程序、音乐类应用程序、图像类应用程序等等。
消息队列140包括一台服务器、多台服务器、云计算平台和虚拟化中心中的至少一种。消息队列140包括存储器142和处理器144,存储器142用于存储生产者程序120发布的消息,处理器144用于支持消费者程序160获取生产者生成的消息。
消费者程序160与消息队列140建立连接。消费者程序160包括:社交类应用程序、购物类应用程序、视频类应用程序、音乐类应用程序、图像类应用程序等等。
可选地,生产者程序120和消费者程序160可以是相同的应用程序,或不同类的应用程序,或相同类别下的不同的应用程序。
可选地,生产者程序120和消息队列140在同一终端中,或者,消费者程序160和消息队列140在同一终端中,或者,生产者程序120和消费者程序160在同一终端中,或者,生产者程序120、消费者程序160和消息队列140在同一终端中,或者,生产者程序120、消费者程序160和消息队列140三者分别分布在不同的终端上。
可选地,消息队列140承担主要计算工作,生产者程序120和消费者程序160承担次要计算工作;或者,消息队列140承担次要计算工作,生产者程序120和消费者程序160承担主要计算工作;或者,消息队列140、生产者程序120和消费者程序160三者之间采用分布式计算架构进行协同计算。
可以理解的是,在计算机***100中存在至少一个生产者程序120和至少一个消费者程序160,本实施例仅以一个生产者程序120和一个消费者程序160为例进行说明。上述生产者程序120和消费者程序160所在的终端的设备类型相同或不同,该设备类型包括:智能手机、平板电脑、电子书阅读器、MP3播放器、MP4播放器、膝上型便携计算机和台式计算机中、笔记本电脑的至少一种。
本领域技术人员可以知晓,上述终端的数量可以更多或更少。比如上述终端可以仅为一个,或者上述终端为几十个或几百个,或者更多数量,本申请实施例对终端的数量和设备类型不加以限定。
图2示出了本申请一个示例性实施例提供的服务器的结构示意图。该服务器可以是图1示出的消息队列140。具体来讲:
服务器200包括中央处理单元(CPU,Central Processing Unit)201、包括随机存取存储器(RAM,Random Access Memory)202和只读存储器(ROM,Read Only Memory)203的***存储器204,以及连接***存储器204和中央处理单元201的***总线205。服务器200还包括帮助计算机内的各个器件之间传输信息的基本输入/输出***(I/O***,InputOutput System)206,和用于存储操作***213、应用程序214和其他程序模块215的大容量存储设备207。
基本输入/输出***206包括有用于显示信息的显示器208和用于用户输入信息的诸如鼠标、键盘之类的输入设备209。其中显示器208和输入设备209都通过连接到***总线205的输入输出控制器210连接到中央处理单元201。基本输入/输出***206还可以包括输入输出控制器210以用于接收和处理来自键盘、鼠标、或电子触控笔等多个其他设备的输入。类似地,输入输出控制器210还提供输出到显示屏、打印机或其他类型的输出设备。
大容量存储设备207通过连接到***总线205的大容量存储控制器(未示出)连接到中央处理单元201。大容量存储设备207及其相关联的计算机可读介质为服务器200提供非易失性存储。也就是说,大容量存储设备207可以包括诸如硬盘或者紧凑型光盘只读存储器(CD-ROM,Compact Disc Read Only Memory)驱动器之类的计算机可读介质(未示出)。
不失一般性,计算机可读介质可以包括计算机存储介质和通信介质。计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模块或其他数据等信息的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括RAM、ROM、可擦除可编程只读存储器(EPROM,Erasable Programmable Read Only Memory)、带电可擦可编程只读存储器(EEPROM,Electrically Erasable Programmable Read OnlyMemory)、闪存或其他固态存储其技术,CD-ROM、数字通用光盘(DVD,Digital VersatileDisc)或其他光学存储、磁带盒、磁带、磁盘存储或其他磁性存储设备。当然,本领域技术人员可知计算机存储介质不局限于上述几种。上述的***存储器203和大容量存储设备207可以统称为存储器。
根据本申请的各种实施例,服务器200还可以通过诸如因特网等网络连接到网络上的远程计算机运行。也即服务器200可以通过连接在***总线205上的网络接口单元211连接到网络212,或者说,也可以使用网络接口单元211来连接到其他类型的网络或远程计算机***(未示出)。
上述存储器还包括一个或者一个以上的程序,一个或者一个以上程序存储于存储器中,被配置由CPU执行。
生产者是指生成消息的应用程序,消费者是指获取(或主动读取或有权读取)消息的应用程序,消息队列是指存放生产者生成的消息的“容器”。生产者只需要生产消息,并将消息存放在消息队列中,无需确定是哪一个消费者从消息队列中获取了消息,因此通过消息队列可以实现一个生产者对应一个消费者,或一个生产者对应多个消费者,或多个生产者对应多个消费者。比如,生产者是通讯应用程序,消费者是购物应用程序,购物应用程序读取通讯应用程序放在消息队列中的消息,如验证码。
如图3所示,一个生产者101将消息存放在消息队列10中,消息队列10生成一个消息文件,将该消息写入到该消息文件中,并记录消费者102和消费者103在该消息文件上的读取位置。由于不同的消费者之间的消费速度不同,也即消费者102和消费者103读取同一条消息的速度不同。当消费者102和消费者103从消息队列10中主动读取该消息时,消费者102和消费者103可根据各自对应的读取位置读取该消息文件。通过记录消费者在读取文件时的读取位置,使得消费者102和消费者103之间可独立地获取该消息,互不干扰。在一个示例中,消费者102读取到文件2的第四十六个字节,消费者103读取到文件3的第一千一百一十二个字节,消息队列10记录下消费者102和消费者103的读取位置,在消费者102和消费者103再次读取时可根据上述读取位置继续读取消息。
可以理解的是,上述消费者102和消费者103可以同时从消息队列10中获取消息,或者按照一定顺序从消息队列10中获取消息。上述生产者101可以是一个或更多个,生产者可以生成一类或多类消息,多个生产者生成的消息类别是相同的或不同的,消息队列10中生成的消息文件可以是一个或多个。示意性的,消息队列10中生成了五个消息文件,该五个消息文件分成A类和B类,A类消息是由三个生产者产生的,B类消息是由两个生产者产生的,其中,产生A类消息的三个生产者均是社交应用程序,产生B类消息的两个生产者均是音乐应用程序,读取A类消息的是一个消费者,读取B类消息的是两个消费者。三个消费者根据各自的读取位置读取消息文件中的消息,彼此互不干扰。
图4示出了本申请一个示例性实施例提供的基于消息队列的消息传输方法的流程图。该方法可应用于如图1所示的计算机***100中,该方法包括以下步骤:
步骤401,获取消息文件,消息文件采用消息队列的形式存储有生产者程序生成的消息。
消息文件是指存储生产者程序生成的消息的文件,生产者程序是任意应用程序,如社交类应用程序、游戏类应用程序、音乐类应用程序、视频类应用程序、图像类应用程序、***应用程序等等。
可选地,消息队列根据生产者程序生成的消息生成消息文件,生成的消息文件中含有该消息,或者,消息队列中默认设置有消息文件,在获取到生产者程序生产的消息后,将消息存储到该消息文件中,或者,消息文件是消息队列从生产者程序中获取的,该消息文件是由生产者程序生成的。示意性的,消息队列中设置有消息处理模块,该模块根据生产者程序生成的消息生成消息文件。
上述消息文件的数量可以是一个或多个,消息文件属于同一类型或不同类型,生产者程序可以是一个或多个,一个生产者程序生成的消息可以是一条或多条,一个生产者程序生成的消息可以属于同一种类型或不同类型,生产者程序的类型可以相同或不同。
步骤402,从消费者状态数据中确定消费者程序在消息文件上的读取位置,消费者状态数据与消费者程序一一对应。
消费者状态数据是指表征消费者程序读取状态的数据。可选地,读取状态包括:待读取的消息文件的标识、读取开始位置、读取内容、读取次数、读取时间、读取结束位置中的至少一种。可选地,消费者状态数据存储在消费者状态文件中,或者,消费者状态数据可上传至云服务器中。
在一个示例中,读取状态包括:读取的消息文件标识、读取开始位置和读取结束位置,消息队列从消费者数据中确定待读取的消息文件的标识,可以确定消费者程序要读取的消息所在的消息文件,根据读取开始位置可以确定消费者程序本次待读取的起始位置,根据读取结束位置可以确定消费者程序本次读取消息完成后的位置,可选地,该位置是下一次读取消息的起始位置。
上述消费者状态数据可以是一份或多份,消费者程序可以是一个或多个,每个消费者程序对应各自的读取位置。
步骤403,根据读取位置读取消息文件中的第一消息。
可选地,读取位置包括读取文件的标识(如名称或编号)、读取开始位置(如第52个字节处)和读取结束位置(如第520个字节处)中的至少一种。示意性的,读取位置是消费者程序本次读取消息的起始位置,该读取位置是消息文件B中的第65个字节处,消息队列根据该读取位置确定消息文件B是消费者程序待读取的消息文件,确定消费者程序从消息文件B中的第65个字节处开始读取。
步骤404,将第一消息发送至消费者程序。
示意性的,如步骤403所述,消息队列将消息文件B中的第65个字节处对应的消息发送至消费者程序。
综上所述,本实施例提供的方法,通过消息队列获取存储有消息的消息文件,根据消费者状态数据确定消费者程序的读取位置,根据消费者的读取位置将读取到的消息发送至消费者程序。当多个消费者程序读取消息队列中的消息时,无需消息队列将消息拷贝多份消息副本,实现了多个消费者彼此独立地消费消息,提高了消息队列的传输消息的效率。
图5示出了本申请另一个示例性实施例提供的基于消息队列的消息传输方法的流程图。该方法可应用于如图1所示的计算机***100中,该方法包括以下步骤:
步骤501,获取至少两个消息文件。
可选地,消息文件包括按照顺序排列的至少两个消息文件。可选地,该顺序是消息循环写入消息文件的顺序,或该顺序是循环读取消息的顺序,或该顺序是生成消息文件的顺序。
图6示出了本申请一个示例性实施例提供的消息传输***的结构框图。消息传输***200包括生产者1(也即生产者程序)、消息队列21、n个消费者(也即消费者程序),n为正整数(如消费者1、消费者2……消费者n)。
示意性的,生产者1生成了两条消息,发送至消息队列21中,消息队列21包括消息处理模块201,消息处理模块201根据该两条消息生成两个消息文件。
可选地,消息文件包括至少两类消息文件,每类消息文件对应各自的消息标签。示意性的,生产者1生成的了两种类型的消息,对应两种消息标签,每种类型的消息各一条。此时,消息队列21获取消息文件包括如下子步骤:
S1、确定消费者程序所对应的第一消息标签。
消息队列21首先确定第一消息标签,该第一消息标签对应第一消息的类型。
S2、从至少两类消息文件中,确定与第一消息标签对应的消息文件。
示意性的,当第一消息标签是a,对应第一消息文件的类型是A类;当第一消息标签是b,对应第一消息文件的类型是B类;当第一消息标签是c,对应第一消息文件的类型是C类。本申请对标签的形式不加以限定。
在一个示例中,消息队列21确定消费者程序所对应的第一消息标签是a,者可以确定消息文件的类型是A类型,消息队列21可从属于A类型的消息文件中进一步确定消费者程序的读取位置。
步骤502,从消费者状态数据中确定消费者程序在消息文件上的读取位置,消费者状态数据与消费者程序一一对应。
可选地,消费者程序为至少两个,每个消费者程序对应有各自的消费者状态文件,消费者状态文件中存储有消费者程序的消费者状态数据。
示意性的,如图6所示,消费者1对应的消费者状态文件是文件1、消费者2对应的消费者状态文件是文件2和消费者3对应的消费者状态文件是文件3,文件1、文件2和文件3三者互不相同。
步骤503,根据读取位置中的第一消息文件标识,在至少两个消息文件中确定出待读取的第一目标消息文件。
步骤504,根据读取位置中的第一消息文件偏移,在第一目标消息文件中读取第一消息。
可选地,读取位置包括:第一消息文件标识和第一消息文件偏移。第一消息文件标识用于表征消费者程序读取的是消息队列中的哪一个文件,如消费者程序读取的是消息文件A中的消息;第一消息文件偏移用于表征消费者程序在第一消息文件中的读取位置,如第一消息文件中的第52个字节处。可选地,消息文件偏移用字节来表示。
下面结合表一对第一消息文件标识、第一消息文件偏移、第一消息文件标签之间的关系进行说明。
表一
Figure BDA0002351608170000101
其中,第一消息文件标识2019122115330001表示2019年12月21日15点53分编号为0001的第一消息文件,offset_a表示编号为0001的第一消息文件偏移是a个字节。本申请对消息文件标识和消息文件偏移的形式不加以限定。
步骤505,将第一消息发送至消费者程序。
步骤505与步骤404一致,此处不再赘述。
可以理解的是,上述步骤可以循环执行,即消费者程序可以循环读取消息文件中的消息。上述步骤S1和步骤S2与其他步骤可以组合执行或不执行。
综上所述,本实施例提供的方法,当消息队列获取多个消息文件时,根据第一消息文件标识和第一消息文件偏移确定第一消息的读取位置,若多个消息文件属于多种类型,消息队列可先根据消息文件对应的消息标签确定消息文件所属的类别,再根据第一消息文件标识和第一消息读取位置读取第一消息。使得多个消费者程序可独立地从消息队列中读取消息,实现了多条消息或多种类型消息模式下的“一发多收”、“多发多收”。
下面对消息队列将生产者程序产生的消息写入消息文件的过程进行说明。
图7示出了本申请一个示例性实施例提供的结合消息标签的基于消息队列的消息传输方法的流程图。该方法可应用于如图1所示的计算机***100中,该方法包括以下步骤:
步骤701,获取生产者程序生成的第二消息。
消息文件包括按照顺序排列的至少两个消息文件,每个消息文件具有文件大小上限。示意性的,如消息文件1的文件大小上限是100兆(MB)。
可选地,一个生产者程序生成的第二消息是属于多个类型的消息,或者,多个生产者程序生成的多条消息,且每个生产者程序生成的消息属于不同的类型。
可选地,消息文件包括至少两类消息文件,每类消息文件对应各自的消息标签。当获取到的第二消息属于多个类型时,该步骤包括如下子步骤:
S11、确定第二消息对应的第二消息标签。
消息队列首先确定第二消息标签,该第二消息标签对应第一消息类型。
S22、从至少两类消息文件中,确定与第二消息标签对应的消息文件。
示意性的,当第二消息标签是a,对应第二消息文件的类型是A类;当第一消息标签是b,对应第一消息文件的类型是B类;当第一消息标签是c,对应第一消息文件的类型是C类。本申请对标签的形式不加以限定。
步骤702,获取生产者程序的最近一次写入位置,最近一次写入位置包括:第二消息文件标识和第二消息文件偏移。
写入位置表示消息队列将生产者程序生成的消息最近一次写入消息文件时对应的位置。第二消息文件标识用于表征消息队列将消息写入哪一个文件,如消息队列将生产者程序写入消息文件A;第二消息文件偏移用于表征消息队列将消息写入第二消息文件中的位置,如第二消息文件中第52个字节处。可选地,消息的数据量用字节来表示。
下面结合表二对第二消息文件标识、第二消息文件偏移、第二消息文件标签之间的关系进行说明。
表二
Figure BDA0002351608170000111
Figure BDA0002351608170000121
其中,第二消息文件标识2019122114330001表示2019年12月21日14点33分编号为0001的第一消息文件,offset_c表示编号为0001的第二消息文件偏移是P个字节。本申请对消息文件标识和消息文件偏移的形式不加以限定。
步骤703a,响应于第二消息总量在第k个消息文件中未达到文件大小上限,将第二消息写入第k个消息文件中,更新最近一次写入位置。
第k个消息文件是第二消息文件标识对应的消息文件,第二消息总量是第二消息的数据量与第二消息文件偏移的加和,k≥2,且k为整数。
消息队列将消息写入消息文件时,先判断第二消息总量的大小是否大于待写入消息文件的文件大小,第二消息总量是待写入的消息与本次写入位置的加和,若该加和不大于待写入消息文件的文件大小,则消息队列将待写入消息直接写入该消息文件。消息队列更新最近一次写入位置为第k个消息文件中的字节。
示意性的,k为3,第二消息总量未达到第3个消息文件(第二消息文件标识为0003)的文件大小上限,消息队列将该消息写入第3个消息文件中的第110个字节处,更新最近一次写入位置为编号为0003的消息文件的第110个字节处,
步骤703b,响应于第二消息总量在第k个消息文件中达到文件大小上限,生成第k+1个消息文件,将第二消息写入第k+1个消息文件中,更新最近一次写入位置,k≥2,且k为整数。
若第二消息总量的大小达到待写入消息文件的文件大小上限时,将待写入消息写入待写入消息文件的下一个消息文件。示意性的,当一条消息要写入编号为0004的消息文件(该消息文件是消息队列中的第4个文件)时,而该消息的总量大小大于编号为0004的消息文件大小,消息队列生成第5个文件,该文件的编号为0005。
可选地,消息队列可预先生成第k+1个文件,如消息队列在生成第k文件时,同时生成第k+1个文件,或消息队列同时生成n个文件,n为消息队列中消息文件的总数量。
步骤703c,响应于第二消息总量在第n个消息文件中达到文件大小上限,将第1个消息文件中的消息删除后,将第二消息写入第1个消息文件中,更新最近一次写入位置,k≤n,且n为大于2的正整数。
可选地,消费文件还包括:消费文件个数上限n。
示意性的,n为50,消息队列中有50个消息文件,消息文件的编号为0000-0049,当消息队列将消息写到第0048号消息文件时,第二消息总量达到在第50个文件中达到文件大小上限,消息队列将从第1个消息文件(编号为0000的消息文件)开始写入,即将第1个消息文件中的消息删除后,将该消息写入第1个消息文件中,并更新最近一次写入位置是编号为0000的消息文件的第b个字节处。
可以理解的是,上述步骤可以循环执行,也即消息队列可以将生产者程序生成的消息循环写入消息文件,在有消息写入消息文件后,写入消息的过程和读取消息的过程可同时执行,也可按照一定顺序执行。
示意性的,如图8所示,其示出了某时刻消息文件的读写情况。该读写情况包括:消费者程序311在消息文件03上的读取位置(箭头指向读取位置),消费者程序312在消息文件04上的读取位置,消费者程序313在消息文件09上的读取位置,消息文件03的写入位置是位置301。
在一个可选的实施例中,消息队列可对消息文件中的消息进行删除。
设第k个消息文件中消息存储时间大于时间阈值,最近一次写入位置对应的消息文件是第m个消息文件,m≤n,且m为正整数。
S10、获取第k-1个消息文件中的消息的存储时间。
如图6所示,消息队列21中设置有垃圾回收模块203,可对保留时间过长的消息进行删除。示意性的,k为10,时间阈值为60秒,消息队列中一共有50个消息文件,本次写入消息的消息文件是第20个消息文件。消息队列中按循环写入顺序排列的第10个消息文件中的消息的存储时间大于时间阈值,则消息队列获取第9个消息文件中的消息的存储时间。
S20、响应于第k-1个消息文件中的消息的存储时间大于时间阈值时,将第二目标消息文件中的消息删除,第二目标消息文件是按照逆向顺序且位于第k个消息文件与第m个消息文件之间的消息文件。
逆向顺序是与循环写入顺序相反的顺序,比如,循环写入顺序是按照消息文件的编号递增的顺序将消息写入消息文件中,如消息队列从编号为001的消息文件开始写入,编号为001的消息文件是第1个文件,一直写到编号为050的消息文件(第50个消息文件),在50个消息文件写满后,重新写入第1个消息文件。逆向顺序则是从最近一次写入位置的顺序开始,按照编号递减的顺序进行检查或删除操作,如最近一次写入位置对应的消息文件是编号为020的消息文件(第20个消息文件),则在确定大于存储时间的消息时,从第20个消息文件开始检查,直至检查到第1个消息文件,若第1个消息文件中的消息的存储时间仍然不超过时间阈值,则检查第50个消息文件、第49个消息文件……第21个消息文件,直至确定存储时间大于时间阈值的消息对应的消息文件。
在一个示例中,当第9个消息文件中的消息的存储时间也大于时间阈值时,第二目标消息文件是按照逆向顺序且位于第10个消息文件与第20个消息文件之间的消息文件,不包括第10个消息文件和第20个消息文件,也即将第9个消息文件、第8个消息文件、第7个消息文件……第1个消息文件中的消息删除,同时将第49个消息文件、第48个消息文件、第47个消息文件……第21个消息文件中的消息删除。
综上所述,本实施例提供的方法,通过确定第二消息总量在待写入文件中达到的文件大小上限,确定第二消息可写入的目标消息文件,若存在多条消息或多种类型的消息,消息队列先通过确定消息标签确定要写入的消息文件的类型,再写入,保证消息队列写入的消息是准确有序的。
当多个消费者主动读取消息队列中的消息时,会存在消费者读取消息的速度(消费速度)比较低的情况。相关技术中,消息队列不缓存消息,只将消息传输给消费者,并不理会消费速度较低的消费者能不能及时读取到消息。
基于上述情况,多个具有不同消费速度的消费者在读取消息队列传输的消息时,消费速度较低的消费者将丢失大量消息。
为了解决上述问题,本申请还提供了一种基于消息队列的消息消费方法,该方法适用于所有循环写入消息的情况,不限于上述实施例中的写入消息的情况。
图9示出了本申请一个示例性实施例提供的基于消息队列的消费方法的流程图,该方法可应用于如图1所示的计算机***100中,该方法包括以下步骤:
步骤901,将消息写入文件中对应的本次写入位置,消息是生产者程序生成的,本次写入位置是按照循环写入顺序在n个消息文件中确定出的写入位置,n为正整数。
示意性的,n为50,消息队列中存储有50个消息文件,编号分别是000至049,消息队列将接收到的生产者生成的消息循环写入该50个文件中。可选地,消息文件的写入顺序包括按照文件编号递增的顺序或编号递减的顺序。示意性的,当编号为049的消息文件已写满时,消息将被写入编号为000的消息文件,编号为000的消息文件中原本写入的消息将被新的消息覆盖,或者原本写入的消息先被删除,再写入新的消息。可选地,消息文件还可以按照文件名称的首字母顺序作为循环写入顺序,如从文件名称为A开始循环写入。
示意性的,消息队列将消息写入本次写入位置是编号为030的消息文件中的第100个字节处。
步骤902,获取消费者程序在消息文件中对应的本次读取位置,本次读取位置是按照循环读取顺序在n个消息文件中确定出的读取位置。
循环读取顺序与循环写入顺序一致,当消息的循环写入顺序确定时,循环读取顺序也确定。示意性的,循环读取顺序是按照文件编号递增的顺序进行读取的。示意性的,消息队列获取本次读取位置是编号为030的消息文件中的第100个字节处。
步骤903,响应于本次写入位置与本次读取位置重合,将本次读取位置更新为目标读取位置,目标读取位置沿循环写入顺序的写入方向上位于本次读取位置之后的读取位置。
可选地,目标读取位置是消息队列默认设置的读取位置,或者服务器根据消费者程序的消费速度进行自动选定的读取位置。可选地。本次读取位置与目标读取位置的距离是固定的,或该距离越来越大,或该距离根据消费者程序的消费速度智能调整。
示意性的,本次读取位置是编号为030的消息文件中的第100个字节处,目标读取位置是编号为048的消息文件中的第100个字节处。消息队列将本次读取位置从030号消息文件中的第100个字节处更新为048的消息文件中的第100个字节处。
消费者程序的读取位置和生产者程序的写入位置每次重合时,消息队列都将对应的读取位置更新为目标位置。可选地,在消费者程序读取和生产者程序写入的过程中,读取位置和写入位置存在至少两次重合时,步骤903还包括如下子步骤:
步骤9031,获取消费者程序的历史读取位置和生产者程序的历史写入位置在上一次重合时的第一时间戳。
示意性的,消费者程序的历史读取位置和生产者程序的历史写入位置重合两次,第一次(也即上一次)重合时的时间戳是M1时刻。
步骤9032,获取本次读取位置与本次写入位置重合时的第二时间戳。
示意性的,第二次(也即本次)重合时的时间戳是M2时刻。
步骤9033,根据第一时间戳和第二时间戳的差值,将本次读取位置更新为目标读取位置。
可选地,第一时间戳和第二时间戳的差值与目标读取位置之间存在对应关系,如时间戳差值与目标读取位置之间满足y=kx,其中,y为目标读取位置,k为常数,x为时间戳差值。示意性的,目标读取位置为k×(M2-M1)。
步骤904,将目标读取位置读取到的消息文件中的消息,发送至消费者程序。
消息队列从048的消息文件中的第100个字节处开始读取,并将读取到的消息发送至消费者程序。
综上所述,本实施例的方法,在本次写入位置与本次读取位置重合时,通过将本次读取位置更新为目标读取位置,即将本次读取位置沿循环写入顺序的写入方向进行更新,使得消费者程序的读取位置与写入位置重新保持一段距离,对于偶尔消费速度较低的消费者程序,只会丢失小部分消息。
图10示出了本申请一个示例性实施例提供的基于消息队列的消息消费方法的流程图,该方法可应用于如图1所示的计算机***100中,该方法包括以下步骤:
步骤1001,将消息写入文件中对应的本次写入位置,消息是生产者程序生成的,本次写入位置是按照循环写入顺序在n个消息文件中确定出的写入位置,n为正整数。
步骤1002,获取消费者程序在消息文件中对应的本次读取位置,本次读取位置是按照循环读取顺序在n个消息文件中确定出的读取位置。
步骤1001和步骤1002与图9所示的步骤901和步骤902一致,此处不再赘述。
步骤1003,获取消费者程序的历史读取位置和生产者程序的历史写入位置在上一次重合时的第一时间戳。
步骤1004,获取本次读取位置与本次写入位置重合时的第二时间戳。
步骤1003和步骤1004与步骤9031和步骤9032一致,此处不再赘述。
步骤1005a,响应于第一时间戳和第二时间戳的差值大于时间阈值,将本次读取位置更新为第一目标读取位置。
本次读取位置与第一目标读取位置之间的长度是第二长度,其中,第二长度是预设值。示意性的,预设值为10兆字节长度。可选地,该预设值是计算机设备设定的起始值或默认值。
如图10所示,消息文件包括按照顺序排列的至少两个消息文件,在消息队列中存储有消息文件03、消息文件04和消息文件09。示意性的,消费者1对应读取位置411(如箭头所示),消费者2对应读取位置412,消费者3对应读取位置413,消息队列本次写入位置为写入位置401。读取位置411读取速度很快,会“追上”写入位置401;读取位置412的读取速度很慢,写入位置401与读取位置412很接近,会“追上”读取位置412;读取位置413的读取速度正常,写入位置401和读取位置413保持一定距离。
示意性的,当写入位置401第一次“追上”读取位置412时,消息队列更新消费者的读取位置412,将读取位置412从本次读取位置向循环写入顺序的写入方向移动10兆字节对应的长度,如移动后的读取位置是读取位置413,并记录对应的时间戳M1。
示意性的,时间阈值为慢启动最长判定时间N。当M2-M1>N(N>0,N表示慢启动最长判定时间)时,消息队列更新消费者的读取位置412,将读取位置412从本次读取位置向循环写入顺序的写入方向移动10兆字节对应的长度。
步骤1005b,响应于第一时间戳和第二时间戳的差值不大于时间阈值,将本次读取位置更新为第二目标读取位置。
历史读取位置与历史目标读取位置之间的长度是第一长度,本次读取位置与第一目标读取位置之间的长度是第二长度,其中,第一长度小于第二长度。可选地,第二长度与第一长度满足对应关系,如倍数关系,或者第二长度通过对照表等预设方式来确定,如第一长度a对应第二长度b,或者第二长度等于第一长度加上预定步长。
当M2-M1≤N时,消息队列更新消费者的读取位置412,将读取位置412从本次读取位置向循环写入顺序的写入方向移动20兆字节对应的长度;在此基础上,当写入位置401第三次“追上”读取位置412时,记录时间戳M3,若M3-M2≤N时,将读取位置412从本次读取位置向循环写入顺序的写入方向移动40兆字节对应的长度。
可选地,当消费者程序的本次读取位置更新时的长度满足一定条件时,更新后的目标读取位置将发生变化。
更新后的目标读取位置通过如下方式获得:
响应于总长度达到预设长度,将本次读取位置更新为第三目标读取位置,本次读取位置与第三目标读取位置之间的长度为预设长度。
总次数是指累计每次消费者程序的读取位置与生产者程序的写入位置重合时的次数。
按照上述将读取位置更新为目标位置的方式,直到读取位置412移动的长度达到预设的最大值(也即预设长度)Q。消息队列将读取位置向循环写入顺序的写入方向移动Q(640兆字节)对应的长度时,写入位置401又要经过较长的时间才能“追上”该消费者更新后的读取位置,在移动的长度达到预设的最大值Q之前,只要任意一次时间戳和上一次时间戳的时间间隔大于N时,读取位置移动的长度仍然为10兆字节对应的长度。
或者,通过如下方式:
响应于总次数达到预设次数,将本次读取位置更新为第三目标读取位置。
示意性的,当消费者程序的读取位置与生产者程序的写入位置重合次数达到10次时,将本次读取位置向循环写入顺序的写入方向移动Q字节对应的长度。
步骤1106,将目标读取位置读取到的消息文件中的消息,发送至消费者程序。
步骤1106与步骤904一致,此处不再赘述。
综上所述,对于消费一直很慢的消费者程序,每次被“追上”时,丢失的消息将由少至多,直至达到预设长度,将本次读取位置更新为预设长度对应的目标读取位置,从而可以使消费一直很慢的消费者程序过很长时间才会被再次“追上”,将消费一直很慢的消费者程序对消息***的资源消耗以及对生产者程序和其他消费者程序的影响降到最低。
下面以在线秒杀购物的场景为例进行说明,在该场景下,生产者程序是用户对应的在线购物程序(顾客端),消费者程序包括在线购物平台的管理程序、商家对应的在线购物程序(商家端)、快递公司对应的快递程序。
在秒杀购物的场景下,消息队列中接入多个生产者程序,示意性的,每个生产者程序产生的消息是秒杀商品对应的购物订单,购物订单包括顾客购买的商品、数量、价格、订单号、收货地址、是否使用优惠券等信息。消息队列根据购物订单生成对应的消息文件,示意性的,可根据商品的类型对消息文件设置标签。消费者程序根据消息文件对应的标签、第一消息文件标识和第一消息文件偏移读取消息文件中的消息,三个消费者彼此根据自己的读取位置独立地从消息文件中读取消息。如,在线购物平台的管理程序对读取到的消息进行处理,得到食品类在一次秒杀场景下的营业额是五万元;商家对应的在线购物程序对读取到的消息进行处理,得到一件商品在一次秒杀场景下的营业额是一万元;快递程序读取到的消息进行处理,得到用户A的收货地址是MG市MG区XX街道187号。
综上所述,将上述实施例提供的方法应用于秒杀购物场景,多个消费者可同时读取消息队列中的消息,提高了消息队列的传输效率,保证了服务器在高并发场景下消息传输的流畅。
以下为本申请的装置实施例,对于装置实施例中未详细描述的细节,可以结合参考上述方法实施例中相应的记载,本文不再赘述。
图12示出了本申请的一个示例性实施例提供的基于消息队列的消息传输装置的结构示意图。该装置可以通过软件、硬件或者两者的结合实现成为终端的全部或一部分,该装置包括:
第一获取模块1210,用于获取消息文件,消息文件采用消息队列的形式存储有生产者程序生成的消息;
第一处理模块1220,用于从消费者状态数据中确定消费者程序在消息文件上的读取位置,消费者状态数据与所述消费者程序一一对应;
第一读取模块1230,用于根据读取位置读取消息文件中的第一消息;
发送模块1240,用于将第一消息发送至消费者程序。
在一个可选的实施例中,消费者程序为至少两个,每个消费者程序对应有各自的消费者状态文件,消费者状态文件中存储有消费者程序的消费者状态数据。
在一个可选的实施例中,消息文件包括按照顺序排列的至少两个消息文件,读取位置包括:第一消息文件标识和第一消息文件偏移;
所述第一处理模块1220,用于根据读取位置中的第一消息文件标识,在至少两个消息文件中确定出待读取的第一目标消息文件;
所述第一读取模块1230,用于根据读取位置中的第一消息文件偏移,在第一目标消息文件中读取第一消息。
在一个可选的实施例中,消息文件包括至少两类消息文件,每类消息文件对应各自的消息标签;
所述第一获取模块1210,用于确定消费者程序所对应的第一消息标签;从至少两类消息文件中,确定与第一消息标签对应的消息文件。
在一个可选的实施例中,该装置包括写入模块,消息文件包括按照顺序排列的至少两个消息文件,每个消息文件具有文件大小上限;
所述第一获取模块1210,用于获取生产者程序生成的第二消息;获取生产者程序的最近一次写入位置,最近一次写入位置包括:第二消息文件标识和第二消息文件偏移;
所述第一写入模块1250,用于响应于第二消息总量在第k个消息文件中未达到文件大小上限,将第二消息写入第k个消息文件中,更新最近一次写入位置;第k个消息文件是第二消息文件标识对应的消息文件,第二消息总量是第二消息的数据量与第二消息文件偏移的加和,k≥2,且k为正整数;
所述第一写入模块1250,用于响应于第二消息总量在第k个消息文件中达到文件大小上限,生成第k+1个消息文件,将第二消息写入第k+1个消息文件中,更新最近一次写入位置。
在一个可选的实施例中,消费文件还包括:消费文件个数上限n,
所述第一写入模块1250,用于响应于第二消息总量在第n个消息文件中达到文件大小上限,将第1个消息文件中的消息删除后,将第二消息写入第1个消息文件中,更新最近一次写入位置,k≤n,且n为大于2的正整数。
在一个可选的实施例中,消息文件包括至少两类消息文件,每类消息文件对应各自的消息标签;
所述第一处理模块1220,用于确定第二消息所对应的第二消息标签;从至少两类消息文件中,确定与第二消息标签对应的消息文件。
在一个可选的实施例中,该装置包括删除模块1260,设第k个消息文件中的消息的存储时间大于时间阈值,最近一次写入位置对应的消息文件是第m个消息文件,m≤n,且m为正整数;
所述第一获取模块1210,用于获取第k-1个消息文件中的消息的存储时间;
所述删除模块1260,用于响应于第k-1个消息文件中的消息的存储时间大于时间阈值时,将第二目标消息文件中的消息删除,第二目标消息文件是按照逆向顺序且位于第k个消息文件与第m个消息文件之间的消息文件。
图13示出了本申请的一个示例性实施例提供的基于消息队列的消息消费装置的结构示意图。该装置可以通过软件、硬件或者两者的结合实现成为终端的全部或一部分,该装置包括:
第二写入模块1310,用于将消息写入消息文件中对应的本次写入位置,消息是生产者程序生成的,本次写入位置是按照循环写入顺序在n个消息文件中确定出的写入位置,n为正整数;
第二获取模块1320,用于获取消费者程序在消息文件中对应的本次读取位置,本次读取位置是按照循环读取顺序在n个消息文件中确定出的读取位置;
第二处理模块1330,用于响应于本次写入位置与本次读取位置重合,将本次读取位置更新为目标读取位置,目标读取位置是沿循环写入顺序的写入方向上位于本次读取位置之后的读取位置;
第二读取模块1340,用于将目标读取位置读取到的消息文件中的消息,发送至消费者程序。
在一个可选的实施例中,所述第二获取模块1320,用于获取消费者程序的历史读取位置和生产者程序的历史写入位置在上一次重合时的第一时间戳;
所述第二获取模块1320,用于获取本次读取位置与本次写入位置重合时的第二时间戳;
所述第二处理模块1330,用于根据第一时间戳和第二时间戳的差值,将本次读取位置更新为目标读取位置。
在一个可选的实施例中,所述第二处理模块1330,用于响应于第一时间戳和第二时间戳的差值不大于时间阈值,将本次读取位置更新为第二目标读取位置;历史读取位置与历史目标读取位置之间的长度是第一长度,本次读取位置与第二目标读取位置之间的长度是第二长度,其中,第一长度小于第二长度。
在一个可选的实施例中,所述第二处理模块1330,用于响应于第一时间戳和第二时间戳的差值大于时间阈值,将本次读取位置更新为第一目标读取位置;本次读取位置与第一目标读取位置之间的长度是第二长度,其中,第二长度是预设值。
在一个可选的实施例中,所述第二获取模块1320,用于获取历史更新过程中对消费者程序的历史读取位置进行更新时的总长度;所述第二处理模块1330,用于响应于总长度达到预设长度,将本次读取位置更新为第三目标读取位置,本次读取位置与第三目标读取位置之间的长度为预设长度;或,所述第二获取模块1320,用于获取历史更新过程中对消费者程序的历史读取位置进行更新时的总次数;所述第二处理模块1340,用于响应于总次数达到预设次数,将本次读取位置更新为第三目标读取位置。
本申请还提供一种计算机设备,如图14所示,该计算机设备1400包括处理器1401和存储器1402,存储器1402中存储有至少一条指令、至少一段程序、代码集或指令集,该指令、程序、代码集或指令集由处理器1401加载并执行以实现如上述各方法实施例提供的基于消息队列的消息传输方法和基于消息队列的消息消费方法。
应当理解的是,在本文中提及的“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本申请的可选实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

Claims (10)

1.一种基于消息队列的消息消费方法,其特征在于,所述方法包括:
将消息写入消息文件中对应的本次写入位置,所述消息是生产者程序生成的,所述本次写入位置是按照循环写入顺序在n个消息文件中确定出的写入位置,n为正整数;
获取消费者程序在所述消息文件中对应的本次读取位置,所述本次读取位置是按照循环读取顺序在所述n个消息文件中确定出的读取位置;
响应于所述本次写入位置与所述本次读取位置重合,将所述本次读取位置更新为目标读取位置,所述目标读取位置是沿所述循环写入顺序的写入方向上位于所述本次读取位置之后的读取位置;
将所述目标读取位置读取到的所述消息文件中的消息,发送至所述消费者程序。
2.根据权利要求1所述的方法,其特征在于,所述响应于所述本次写入位置与所述本次读取位置重合,将所述本次读取位置更新为目标读取位置,包括:
获取所述消费者程序的历史读取位置和所述生产者程序的历史写入位置在上一次重合时的第一时间戳;
获取所述本次读取位置与所述本次写入位置重合时的第二时间戳;
根据所述第一时间戳和所述第二时间戳的差值,将所述本次读取位置更新为所述目标读取位置。
3.根据权利要求2所述的方法,其特征在于,所述根据所述第一时间戳和所述第二时间戳的差值,将所述本次读取位置更新为所述目标读取位置,包括:
响应于所述第一时间戳和所述第二时间戳的差值不大于时间阈值,将所述本次读取位置更新为第二目标读取位置;
所述历史读取位置与历史目标读取位置之间的长度是第一长度,所述本次读取位置与第二目标读取位置之间的长度是第二长度,其中,所述第一长度小于所述第二长度。
4.根据权利要求2所述的方法,其特征在于,所述根据所述第一时间戳和所述第二时间戳的差值,将所述本次读取位置更新为所述目标读取位置,包括:
响应于所述第一时间戳和所述第二时间戳的差值大于时间阈值,将所述本次读取位置更新为第一目标读取位置;
所述本次读取位置与第一目标读取位置之间的长度是第二长度,其中,所述第二长度是预设值。
5.根据权利要求4所述的方法,其特征在于,所述方法还包括:
响应于所述第二长度达到预设长度,将所述本次读取位置更新为第三目标读取位置,所述本次读取位置与所述第三目标读取位置之间的长度为所述预设长度。
6.一种基于消息队列的消息消费装置,其特征在于,所述装置包括:
写入模块,用于将消息写入消息文件中对应的本次写入位置,所述消息是生产者程序生成的,所述本次写入位置是按照循环写入顺序在n个消息文件中确定出的写入位置,n为正整数;
获取模块,用于获取消费者程序在所述消息文件中对应的本次读取位置,所述本次读取位置是按照循环读取顺序在所述n个消息文件中确定出的读取位置;
处理模块,用于响应于所述本次写入位置与所述本次读取位置重合,将所述本次读取位置更新为目标读取位置,所述目标读取位置是沿所述循环写入顺序的写入方向上位于所述本次读取位置之后的读取位置;
读取模块,用于将所述目标读取位置读取到的所述消息文件中的消息,发送至所述消费者程序。
7.根据权利要求6所述的装置,其特征在于,
所述获取模块,用于获取所述消费者程序的历史读取位置和所述生产者程序的历史写入位置在上一次重合时的第一时间戳;
所述获取模块,用于获取所述本次读取位置与所述本次写入位置重合时的第二时间戳;
所述处理模块,用于根据所述第一时间戳和所述第二时间戳的差值,将所述本次读取位置更新为所述目标读取位置。
8.根据权利要求6所述的装置,其特征在于,
所述处理模块,用于响应于所述第一时间戳和所述第二时间戳的差值大于时间阈值,将所述本次读取位置更新为第一目标读取位置;
所述历史读取位置与历史目标读取位置之间的长度是第一长度,所述本次读取位置与第一目标读取位置之间的长度是第二长度,其中,所述第一长度与所述第二长度相等。
9.根据权利要求6所述的装置,其特征在于,
所述处理模块,用于响应于所述第一时间戳和所述第二时间戳的差值不大于时间阈值,将所述本次读取位置更新为第二目标读取位置;
所述历史读取位置与历史目标读取位置之间的长度是第一长度,所述本次读取位置与第二目标读取位置之间的长度是第二长度,其中,所述第一长度小于所述第二长度。
10.根据权利要求7至9任一所述的装置,其特征在于,
所述获取模块,用于获取历史更新过程中对所述消费者程序的历史读取位置进行更新时的总长度;所述第二处理模块,用于响应于所述总长度达到预设长度,将所述本次读取位置更新为第三目标读取位置,所述本次读取位置与所述第三目标读取位置之间的长度为所述预设长度;
或,
所述获取模块,用于获取历史更新过程中对所述消费者程序的历史读取位置进行更新时的总次数;所述第二处理模块,用于响应于所述总次数达到预设次数,将所述本次读取位置更新为所述第三目标读取位置。
CN201911417643.5A 2019-12-31 2019-12-31 基于消息队列的消息消费方法、装置及设备 Active CN111552575B (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN201911417643.5A CN111552575B (zh) 2019-12-31 2019-12-31 基于消息队列的消息消费方法、装置及设备
PCT/SG2020/050799 WO2021137768A1 (en) 2019-12-31 2020-12-31 Method, apparatus and device for consuming messages based on message queue

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911417643.5A CN111552575B (zh) 2019-12-31 2019-12-31 基于消息队列的消息消费方法、装置及设备

Publications (2)

Publication Number Publication Date
CN111552575A true CN111552575A (zh) 2020-08-18
CN111552575B CN111552575B (zh) 2023-09-12

Family

ID=72003749

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911417643.5A Active CN111552575B (zh) 2019-12-31 2019-12-31 基于消息队列的消息消费方法、装置及设备

Country Status (2)

Country Link
CN (1) CN111552575B (zh)
WO (1) WO2021137768A1 (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113505037A (zh) * 2021-06-24 2021-10-15 北京天九云电子商务有限公司 消息管理监控***、方法、可读介质及电子设备

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113961379B (zh) * 2021-12-22 2022-04-12 零犀(北京)科技有限公司 基于人机对话的消息处理方法及装置

Citations (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103209214A (zh) * 2013-04-03 2013-07-17 蓝盾信息安全技术股份有限公司 一种基于NoSQL的消息中间件的实现方法
CN103761141A (zh) * 2013-12-13 2014-04-30 北京奇虎科技有限公司 一种实现消息队列的方法及装置
CN103942259A (zh) * 2014-03-21 2014-07-23 浙江大学 一种数据库同步中实现数据缓存的方法
CN105138410A (zh) * 2015-08-31 2015-12-09 北京锐安科技有限公司 一种基于磁盘缓存的消息队列的实现方法及装置
CN105808363A (zh) * 2016-03-11 2016-07-27 浪潮通用软件有限公司 一种基于Active MQ消息队列实现异步执行的方法
CN106658050A (zh) * 2016-12-30 2017-05-10 北京奇虎科技有限公司 一种流数据的并发读写方法和装置
CN106648461A (zh) * 2016-11-15 2017-05-10 努比亚技术有限公司 一种内存管理装置和方法
CN106789741A (zh) * 2016-12-26 2017-05-31 北京奇虎科技有限公司 消息队列的消费方法及装置
CN106960054A (zh) * 2017-04-01 2017-07-18 北京奇虎科技有限公司 数据文件的存取方法及装置
US20170272516A1 (en) * 2016-03-17 2017-09-21 International Business Machines Corporation Providing queueing in a log streaming messaging system
US20170310628A1 (en) * 2016-04-21 2017-10-26 Confluent, Inc. Distributed message queue stream verification
CN107918621A (zh) * 2016-10-10 2018-04-17 阿里巴巴集团控股有限公司 日志数据处理方法、装置及业务***
CN108536544A (zh) * 2018-03-21 2018-09-14 微梦创科网络科技(中国)有限公司 基于数据库消息队列的消费方法、装置、服务器和介质
CN108874560A (zh) * 2018-06-05 2018-11-23 腾讯音乐娱乐科技(深圳)有限公司 进行通信的方法和通信设备
US20190130004A1 (en) * 2017-10-27 2019-05-02 Streamsimple, Inc. Streaming Microservices for Stream Processing Applications
CN109815028A (zh) * 2018-12-27 2019-05-28 北京摩拜科技有限公司 数据同步的***、方法、装置和计算机存储介质
CN110134439A (zh) * 2019-03-30 2019-08-16 北京百卓网络技术有限公司 无锁化的数据结构构建方法和写入数据、读取数据的方法
CN110187980A (zh) * 2019-04-19 2019-08-30 北京三快在线科技有限公司 消息队列监控方法、装置、电子设备及可读存储介质
CN110262905A (zh) * 2019-05-31 2019-09-20 四川长虹电器股份有限公司 基于高性能可伸缩的优先级队列的消息中间件的推送方法

Patent Citations (20)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103209214A (zh) * 2013-04-03 2013-07-17 蓝盾信息安全技术股份有限公司 一种基于NoSQL的消息中间件的实现方法
CN103761141A (zh) * 2013-12-13 2014-04-30 北京奇虎科技有限公司 一种实现消息队列的方法及装置
CN103942259A (zh) * 2014-03-21 2014-07-23 浙江大学 一种数据库同步中实现数据缓存的方法
CN105138410A (zh) * 2015-08-31 2015-12-09 北京锐安科技有限公司 一种基于磁盘缓存的消息队列的实现方法及装置
CN105808363A (zh) * 2016-03-11 2016-07-27 浪潮通用软件有限公司 一种基于Active MQ消息队列实现异步执行的方法
US20170272516A1 (en) * 2016-03-17 2017-09-21 International Business Machines Corporation Providing queueing in a log streaming messaging system
US20170310628A1 (en) * 2016-04-21 2017-10-26 Confluent, Inc. Distributed message queue stream verification
CN107918621A (zh) * 2016-10-10 2018-04-17 阿里巴巴集团控股有限公司 日志数据处理方法、装置及业务***
CN106648461A (zh) * 2016-11-15 2017-05-10 努比亚技术有限公司 一种内存管理装置和方法
CN106789741A (zh) * 2016-12-26 2017-05-31 北京奇虎科技有限公司 消息队列的消费方法及装置
CN106658050A (zh) * 2016-12-30 2017-05-10 北京奇虎科技有限公司 一种流数据的并发读写方法和装置
WO2018121740A1 (zh) * 2016-12-30 2018-07-05 北京奇虎科技有限公司 一种流数据的并发读写方法和装置
CN106960054A (zh) * 2017-04-01 2017-07-18 北京奇虎科技有限公司 数据文件的存取方法及装置
US20190130004A1 (en) * 2017-10-27 2019-05-02 Streamsimple, Inc. Streaming Microservices for Stream Processing Applications
CN108536544A (zh) * 2018-03-21 2018-09-14 微梦创科网络科技(中国)有限公司 基于数据库消息队列的消费方法、装置、服务器和介质
CN108874560A (zh) * 2018-06-05 2018-11-23 腾讯音乐娱乐科技(深圳)有限公司 进行通信的方法和通信设备
CN109815028A (zh) * 2018-12-27 2019-05-28 北京摩拜科技有限公司 数据同步的***、方法、装置和计算机存储介质
CN110134439A (zh) * 2019-03-30 2019-08-16 北京百卓网络技术有限公司 无锁化的数据结构构建方法和写入数据、读取数据的方法
CN110187980A (zh) * 2019-04-19 2019-08-30 北京三快在线科技有限公司 消息队列监控方法、装置、电子设备及可读存储介质
CN110262905A (zh) * 2019-05-31 2019-09-20 四川长虹电器股份有限公司 基于高性能可伸缩的优先级队列的消息中间件的推送方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
刘峰;鄂海红;: "基于海量数据的消息队列的性能对比与优化方案", 软件, no. 10, pages 41 - 45 *

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113505037A (zh) * 2021-06-24 2021-10-15 北京天九云电子商务有限公司 消息管理监控***、方法、可读介质及电子设备

Also Published As

Publication number Publication date
WO2021137768A1 (en) 2021-07-08
CN111552575B (zh) 2023-09-12

Similar Documents

Publication Publication Date Title
US9501512B2 (en) Optimizing storage in a publish / subscribe environment
CN111400056B (zh) 基于消息队列的消息传输方法、装置及设备
US8422786B2 (en) Analyzing documents using stored templates
CN112988683A (zh) 数据处理方法、装置、电子设备及存储介质
CN110895472A (zh) 一种识别业务变更的方法和装置
CN111552575B (zh) 基于消息队列的消息消费方法、装置及设备
CN110119386B (zh) 数据处理方法、数据处理装置、介质和计算设备
CN109766422A (zh) 信息处理方法、装置及***、存储介质、终端
CN111444192A (zh) 块链式账本中全局状态的哈希的生成方法、装置及设备
CN107193886A (zh) 文件存储方法及装置
CN108196902B (zh) 用于展示开屏广告的方法与设备
CN115455058A (zh) 缓存数据的处理方法、装置、计算机设备及存储介质
CN111144804A (zh) 一种订单处理方法、装置及***
CN110716804A (zh) 无用资源的自动删除方法、装置、存储介质及电子设备
CN110609967B (zh) 一种榜单生成方法、装置及存储介质
US11650922B2 (en) Cache coherency engine
CN112905668A (zh) 基于分布式数据流处理引擎的数据库导数方法、设备和介质
CN113127438B (zh) 用于存储数据的方法、装置、服务器和介质
CN113792038A (zh) 用于存储数据的方法和装置
CN115934999A (zh) 一种基于块文件的视频流数据存储方法、装置及介质
CN112883316A (zh) 数据处理方法、装置、电子设备及存储介质
CN114489770A (zh) 灰度发布方法、装置、计算机设备和存储介质
CN112818166A (zh) 一种视频信息查询方法、装置、电子设备和存储介质
CN113535477A (zh) 一种用于数据容灾恢复的方法与设备
CN110716699A (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
GR01 Patent grant
GR01 Patent grant