本文介绍队列消息的消息属性、消息类型、消息状态。

队列消息

用户发送消息到队列。发送消息时可以指定消息体、消息延时时长、消息优先级。

消息属性

MessageId
  • 消息编号。
  • (batch) send message、receive message和peek message操作返回该属性。
  • 一个队列中每个消息都有唯一的MessageId。
  • 消息发送到队列中,MNS会生成一个MessageId,该编号一旦生成就不会变化,可以用来做数据校对。
NextVisibleTime
  • 消息下次可被消费的时间,从1970年1月1日00:00:00 000开始的毫秒数。
  • (batch) receive message和change message visibility操作返回该属性。
ReceiptHandle
  • 消息临时句柄。
  • (batch) receive message和change message visibility操作返回该属性。
  • 该句柄用于删除和修改处于Inactive状态的消息,NextVisibleTime之前有效,超过该时间使用句柄MNS会提示MessageNotExist。
  • 消息临时句柄只能使用一次,如果该句柄标识的消息状态发生改变,该句柄就会失效。
MessageBody
  • 消息正文。
  • (batch) receive message和peek message操作返回该属性。
MessageBodyMD5
  • 消息正文的MD5值。
  • (batch) send message、receive message和peek message操作返回该属性。
EnqueueTime
  • 消息发送到队列的时间,从1970-1-1 00:00:00 000开始的毫秒数。
  • (batch) receive message和peek message操作返回该属性。
FirstDequeueTime
  • 消息第一次被消费的时间,从1970-1-1 00:00:00 000开始的毫秒数。
  • (batch) receive message和peek message操作返回该属性。
  • 如果消息从未被消费过,该属性与EnqueueTime相同。
DequeueCount
  • 消息总共被消费的次数,即被receive的次数。
  • (batch) receive message和peek message操作返回该属性。
Priority
  • 消息的优先级权值,取值范围是1~16,其中1是最高优先级。
  • (batch) receive message和peek message操作返回该属性。
  • 如果队列中有不同优先级的消息,优先级越高的消息越容易更早被消费,即被ReceiveMessage操作取出。
  • MNS会尽量让高优先级的消息先出队列,正是因为分布式消息队列的一些特性不能百分之百保证高优先级的消息先被消费。

消息类型

延时消息
  • 这类消息发送到队列后,需要经过DelaySeconds指定的时间后才可被消费。
  • 发送(batch)send message请求时指定或者配置队列的DelaySeconds属性。

消息状态

  • 普通消息被发送到普通队列时,初始状态是Active,当其被取走后在VisibilityTimeout的时间内状态为Inactive。若超过VisibilityTimeout时间后消息未被删除,消息会重新变成Active状态;如果在VisibilityTimeout时间内被删除, 消息状态变为Deleted。
  • 普通消息发送到延时队列时,消息初始状态Delayed,经过延时队列的DelaySeconds属性值设定的时间后,消息状态变成Active。
  • 延时消息发送到消息队列(普通队列或者延时队列),消息的初始状态为Delayed,经过消息的DelaySeconds属性指定的时间后消息状态变成Active。
  • 消息的最长存活时间由创建队列时指定的MessageRetentionPeriod属性值决定,超过此时间后消息状态会变成Expired,将被垃圾回收器回收。
  • 消费者只能取到处于Active状态的消息。