当使用RabbitMQ发布消息时,消息又AMQP规范中的三个低层帧类型组成:json
这三种帧类型按顺序一块儿工做,以便消息传递时无缺无损。服务器
其中,内容头帧中的消息属性是一种预约义的值,这些值经过设置Basic.Properties数据结构进行指定:数据结构
不建议使用的属性有:priority和cluster-id属性。app
content-type属性用于描述消息体的数据格式,如同各类标准化的HTTP规范,content-type传输消息体也可使用MIME类型。例如,若是应用程序正在发送JSON序列化的数据值,那么能够将content-type设置为application/json。若是客户端支持自动序列化,能够在消费消息时,帮你进行序列化的工做。性能
默认状况下,经过AMQP发送的消息不会被压缩。但若是在消息数量较大的场景下,则可能会但愿对消息进行压缩。AMQP提供了content-encoding属性设置压缩编码:编码
不要混淆content-encoding和content-type。与HTTP规范同样,content-encoding用于指示content-type以外的某种编码级别。它是一个修饰字段,一般用于代表消息体的内容已经使用gzip或其余形式的压缩方式进行了压缩。
结合content-type属性后,content-encoding属性使消费者应用程序可以基于一种明确的契约与发布者进行交互。spa
在AMQP规范中,message-id和correlation-id是“应用级别使用”的属性,原则上,你能够利用它们实现任何目的。这两个字段容许255个字节的UTF-8编码数据,并以未压缩的方式存储在Basic.Properties数据结构中。3d
message-id属性能够存放消息的惟一标识。code
correlation-id属性能够指定该消息是另外一个消息的响应(另外一个消息的标识)。blog
经过使用timestamp属性来指示消息的建立时间,消费者能够用来评估消息投递过程的性能。
该属性没有时区上下文,所以建议在全部消息中使用UTC或其余统一的时区。
若是消息没有被消费,expiration属性会告诉RabbitMQ什么时候应该丢弃消息。它的格式是一个短字符串,容许255个字符。
想要利用expiration属性来实现RabbitMQ消息的自动过时,它必须包含一个UNIX纪元时间或整数时间戳,而后把它存储为字符串。若是把一个已经超时的消息发布到服务器,则该消息不会被路由到任何队列,而是被直接丢弃。
RabbitMQ还有一个可让消息过时的功能,在声明队列时,将一个x-message-ttl参数和队列定义在一块儿,这个值也是一个UNIX纪元时间戳,精度是毫秒,数据类型是整数值。
delivery-mode多是不少人研发人员最感兴趣的一个属性,由于它关乎与RabbitMQ的性能。它表示在将消息投递给任何消费者以前,是否但愿先将它持久化到磁盘上,delivery-mode又2个值:1表示非持久化消息,2表示持久化消息。
不要把消息持久化和队列持久化(durable)混淆,队列持久化是告诉RabbitMQ队列的定义在重启RabbitMQ后是否仍然有效。只有设置了消息的delivery-mode才会告诉RabbitMQ消息是否应该被持久化。一个队列可能包含持久化和未持久化的消息。
前面说过delivery-mode属性关乎性能,是由于内存IO比磁盘IO要快,所以将delivery-mode设置为1将会尽量下降消息投递的延迟性。
尽管这能够保证RabbitMQ崩溃时消息不会丢失,可是它存在性能和伸缩性的问题,设置为持久化将会对消息投递和性能有着很大的影响。
app-id和user-id属性提供了关于消息的另外一层信息,能够携带一些信息以便消费者应用程序在处理消息以前进行验证。
app-id属性在AMQP规范中定义为“短字符串”,最多容许UTF-8字符。在生成消息时可使用app-id传递特定API和版本号。可增强使用app-id能够更容易地追踪恶意消息的来源。
user-id属性通常用于存放已经登陆的用户信息。
type属性被定义为“消息类型名称”,通常能够用于描述消息中的内容,应用程序能够根据它来肯定如何处理一个消息。
建立自描述消息时,type属性很是有用,它可用于指定记录类型或外部定义文件(使用Google的Protobuf)。
使用reply-to能够构件一个用来恢复消息的私有响应队列。这个定义中有大多的不明确性,因此使用起来需谨慎。
headers属性是key-value结构,容许用户自定义任意的key和value。
key能够是ASCII或Unicode字符串,最大长度为255个字符。value能够是任何有效的AMQP值类型。
与其余属性不一样,header属性容许你添加任何想要添加的数据到消息头表中。而且,RabbitMQ能够根据headers表中填充的值来路由消息,而不须要依赖路由键。
截至3.5.0版本,RabbitMQ已经按照AMQP规范实现了priority字段,它的值被定义为0~9之间。用于指定队列中消息的优先级。
priority字段实现为无符号字节,因此优先级能够是0~255,但优先级应该被限制在0~9之间。
cluster-id属性在AMQP0-8中定义的,但随后被删除。
AMQP0-9-1将其重命名为reserved,并声明它必须为空,虽然RabbitMQ目前没有根据规范要求它是空的,但你最好彻底规避它。