本文对轻量消息队列(原 MNS)的队列模型涉及的专有名词及术语进行定义和解析,方便您更好地理解相关概念并使用队列模型。
Account
- 用户的阿里云账号ID。
队列(Queue)
- 消息存储的目的地,分成普通队列和延时队列两类。消息包含数据和属性,可以分成普通消息和延时消息,在一个队列中能唯一标识一个消息的有Message ID和ReceiptHandle两个参数。
普通队列
- 如果发送消息时不指定消息延时,消息发送到普通队列后可立即被消费。
延时队列(Delayed Queue)
- 如果发送消息时指定了消息延时,发送到延时队列的消息需要经过一定的时间后才能被取到。您可通过CreateQueue和SetQueueAttributes指定队列的延时时长。
队列所有者
- 已开通轻量消息队列(原 MNS)的Account通过CreateQueue接口创建出一个消息队列,这个Account就是该队列的所有者。队列所有者拥有此队列的所有操作权限。队列所有者对应的Account ID可以在阿里云官网查看。
生产者(Producer)
- 向轻量消息队列(原 MNS)的消息队列发送消息的角色。
消费者(Consumer)
- 从轻量消息队列(原 MNS)的消息队列获取消息的角色。
Endpoint
- 轻量消息队列(原 MNS)的访问域名地址,格式如下:
http://$AccountId.mns.$Region.aliyuncs.com
mns.<Region>.aliyuncs.com
:Region
是轻量消息队列(原 MNS)服务部署的地域,您可以根据应用需要选择不同的地域。AccountId
:队列所有者的账号ID,调用API请求时需替换成实际的账号ID。
- 轻量消息队列(原 MNS)的访问域名地址,格式如下:
普通消息(Message)
- 被发送到队列且立即可以被取到的消息。
延时消息(Delayed Message)
- 消息发送到队列后需要经过一定的时间后才能被取到的消息,延时时长由DelaySeconds属性决定。详情请参见SendMessage。
消息ID(Message ID)
- 标识在队列中的一条消息,在一个队列中每条消息都有唯一的Message ID,但在不同队列之间并不唯一。当消息发送到轻量消息队列(原 MNS)的队列,轻量消息队列(原 MNS)会生成一个Message ID,此ID一旦产生就不会改变,并在请求响应中返回,您主要可以使用此Message ID来做数据校对,但是删除消息必须使用ReceiptHandle。
临时句柄(ReceiptHandle)
- 由轻量消息队列(原 MNS)根据当时获取消息的行为产生的临时消息标识,这一点不同于Message ID。如需删除已消费的消息或者改变其VisiblityTimeout属性值,则用ReceiptHandle指定已消费过的消息。
ReceiptHandle只能被使用一次,如果ReceiptHandle标识的消息状态改变其就会失效,消费者只有通过获取消息后重新获取ReceiptHandle才能进行上述操作。
- 由轻量消息队列(原 MNS)根据当时获取消息的行为产生的临时消息标识,这一点不同于Message ID。如需删除已消费的消息或者改变其VisiblityTimeout属性值,则用ReceiptHandle指定已消费过的消息。
消息状态(Message Status)
- 普通消息状态说明如下:
- 普通消息发送到普通队列时,消息初始状态是Active,当其被取走后在VisibilityTimeout的时间内状态为Inactive。若超过VisibilityTimeout时间后消息还未被删除,消息状态重新变成Active;如果在VisibilityTimeout时间内被删除,消息状态为Deleted。
- 普通消息发送到延时队列时,消息初始状态是Delayed,经过延时队列的DelaySeconds属性值设定的时间后,消息状态变成Active。
延时消息状态说明如下:
延时消息发送到队列(普通队列或者延时队列),消息初始状态为Delayed,经过消息的DelaySeconds属性值设定的时间后,消息状态变成Active。
消息的最长存活时间由创建队列时指定的MessageRetentionPeriod属性值决定,超过此时间后消息状态会变成Expired,将被垃圾回收器回收。
消费者只能取到处于Active状态的消息。
消息状态转换示意图如下所示:
消息生命周期示意图如下所示:
- 普通消息状态说明如下: