本文对消息服务MNS的队列模型涉及的专有名词及术语进行定义和解析,方便您更好地理解相关概念并使用队列模型。

Account
用户的阿里云账号ID。
队列(Queue)
消息存储的目的地,分成普通队列和延时队列两类。消息包含数据和属性,可以分成普通消息和延时消息,在一个队列中能唯一标识一个消息的有Message ID和ReceiptHandle两个参数。
普通队列
如果发送消息时不指定消息延时,消息发送到普通队列后可立即被消费。
延时队列(Delayed Queue)
如果发送消息时指定了消息延时,发送到延时队列的消息需要经过一定的时间后才能被取到。您可通过CreateQueueSetQueueAttributes指定队列的延时时长。
队列所有者
已开通消息服务MNS的Account通过CreateQueue接口创建出一个消息队列,这个Account就是该队列的所有者。队列所有者拥有此队列的所有操作权限。队列所有者对应的Account ID可以在阿里云官网查看。
生产者(Producer)
消息服务MNS的消息队列发送消息的角色。
消费者(Consumer)
消息服务MNS的消息队列获取消息的角色。
Endpoint
消息服务MNS的访问域名地址,格式如下:

http://$AccountId.mns.$Region.aliyuncs.com

  • mns.<Region>.aliyuncs.comRegion消息服务MNS服务部署的地域,您可以根据应用需要选择不同的地域。
  • AccountId:队列所有者的账号ID,调用API请求时需替换成实际的账号ID。
普通消息(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才能进行上述操作。

消息状态(Message Status)
普通消息状态说明如下:
  • 普通消息发送到普通队列时,消息初始状态是Active,当其被取走后在VisibilityTimeout的时间内状态为Inactive。若超过VisibilityTimeout时间后消息还未被删除,消息状态重新变成Active;如果在VisibilityTimeout时间内被删除,消息状态为Deleted。
  • 普通消息发送到延时队列时,消息初始状态是Delayed,经过延时队列的DelaySeconds属性值设定的时间后,消息状态变成Active。

延时消息状态说明如下:

延时消息发送到队列(普通队列或者延时队列),消息初始状态为Delayed,经过消息的DelaySeconds属性值设定的时间后,消息状态变成Active。

消息的最长存活时间由创建队列时指定的MessageRetentionPeriod属性值决定,超过此时间后消息状态会变成Expired,将被垃圾回收器回收。

消费者只能取到处于Active状态的消息。

消息状态转换示意图如下所示:

消息状态

消息生命周期示意图如下所示:

消息生命周期