CN103377043A - 消息队列的实现方法和系统、消息队列处理系统 - Google Patents

消息队列的实现方法和系统、消息队列处理系统 Download PDF

Info

Publication number
CN103377043A
CN103377043A CN2012101232543A CN201210123254A CN103377043A CN 103377043 A CN103377043 A CN 103377043A CN 2012101232543 A CN2012101232543 A CN 2012101232543A CN 201210123254 A CN201210123254 A CN 201210123254A CN 103377043 A CN103377043 A CN 103377043A
Authority
CN
China
Prior art keywords
queue
message
value
positional value
sign
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
CN2012101232543A
Other languages
English (en)
Other versions
CN103377043B (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.)
Tencent Technology Shenzhen Co Ltd
Tencent Cloud Computing Beijing Co Ltd
Original Assignee
Tencent Technology Shenzhen Co 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 Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN201210123254.3A priority Critical patent/CN103377043B/zh
Publication of CN103377043A publication Critical patent/CN103377043A/zh
Application granted granted Critical
Publication of CN103377043B publication Critical patent/CN103377043B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Multi Processors (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明提供了一种消息队列的实现方法和系统。所述方法包括:根据消息队列中触发的操作获取队列标识的位置值,并执行操作;判断获取的位置值是否与队列标识当前对应的位置值相同,若否,则拒绝操作的执行,若是,则接受操作的执行,并更新接受操作的队列标识当前对应的位置值以及队列标识中的指针值。所述系统包括:队列处理装置,用于根据消息队列中触发的操作获取队列标识的位置值;判断装置,用于判断获取的位置值是否与队列标识当前对应的位置值相同,若否,则拒绝所述操作的执行,若是,则通知存储装置;所述存储装置用于接受操作的执行,并更新接受操作的队列标识当前对应的位置值以及所述队列标识中的指针值。采用本发明提高了并发度。

Description

消息队列的实现方法和系统、消息队列处理系统
技术领域
本发明涉及数据处理技术,特别是涉及一种消息队列的实现方法和系统、消息队列处理系统。
背景技术
消息队列是消息在传递过程中保存消息的容器,也就是说发送者将消息写入消息队列中,接收者再从消息队列中取出保存的消息进行处理,进而实现发送者和接收者之间消息的共享和通信。
在消息队列的并发操作中,对于多个接收者在消息队列中的操作而言,通常利用锁服务来保证消息的正确性,使得某一接收者在对访问消息队列进行操作时,其它接收者是无法对消息队列进行操作的。
然而,消息队列中的发送、接收、删除等各种各样的操作是非常频繁的,相应的,消息队列的服务压力在逐渐地增大,不易于扩展的锁服务将为消息队列带来并发度低的问题,进而成为消息队列服务的瓶颈。
发明内容
基于此,有必要针对锁服务在消息队列造成的并发度低的问题,提供一种能提高并发度的消息队列的实现方法。
此外,还有必要提供一种能提高并发度的消息队列的实现系统。
另外,还有必要提供一种能提高并发度的消息队列处理系统。
一种消息队列的实现方法,包括如下步骤:
根据消息队列中触发的操作获取队列标识的位置值,并执行所述操作;
判断所述获取的位置值是否与所述队列标识当前对应的位置值相同,若否,则拒绝所述操作的执行,若是,则
接受所述操作的执行,并更新接受操作的队列标识当前对应的位置值以及所述队列标识中的指针值。
在其中一个实施例中,在所述拒绝所述操作的执行的步骤之后将返回所述根据消息队列中触发的操作获取队列标识的位置值的步骤:
所述方法还包括:
对操作的重试进行计数得到重试次数;
判断所述操作的重试次数是否达到次数限值,若是,则结束。
在其中一个实施例中,所述操作为发送消息,所述队列标识为队尾标识,所述执行所述操作的步骤为:
插入消息节点,向所述消息节点写入消息以及所述消息对应的标识;
若判断到所述位置值与所述队尾标识当前对应的位置值相同,将所述消息对应的标识写入所述队尾标识;
所述更新所述队列标识中的指针值的步骤为:
将尾部节点的指针值设为所述消息对应的标识。
在其中一个实施例中,所述操作为接收消息,所述队列标识为消息队列的队首标识;所述执行所述操作的步骤为:
判断头部节点中的消息是否被接收,若否,则
若判断到所述位置值与所述队首标识当前对应的位置值相同,在所述节点中提取消息,并标识消息接收者,向所述消息接收者返回所述消息。
在其中一个实施例中,所述操作为删除消息,所述执行所述操作的步骤为:
判断所述消息删除者是否与所述消息接收者相同,若是,则
若判断到所述位置值与所述队首标识当前对应的位置值相同,删除所述头部节点;
所述更新所述队列标识中的指针值的步骤为:
向所述消息队列中队首标识的指针值写入所述头部节点的下一节点中消息对应的标识。
在其中一个实施例中,所述根据所述位置值和所述队列标识当前对应的位置值接受所述操作的执行的步骤之后还包括:
根据所述操作更新所述队列标识中的标记值;
根据队首标识的标记值和队尾标识的标记值得到队列长度。
一种消息队列的实现系统,包括:
队列处理装置,用于根据消息队列中触发的操作获取队列标识的位置值;
判断装置,用于判断所述获取的位置值是否与所述队列标识当前对应的位置值相同,若否,则拒绝所述操作的执行,若是,则通知存储装置;
所述存储装置用于接受操作的执行,并更新接受操作的队列标识当前对应的位置值以及所述队列标识中的指针值。
在其中一个实施例中,所述队列处理装置包括:
计数模块,用于对操作的重试进行计数得到重试次数;
重试控制模块,用于判断所述操作的重试次数是否达到次数限值,若是,则停止执行。
在其中一个实施例中,所述操作为发送消息,所述队列标识为队尾标识,所述队列处理装置包括:
节点插入模块,用于在所述存储装置中插入消息节点,向所述消息节点写入消息以及所述消息对应的标识;
消息发送模块,用于若判断到所述位置值与所述队尾标识当前对应的位置值相同,并将尾部节点的指针值设为所述消息对应的标识;
所述存储装置还用于将所述消息对应的标识写入所述队尾标识的指针值。
在其中一个实施例中,所述操作为接收消息,所述队列标识为消息队列的队首标识,所述队列处理装置包括:
接收判断模块,用于判断头部节点中的消息是否被接收,若否,则通知传递模块;
消息提取模块,用于若判断到所述位置值与所述队首标识当前对应的位置值相同,在所述节点中提取消息,并标识消息接收者,向所述消息接收者返回所述消息。
在其中一个实施例中,所述操作为删除消息,所述队列处理装置包括:
删除判断模块,用于判断所述消息删除者是否与所述消息接收者相同,若是,则通知传递模块;
删除模块,用于若判断到所述位置值与所述队首标识当前对应的位置值相同,删除所述头部节点;
所述存储装置还用于向所述消息队列中队首标识的指针值写入所述头部节点的下一节点中消息对应的标识。
在其中一个实施例中,所述队列处理装置还用于根据所述操作更新所述队列标识中的标记值,并根据队首标识的标记值和队尾标识的标记值得到队列长度。
一种消息队列处理系统,包括:
接入服务器,用于根据消息队列中触发的操作获取队列标识的位置值;
存储服务器,用于存储消息队列,判断所述获取的位置值是否与所述队列标识当前对应的位置值相同,若否,则拒绝所述操作的执行,若是,则接受操作的执行,并更新接受操作的队列标识当前对应的位置值以及所述队列标识中的指针值。
上述消息队列的实现方法和系统、消息队列处理系统中,通过触发操作时获取到的位置值和队列标识当前所对应的位置值来选择性地接受对消息队列执行的操作,在接受了操作的执行之后,该队列标识中当前对应的位置值以及指针值更新为新的数值,进而在队列标识通过原子性完成更新的前提下替代传统的锁服务来保证消息的正确性,不需设置锁服务也能够保证消息的正确性,在消息队列中实现了多个操作的并发修改队列,提高了并发度。
附图说明
图1为一个实施例中消息队列的实现方法的流程图;
图2为另一个实施例中消息队列的实现方法的流程图;
图3为一个实施例中执行操作的方法流程图;
图4为另一个实施例中执行操作的方法流程图;
图5为另一个实施例中执行操作的方法流程图;
图6为另一个实施例中消息的实现方法的流程图;
图7为一个实施例中消息队列的实现系统的结构示意图;
图8为一个实施例中队列处理装置的结构示意图;
图9为另一个实施例中队列处理装置的结构示意图;
图10为另一个实施例中队列处理装置的结构示意图;
图11为另一个实施例中队列处理装置的结构示意图;
图12为一个实施例中消息队列处理系统的硬件结构图。
具体实施方式
如图1所示,在一个实施例中,一种消息队列的实现方法,包括如下步骤:
步骤S110,根据消息队列中触发的操作获取队列标识的位置值。
本实施例中,消息队列中触发的操作可以是消息的发送、接收以及删除操作,用于实现消息发送者和消息接收者之间的消息共享。队列标识分为队首标识和队尾标识,是以键值对的形式存储的。
消息队列包括了多个用于存储消息的节点,与头部节点关联的队首标识以及与尾部节点关联的队尾标识。其中,队首标识包括了指向头部节点的头指针以及标记值,队尾标识包括了指向尾部节点的尾指针以及标记值。例如,对于队首标识,以“队列名Head”为key,以头指针和标记值为value形成键值对进行存储。
位置值,即cas(compare and swap)值,用于控制消息队列中的多个操作,是与队列标识中的key对应的,在需要对消息队列进行操作时,将返回与该操作相关的队列标识的位置值。
步骤S130,判断获取的位置值是否与队列标识当前对应的位置值相同,若否,则进入步骤S150,若是,则进入步骤S170。
本实施例中,在位置值与该队列标识当前对应的位置值是一致的前提下,直接对队列标识中当前对应的位置值以及指针值进行更新,将接受对消息的操作,进而实现了通过位置值来控制消息队列中各种操作的执行,保证了操作并发修改消息队列时消息的正确性和原子性。
访问消息队列,传入获取的位置值,进而在与触发的操作相关的队列标识中判断传入的位置值是否与该队列标识当前所对应的位置值相同,如果是,则直接对接受了操作的队列标识当前对应的位置值进行更新,同时更新队列标识中的指针,并接受操作的执行,进行消息队列的修改,如果传入的位置值与该队列标识当前所对应的位置值不相同,则拒绝操作的执行,对消息队列的修改失败。
具体的,在消息队列的无锁访问中,必须保证操作的原子性,以防止在消息队列的并发访问中出错,即在判断到获取的位置值与队列标识当前对应的位置值相同时,必须直接对接受操作的队列标识当前对应的位置值进行更新,并同时更新队列标识中的指针值,实现队列标识中位置值和指针值的及时更新,其间不可执行任一操作,进而保证消息的正确性。
通过位置值利用cas机制仅在传入的位置值与当前对应的位置值相一致时该方可进行消息队列的修改,不需要限制多个操作的并发执行,又保证了消息的正确性。
步骤S150,拒绝操作的执行。
步骤S170,接受操作的执行,并更新接受操作的队列标识当前对应的位置值以及队列标识中的指针值。
本实施例中,在接受操作进行了消息队列的修改之后,在与这一操作相关的队列标识中对位置值进行更新,例如,每一次修改成功时将原有的位置值加1或者其它数值得到新的位置值,并且在进位置值更新的同时,还需对队列标识中的指针值进行更新,其中,该指针值是与位置值共同存储于队列标识中的。
在多个操作对消息队列所进行的并发修改过程中,例如,这些操作包括了两个消息的读操作和一个消息的写操作,此时,由于消息队列中的消息是基于先进先出(FIFO)的原则,消息的写操作所面向的对象是消息队列中的尾部节点,与队尾标识相关;消息的读操作所面向的对象是消息队列中的头部节点,与队首标识相关,因此,消息的写操作和读操作可以同时执行,但是,对于两个消息的读操作而言,将根据获取的位置值与队首标识当前对应的位置值是否相同来确定执行哪一个读操作。
也就是说,若消息的读操作A中获取的位置值与队首标识当前对应的位置值不相同,则说明消息的读取操作B已经读取了头部节点中的消息,并对队首标识更新了该队首标识当前对应的位置值和指针值,造成了消息的读操作A所获取的位置值是与队首标识当前对应的位置值不相一致,进而在提高并发度的基础上保证了操作的原子性,以及消息队列中消息的正确性。
在一个实施例中,上述步骤S150之后还将返回步骤S110。
如图2所示,上述消息队列的实现方法还包括:
步骤S210,对操作的重试进行计数得到重试次数;
步骤S230,判断操作的重试次数是否达到次数限值,若是,则结束,若否,则返回步骤S110。
本实施例中,在拒绝操作的执行,对消息队列的修改失败时,将返回步骤S110重新获取位置值,并重新尝试相应操作的执行。
在重新尝试操作的执行这一过程中,还将统计该操作的重试次数,若该重次次数达到了设定的次数限值,则不再进行重试。例如,该次数限值可以是100次。
如图3所示,在一个实施例中,上述操作为发送消息,队列标识为队尾标识,则上述执行操作的具体过程为:
步骤S301,插入消息节点,向消息节点写入消息以及消息对应的标识。
本实施例中,消息队列中发送消息的操作实质为消息的写入操作。根据消息队列的先进先出原则,将在消除队列的尾端插入新的消息节点。在消息队列的存储空间中插入消息节点,为消息的写入分配内存空间,进而在消息节点中以键值对的形式写入消息以及消息所对应的标识,其中,消息所对应的标识为key(键),而消息为value(值)。
步骤S303,若判断到位置值与队尾标识当前对应的位置值相同,并将尾部节点的指针值设为消息对应的标识。
本实施例中,在判断到已经获取到的位置值是与队尾标识相一致的,说明没有其它的操作对消息队列的尾端进行了修改,可以将消息写入。此时,在以链表形式存在的消息队列中,需在相互串联的节点中插入新的消息节点,使得消息节点与尾部节点相连。将尾部节点的指针值设为消息对应的标识,使得尾部节点的指针指向插入的消息节点。
上述更新队列标识中的指针值的具体过程为:将消息对应的标识写入队尾标识。将消息对应的标识写入队尾标识,使得队尾标识中的尾指针移向插入的消息节点。
在一个实施例中,节点中的指针值是以key的形式进行单独存储的,与同相存储于节点中的以消息对应的标识为key,消息为value的键值对是分别进行单独存储的。未将指针值以key的形式置于value可以有效地避免节点中value的修改次数和value中一致性的问题,不需要在进行发送消息、接收消息和删除消息的操作时修改节点中的value,进而使得发送消息、接收消息和删除消息的操作不需要串行执行,有利于并发性的提高。
若判断到位置值与队尾标识当前对应的位置值不相同,即发送消息的操作执行失败时,删除插入的消息节点。
如图4所示,在一个实施例中,上述操作为接收消息,队列标识为消息队列的队首标识,上述执行操作的具体过程为:
步骤S401,判断头部节点中的消息是否被接收,若否,则进入步骤S403,若是,则结束。
本实施例中,消息队列中接收消息的操作实质为消息的读操作。若节点中消息已经被接收了,则将会对其进行标识,使得其它接收者在进行接收消息的操作之前能够获知。具体的,在节点的键值对中,value还包括了设置的消息的标识值,对于已经被接收的消息,在value中相应字段将被设置了具体的值,即value中的ReceiptHandle字段的值将被设置了标识值。此时,判断头部节点中是否存在标识值,若否,则说明头部节点中的消息还未被接收过。可对头部节点执行消息的读操作。
步骤S403,若判断到位置值与队首标识当前对应的位置值相同,在节点中提取消息,并标识消息接收者,向消息接收者返回消息。
本实施例中,在判断到已经获取的位置值与队首标识当前对应的位置值相同时,说明从获取位置值这一时间点到传入获取的位置值进行判断这一时间点之前头部节点并未发生任何读操作,可进行消息的提取,并在在value中标识消息接收者。
如图5所示,在一个实施例中,操作为删除消息,上述执行操作的具体过程为:
步骤S501,判断消息删除者是否与消息接收者相同,若是,则进入步骤S503,若否,则结束。
本实施例中,消息队列中消息的读取包括了读消息的操作和从消息队列中移除读取的已读消息的操作,因此,某一节点中消息的删除者应当是该节点存储的消息所对应的接收者。
在接收了消息之后,根据头部节点中标识的消息接收者判断消息删除者是否与消息接收者相同,如果相同,才可进行消息的删除操作。
步骤S503,删除头部节点。
本实施例中,获取头部节点的下一节点中消息对应的标识,该标识可以在头部节点的指针值中得到,头部节点出队,并删除。
上述更新队列标识中的指针值的具体过程为:向消息队列中队首标识的指针值写入头部节点的下一节点中消息对应的标识。将下一节点中消息对应的标识写入队首标识的指针值,使队首标识中的头指针指向头部节点的下一节点。
如图6所示,在一个实施例中,上述消息队列的实现方法还包括如下步骤:
步骤S610,根据操作更新队列标识中的标记值。
本实施例中,队列标识还包括了标记值(tag值),该标记值用于计算当前队列长度,存储于队列标识的value中。每一次发送消息完成之后,队尾标识的标记值将进行自增运算,与1相加得到新的标记值;每一删除消息完成之后,队首标识的标记值将进行自增运算,得到新的标记值。
在另一个实施例中,上述消息队列的实现方法还包括判断更新的标记值是否大于更新限值,若是,则将更新的标记值调整为初始值,进而防止标记值无限地增长。在优选的实施例中,初始值为1。
步骤S630,根据队首标识的标记值和队尾标识的标记值得到队列长度。
本实施例中,队列长度表征了消息队列中存储的消息数,通过计算队尾标识的标记值和队首标识的标记值之差得到当前队列长度。在传统的消息队列中,队列长度是进行单独存储的,例如,以“队列名_MessageNum”为key,队列长度为value形成键值对的形式存储的,消息队列中发生的每一次发送消息的操作或者删除消息的操作都需要额外对单独存储的队列长度进行一次写操作,以更新队列长度,这将相应地增加了网络交互,损害性能。通过队列标识中的标记值得到队列长度不需要进行额外操作即可得到当前的队列长度,大大地优化了消息队列。
在另一个实施例中,上述消息队列的实现方法还包括:
判断队列长度是否小于零,若是,则调整为得到的队列长度与最大长度之和。例如,最大长度可以为1000万。
判断队列长度是否达到长度限值,若是,则拒绝发送消息,若否,则消息发送成功。
本实施例中,若队列长度达到了长度限值,则说明消息队列已满,当前进行的写入消息的操作失败。
在另一个实施例中,上述消息队列的实现方法中,以队首标识为起始,依次相互连接多个节点,并以队尾标识终止所形成的消息队列中,在队首标识和头部节点之间还将设置哑节点(Dummy节点),用于方便在并发操作中快速的查找到头部节点。哑节点中不存储具体的消息,只存储了指向头部节点的指针。
如图7所示,在一个实施例中,一种消息队列的实现系统,包括队列处理装置10、判断装置30以及存储装置50。
队列处理装置10,用于根据消息队列中触发的操作获取队列标识的位置值。
本实施例中,消息队列中触发的操作可以是消息的发送、接收以及删除操作,用于实现消息发送者和消息接收者之间的消息共享。队列标识分为队首标识和队尾标识,是以键值对的形式存储的。
消息队列包括了多个用于存储消息的节点,与头部节点关联的队首标识以及与尾部节点关联的队尾标识。其中,队首标识包括了指向头部节点的头指针以及标记值,队尾标识包括了指向尾部节点的尾指针以及标记值。例如,对于队首标识,以“队列名_Head”为key,以头指针和标记值为value形成键值对进行存储。
位置值,即cas值,用于控制消息队列中的多个操作,是与队列标识中的key对应的,在需要对消息队列进行操作时,将返回与该操作相关的队列标识的位置值。
判断装置30,用于判断获取的位置值是否与队列标识当前对应的位置值相同,若否,则拒绝操作的执行,若是,则通知存储装置50。
本实施例中,在位置值与该队列标识当前对应的位置值是一致的前提下,存储装置30将直接对队列标识当前对应的位置值以及指针值进行更新,接受对消息的操作,进而实现了通过位置值来控制消息队列中各种操作的执行,保证了操作并发修改消息队列时消息的正确性和原子性。
存储装置50访问消息队列,传入获取的位置值,进而在与触发的操作相关的队列标识中判断传入的位置值是否与该队列标识当前所对应的位置值相同,如果是,则直接更新接受了操作的队列标识当前对应的位置值以及队列标识中的指针,并接受操作的执行,进行消息队列的修改,如果传入的位置值与该队列标识当前所对应的位置值不相同,则拒绝操作的执行,对消息队列的修改失败。
具体的,在消息队列的无锁访问中,必须保证操作的原子性,以防止在消息队列的并发访问中出错,即存储装置50在判断到获取的位置值与队列标识当前对应的位置值相同时,必须直接更新接受操作的队列标识当前对应的位置值以及队列标识中的指针值,实现位置值和指针值的更新,其间不可执行任一操作,进而保证消息的正确性。
存储装置50通过位置值利用cas机制仅在传入的位置值与当前对应的位置值相一致时该方可进行消息队列的修改,不需要限制多个操作的并发执行,又保证了消息的正确性。
存储装置50,用于接受操作的执行,并更新接受操作的队列标识当前对应的位置以及所述队列标识中的指针值。
本实施例中,在接受操作进行了消息队列的修改之后,存储装置50在与这一操作相关的队列标识中对位置值进行更新,例如,每一次修改成功时将原有的位置值加1或者其它数值得到新的位置值,并且在进位置值更新的同时,还需对队列标识中的指针值进行更新,其中,该指针值是与位置值共同存储于队列标识中的。
如图8所示,在另一个实施例中,队列处理装置10包括:
计数模块110,用于对操作的重试进行计数得到重试次数。
重试控制模块130,用于还用于判断操作的重试次数是否达到次数限值,若是,则停止执行,若否,则根据消息队列中触发的操作获取队列标识的位置值。
本实施例中,在拒绝操作的执行,对消息队列的修改失败时,将重新获取位置值,并重新尝试相应操作的执行。
此时,队列处理装置10还将统计该操作的重试次数,若该重次次数达到了设定的次数限值,则不再进行重试。例如,该次数限值可以是100次。
如图9所示,在一个实施例中,操作为发送消息,队列标识为队尾标识,上述队列处理装置包括节点插入模块210以及消息发送模块230。
节点插入模块210,用于在存储装置50中插入消息节点,向消息节点写入消息以及消息对应的标识。
本实施例中,消息队列中发送消息的操作实质为消息的写入操作。根据消息队列的先进先出原则,节点插入模块210将在消除队列的尾端插入新的消息节点。节点插入模块210在消息队列的存储空间中插入消息节点,为消息的写入分配内存空间,进而在消息节点中以键值对的形式写入消息以及消息所对应的标识,其中,消息所对应的标识为key(键),而消息为value(值)。
消息发送模块230,用于若判断到位置值与队尾标识当前对应的位置值相同,并将尾部节点的指针值设为消息对应的标识。
本实施例中,在判断到已经获取到的位置值是与队尾标识相一致的,说明没有其它的操作对消息队列的尾端进行了修改,消息发送模块230可以将消息写入。此时,在以链表形式存在的消息队列中,需在相互串联的节点中插入新的消息节点,使得消息节点与尾部节点相连。消息发送模块230将尾部节点的指针值设为消息对应的标识,使得尾部节点的指针指向插入的消息节点;将消息对应的标识写入队尾标识,使得队尾标识中的尾指针移向插入的消息节点。
在一个实施例中,节点中的指针值是以key的形式进行单独存储的,与同相存储于节点中的以消息对应的标识为key,消息为value的键值对是分别进行单独存储的。未将指针值以key的形式置于value可以有效地避免节点中value的修改次数和value中一致性的问题,不需要在进行发送消息、接收消息和删除消息的操作时修改节点中的value,进而使得发送消息、接收消息和删除消息的操作不需要串行执行,有利于并发性的提高。
在一个实施例中,存储装置50还用于将消息对应的标识写入队尾标识的指针值。将消息对应的标识写入队尾标识,使得队尾标识中的尾指针移向插入的消息节点。
若判断到位置值与队尾标识当前对应的位置值不相同,即发送消息的操作执行失败时,删除插入的消息节点。
如图10所示,在另一个实施例中,操作为接收消息,队列标识为消息队列的队首标识,上述队列处理装置包括接收判断模块410以及消息提取模块430。
接收判断模块410,用于判断头部节点中的消息是否被接收,若否,则通知消息提取模块430,若是,则停止执行。
本实施例中,消息队列中接收消息的操作实质为消息的读操作。若节点中消息已经被接收了,则将会对其进行标识,使得其它接收者在进行接收消息的操作之前能够获知。具体的,在节点的键值对中,value还包括了设置的消息的标识值,对于已经被接收的消息,在value中相应字段将被设置了具体的值,即value中的ReceiptHandle字段的值将被设置了标识值。此时,接收判断模块410判断头部节点中是否存在标识值,若否,则说明头部节点中的消息还未被接收过。可对头部节点执行消息的读操作。
消息提取模块430,用于若判断到位置值与队首标识当前对应的位置值相同,在节点中提取消息,并标识消息接收者,向消息接收者返回消息。
本实施例中,消息提取模块430在判断到已经获取的位置值与队首标识当前对应的位置值相同时,说明从获取位置值这一时间点到传入获取的位置值进行判断这一时间点之前头部节点并未发生任何读操作,可进行消息的提取,并在在value中标识消息接收者。
如图11所示,在另一个实施例中,操作为删除消息,上述队列处理装置包括删除判断模块610以及删除模块630。
删除判断模块610,用于判断消息删除者是否与消息接收者相同,若是,则通知删除模块630,若否,则结束。
本实施例中,消息队列中消息的读取包括了读消息的操作和从消息队列中移除读取的已读消息的操作,因此,某一节点中消息的删除者应当是该节点存储的消息所对应的接收者。
在接收了消息之后,删除判断模块610根据头部节点中标识的消息接收者判断消息删除者是否与消息接收者相同,如果相同,才可进行消息的删除操作。
删除模块630,用于若判断到位置值与队首标识当前对应的位置值相同,删除头部节点。
本实施例中,删除模块630获取头部节点的下一节点中消息对应的标识,该标识可以在头部节点的指针值中得到,将该标识写入队首标识的指针值,使队首标识中的头指针指向头部节点的下一节点,头部节点出队,并删除。
在另一个实施例中,存储装置50还用于向消息队列中队首标识的指针值写入头部节点的下一节点中消息对应的标识。将下一节点中消息对应的标识写入队首标识的指针值,使队首标识中的头指针指向头部节点的下一节点。
在另一个实施例中,上述消息队列的实现系统中,队列处理装置还用于根据操作更新队列标识中标记值,并根据队首标识的标记值和队尾标识的标记值得到队列长度。
本实施例中,队列标识还包括了标记值(tag值),该标记值用于计算当前队列长度,存储于队列标识的value中。每一次发送消息完成之后,队列处理装置对队尾标识的标记值进行自增运算,与1相加得到新的标记值;每一删除消息完成之后,队首标识的标记值将进行自增运算,得到新的标记值。
在另一个实施例中,队列处理装置还用于判断更新的标记值是否大于更新限值,若是,则将更新的标记值调整为初始值,进而防止标记值无限地增长。在优选的实施例中,初始值为1。
队列长度表征了消息队列中存储的消息数,通过计算队尾标识的标记值和队首标识的标记值之差得到当前队列长度。
在另一个实施例中,上述队列处理装置还用于判断队列长度是否小于零,若是,则调整为得到的队列长度与最大长度之和。例如,最大长度可以为1000万。
队列处理装置还用于判断队列长度是否达到长度限值,若是,则拒绝发送消息,若否,则消息发送成功。
本实施例中,若队列长度达到了长度限值,则说明消息队列已满,当前进行的写入消息的操作失败。
在另一个实施例中,上述消息队列的实现方法中,以队首标识为起始,依次相互连接多个节点,并以队尾标识终止所形成的消息队列中,在队首标识和头部节点之间还将设置哑节点(Dummy节点),用于方便在并发操作中快速的查找到头部节点。哑节点中不存储具体的消息,只存储了指向头部节点的指针。
如图12所示,在一个实施例中,一种消息队列处理系统,包括:
接入服务器710,用于根据消息队列中触发的操作获取队列标识的位置值。
存储服务器730,用于存储消息队列,判断获取的位置值是否与队列标识当前对应的位置值相同,若否,则拒绝操作的执行,若是,则接受操作的执行,并更新接受操作的队列标识当前对应的位置值以及队列标识中的指针值。
在上述消息队列处理系统中,接入服务器710可以为多个,并且可以通过增加接入服务器710来缓解前端的服务压力。上述消息队列的实现系统运行于上述消息队列处理系统这一实体的硬件环境中,实现消息队列的并发操作。
上述消息队列的实现方法和系统、消息队列处理系统中,通过触发操作时获取到的位置值和队列标识当前所对应的位置值来选择性地接受对消息队列执行的操作,在接受了操作的执行之后,该队列标识当前对应的位置值以及指针值更新为新的数值,进而在队列标识通过原子性完成更新的前提下替代传统的锁服务来保证消息的正确性,不需设置锁服务也能够保证消息的正确性,在消息队列中实现了多个操作的并发修改队列,提高了并发度。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。

Claims (13)

1.一种消息队列的实现方法,包括如下步骤:
根据消息队列中触发的操作获取队列标识的位置值,并执行所述操作;
判断所述获取的位置值是否与所述队列标识当前对应的位置值相同,若否,则拒绝所述操作的执行,若是,则
接受所述操作的执行,并更新接受操作的队列标识当前对应的位置值以及所述队列标识中的指针值。
2.根据权利要求1所述的消息队列的实现方法,其特征在于,在所述拒绝所述操作的执行的步骤之后将返回所述根据消息队列中触发的操作获取队列标识的位置值的步骤;
所述方法还包括:
对操作的重试进行计数得到重试次数;
判断所述操作的重试次数是否达到次数限值,若是,则结束。
3.根据权利要求1所述的消息队列的实现方法,其特征在于,所述操作为发送消息,所述队列标识为队尾标识,所述执行所述操作的步骤为:
插入消息节点,向所述消息节点写入消息以及所述消息对应的标识;
若判断到所述位置值与所述队尾标识当前对应的位置值相同,将尾部节点的指针值设为所述消息对应的标识;
所述更新所述队列标识中的指针值的步骤为:
将所述消息对应的标识写入所述队尾标识的指针值。
4.根据权利要求1所述的消息队列的实现方法,其特征在于,所述操作为接收消息,所述队列标识为消息队列的队首标识;所述执行所述操作的步骤为:
判断头部节点中的消息是否被接收,若否,则
若判断到所述位置值与所述队首标识当前对应的位置值相同,在所述节点中提取消息,并标识消息接收者,向所述消息接收者返回所述消息。
5.根据权利要求4所述的消息队列的实现方法,其特征在于,所述操作为删除消息,所述执行所述操作的步骤为:
判断所述消息删除者是否与所述消息接收者相同,若是,则
若判断到所述位置值与所述队首标识当前对应的位置值相同,删除所述头部节点;
所述更新所述队列标识中的指针值的步骤为:
向所述消息队列中队首标识的指针值写入所述头部节点的下一节点中消息对应的标识。
6.根据权利要求1所述的消息队列的实现方法,其特征在于,所述根据所述位置值和所述队列标识当前对应的位置值接受所述操作的执行的步骤之后还包括:
根据所述操作更新所述队列标识中的标记值;
根据队首标识的标记值和队尾标识的标记值得到队列长度。
7.一种消息队列的实现系统,其特征在于,包括:
队列处理装置,用于根据消息队列中触发的操作获取队列标识的位置值;
判断装置,用于判断所述获取的位置值是否与所述队列标识当前对应的位置值相同,若否,则拒绝所述操作的执行,若是,则通知存储装置;
所述存储装置用于接受操作的执行,并更新接受操作的队列标识当前对应的位置值以及所述队列标识中的指针值。
8.根据权利要求7所述的消息队列的实现系统,其特征在于,所述队列处理装置包括:
计数模块,用于对操作的重试进行计数得到重试次数;
重试控制模块,用于判断所述操作的重试次数是否达到次数限值,若是,则停止执行。
9.根据权利要求7所述的消息队列的实现系统,其特征在于,所述操作为发送消息,所述队列标识为队尾标识,所述队列处理装置包括:
节点插入模块,用于在所述存储装置中插入消息节点,向所述消息节点写入消息以及所述消息对应的标识;
消息发送模块,用于若判断到所述位置值与所述队尾标识当前对应的位置值相同,并将尾部节点的指针值设为所述消息对应的标识;
所述存储装置还用于将所述消息对应的标识写入所述队尾标识的指针值。
10.根据权利要求7所述的消息队列的实现系统,其特征在于,所述操作为接收消息,所述队列标识为消息队列的队首标识,所述队列处理装置包括:
接收判断模块,用于判断头部节点中的消息是否被接收,若否,则通知传递模块;
消息提取模块,用于若判断到所述位置值与所述队首标识当前对应的位置值相同,在所述节点中提取消息,并标识消息接收者,向所述消息接收者返回所述消息。
11.根据权利要求10所述的消息队列的实现系统,其特征在于,所述操作为删除消息,所述队列处理装置包括:
删除判断模块,用于判断所述消息删除者是否与所述消息接收者相同,若是,则通知传递模块;
删除模块,用于若判断到所述位置值与所述队首标识当前对应的位置值相同,删除所述头部节点;
所述存储装置还用于向所述消息队列中队首标识的指针值写入所述头部节点的下一节点中消息对应的标识。
12.根据权利要求7所述的消息队列的实现系统,其特征在于,所述队列处理装置还用于根据所述操作更新所述队列标识中的标记值,并根据队首标识的标记值和队尾标识的标记值得到队列长度。
13.一种消息队列处理系统,其特征在于,包括:
接入服务器,用于根据消息队列中触发的操作获取队列标识的位置值;
存储服务器,用于存储消息队列,判断所述获取的位置值是否与所述队列标识当前对应的位置值相同,若否,则拒绝所述操作的执行,若是,则接受操作的执行,并更新接受操作的队列标识当前对应的位置值以及所述队列标识中的指针值。
CN201210123254.3A 2012-04-24 2012-04-24 消息队列的实现方法和系统、消息队列处理系统 Active CN103377043B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201210123254.3A CN103377043B (zh) 2012-04-24 2012-04-24 消息队列的实现方法和系统、消息队列处理系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201210123254.3A CN103377043B (zh) 2012-04-24 2012-04-24 消息队列的实现方法和系统、消息队列处理系统

Publications (2)

Publication Number Publication Date
CN103377043A true CN103377043A (zh) 2013-10-30
CN103377043B CN103377043B (zh) 2016-06-22

Family

ID=49462210

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201210123254.3A Active CN103377043B (zh) 2012-04-24 2012-04-24 消息队列的实现方法和系统、消息队列处理系统

Country Status (1)

Country Link
CN (1) CN103377043B (zh)

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107153580A (zh) * 2016-03-04 2017-09-12 北京忆恒创源科技有限公司 获取队列精确状态的装置及其方法
CN107171820A (zh) * 2016-03-08 2017-09-15 北京京东尚科信息技术有限公司 信息传输、发送、获取方法和装置
CN107943597A (zh) * 2017-08-11 2018-04-20 成都萌想科技有限责任公司 一种基于memcache的线程安全消息队列
CN108509281A (zh) * 2017-03-30 2018-09-07 北京云中融信网络科技有限公司 消息存储方法及装置
CN110046049A (zh) * 2018-01-15 2019-07-23 迈普通信技术股份有限公司 队列管理方法、装置及数据通信设备
CN110351355A (zh) * 2019-07-04 2019-10-18 苏宁云计算有限公司 消息处理系统
CN111814007A (zh) * 2020-07-31 2020-10-23 新华三信息安全技术有限公司 双向链表数据处理方法、装置、设备及机器可读存储介质
CN113377549A (zh) * 2021-08-12 2021-09-10 浙江齐安信息科技有限公司 一种队列数据控制方法、系统及队列数据结构

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101470623A (zh) * 2007-12-26 2009-07-01 无锡江南计算技术研究所 队列管理方法和队列管理器、队列消息的处理方法和系统

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101470623A (zh) * 2007-12-26 2009-07-01 无锡江南计算技术研究所 队列管理方法和队列管理器、队列消息的处理方法和系统

Cited By (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107153580B (zh) * 2016-03-04 2020-08-18 北京忆恒创源科技有限公司 获取队列精确状态的装置及其方法
CN107153580A (zh) * 2016-03-04 2017-09-12 北京忆恒创源科技有限公司 获取队列精确状态的装置及其方法
CN107171820B (zh) * 2016-03-08 2019-12-31 北京京东尚科信息技术有限公司 信息传输、发送、获取方法和装置
CN107171820A (zh) * 2016-03-08 2017-09-15 北京京东尚科信息技术有限公司 信息传输、发送、获取方法和装置
CN108509281A (zh) * 2017-03-30 2018-09-07 北京云中融信网络科技有限公司 消息存储方法及装置
CN108509281B (zh) * 2017-03-30 2021-05-04 北京云中融信网络科技有限公司 消息存储方法及装置
CN107943597A (zh) * 2017-08-11 2018-04-20 成都萌想科技有限责任公司 一种基于memcache的线程安全消息队列
CN110046049A (zh) * 2018-01-15 2019-07-23 迈普通信技术股份有限公司 队列管理方法、装置及数据通信设备
CN110351355A (zh) * 2019-07-04 2019-10-18 苏宁云计算有限公司 消息处理系统
CN110351355B (zh) * 2019-07-04 2022-02-25 苏宁云计算有限公司 消息处理系统
CN111814007A (zh) * 2020-07-31 2020-10-23 新华三信息安全技术有限公司 双向链表数据处理方法、装置、设备及机器可读存储介质
CN111814007B (zh) * 2020-07-31 2023-03-31 新华三信息安全技术有限公司 双向链表数据处理方法、装置、设备及机器可读存储介质
CN113377549A (zh) * 2021-08-12 2021-09-10 浙江齐安信息科技有限公司 一种队列数据控制方法、系统及队列数据结构
CN113377549B (zh) * 2021-08-12 2021-12-07 浙江齐安信息科技有限公司 一种队列数据控制方法、系统及队列数据结构

Also Published As

Publication number Publication date
CN103377043B (zh) 2016-06-22

Similar Documents

Publication Publication Date Title
CN103377043A (zh) 消息队列的实现方法和系统、消息队列处理系统
WO2022143242A1 (zh) 基于区块链的交易分发执行方法、装置服务器及存储介质
US9778998B2 (en) Data restoration method and system
US20160381164A1 (en) Optimizing storage in a publish / subscribe environment
CN102306115B (zh) 异步远程复制方法、系统及设备
EP2562991A1 (en) Data prefetching method, node and system for distributed hash table dht memory system
CN106503020B (zh) 日志数据处理方法及装置
CN110019873B (zh) 人脸数据处理方法、装置及设备
CN107122379A (zh) 收集与本地存储的数据文件相关联的事务数据
CN109240614B (zh) 一种数据存储方法、装置及相关设备
CN111897666B (zh) 用于多进程之间通信的方法、设备及系统
CN109981715B (zh) 一种会话管理的方法及装置
CN103516580A (zh) 一种基于消息队列实现消息接收与转发的方法及系统
CN106330788B (zh) 报文分片传输方法和装置
CN112256776B (zh) 表单重复提交检测方法、装置、计算机设备和存储介质
CN102279855A (zh) 一种数据库处理事务的装置及方法
CN111339070A (zh) 一种订单重复提交的控制方法及装置
CN106973008B (zh) 一种选择性撤回邮件的实现方法
CN104348905B (zh) 一种离线推送消息的方法及装置
US9959069B2 (en) Externalized execution of input method editor
CN106293996A (zh) 数据同步方法、主设备、备份设备和系统
CN107506378A (zh) 数据库访问的实现方法和装置
CN103365705B (zh) 消息队列处理方法和装置
CN102929657A (zh) 一种内存数据共享方法、装置和系统
US11435999B2 (en) Method and apparatus for upgrading software

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20190809

Address after: 518000 Nanshan District science and technology zone, Guangdong, Zhejiang Province, science and technology in the Tencent Building on the 1st floor of the 35 layer

Co-patentee after: Tencent cloud computing (Beijing) limited liability company

Patentee after: Tencent Technology (Shenzhen) Co., Ltd.

Address before: Shenzhen Futian District City, Guangdong province 518044 Zhenxing Road, SEG Science Park 2 East Room 403

Patentee before: Tencent Technology (Shenzhen) Co., Ltd.