amqp笔记

一、exchangejson

message的生产者能够将消息发送给exchange,而后由exchange路由到不一样的queue中。数组

exchange有4种类型:多线程

direct exchange:msg只会路由到一个queue上。当有多个queue以相同到routing key接入到direct exchange时,将产生round robin的效果。app

fanout exchange:msg在exchange中会自动复制,并分发至全部接入到exchange中的queue上,达到广播的效果。tcp

topic exchange:性能

header exchange:fetch

此外,exchange还有多个重要的属性:优化

name编码

durability:可选值为[durable,transient],当设置为durable时,exchange重启后,将自动恢复。spa

auto-deleting:当最后一个bond在exchange上的queue解绑时,将自动删除exchange。

在特殊状况下,一个message能够被返还给publisher、丢弃或转到“dead letter queue”中,这取决于生产者在publish message时的配置。

二、queue

queue有一些重要的特性:

name:queue的名称,最大长度255byte

durable:在服务重启后,queue是否恢复

autodelete:当最后一个subscriber消失后,是否自动删除queue?

其余参数:例如msg是否带有ttl超时时间、队列长度是否设限等。

queue在使用前须要先声明。声明一个queue时,若是该queue还没有存在,则amqp建立之。若queue已经存在,且全部配置均与声明的相同,则不作操做;若queue存在,但参数配置却不相同,则报PRECONDITION_FAILED错误。

2.1 queue name

应用程序能够为queue指定一个名字,也能够申请broker帮忙分配一个名字,名字的长度最大为255byte,可使用utf-8字符。

如果申请broker帮忙分配名字,那么名字将携带在declare的response中返回给应用程序。

有“amq.”前缀的名字默认为amqp内部使用,若用户声明的queue带有这样的名称,则会收到ACCESS_REFUSED错误。

2.2 queue durabilty

设置为durability的queue会持久化到磁盘,当broker重启后,会从新加载进来。可是并不是每条存放在durability queue中message都会持久化,而是只有persistent message才会持久化。

3. bindings

binding是exchange将message路由到queue中的规则。若想让exchange中的message能够路由到某个queue,则queue必须先bond到queue上。对于一些类型的exchange,它使用routing key做为路由的依据,相似filter功能。

当一条消息没法被路由到任何一个queue时,该消息能够被返还给publisher或直接销毁(采用那种行为取决与publisher的设置)。

4. consumers

消息须要被consumer消费才有意义。

consumer有两种方式来消费message。

push方式:由broker推送给订阅了queue的consumer。

pull方式:由consumer本身到queue中拉取message。

当使用push方式时,咱们称consumer被“注册”(registe)到了queue上。一个queue能够被多个consumer注册。此外,consumer也能够以exclusive的方式来注册,此时,consumer是排他的,当本身在消费时,其余consumer不能从queue中消费。

每一个consumer都有一个本身的tag(称为consumer tag),能够用来从queue上unsubscribe。

5. message ack

amqp定义了两种ack模式,自动ack和显式ack。

自动ack指的是当message被从queue中消费后,自动从queue中删除。(发生在basic.deliver或basic.get_ok后)

显式ack指的是,只有当application发送ack消息后,消息才会从queue中删除。(发生在basic.ack后)

6. rejecting message

当consumer处理一个message失败后,它能够经过丢弃或重入queue的方式来reject这个message。

7.nack

8.prefetching messages

amqp能够设定在下个ack到来以前,一次性索取多条message,如此能够优化系统的throughput。

9.message‘s attribute and payload

9.1 message attribute

在amqp中,message能够有不少属性,例如:

content type

content encodeing

routing key

delivery mode(persistent or not)

message priority

message publishing timestamp

expiration period:超时时间

publisher application id

message的属性能够被broker使用,也能够被consumer使用。

当message以persistent方式发布时,broker将会把它们持久化到磁盘中。当系统重启的时候,broker保证已收到的persistent类型的数据不丢失。将数据的persistent标志设为true会致使必定的性能降低(由于须要作持久化动做)。

9.2 message payload

payload是message携带的内容,它能够为空。payload以byte数组的方式被传递。broker不会查看和检查payload的内容。

可使用场景的编码协议来构造payload中的内容,例如json、thrift、protobuf等。

amqp的生产者和消费者一般使用content type和content encoding属性来判断payload中消息内容的编码方式。

10.connection

amqp使用长连接,而且支持tls。

当一个应用再也不与amqp连接时,应该显示释放 amqp的connection,而不是直接断开它底层的tcp连接。

11.channels

有一些程序须要与多个queue相连,此时,不须要创建多个长连接。

amqp使用channel来实现connection长连接的复用。对于使用多线程的应用而言,应每一个线程一个channel,而不是多个线程共享同一个channel。

12. virtual host

amqp还定义了virtual host概念,用来将user、exchange、queue划分到不一样的namespace中。

应用程序在与amqp创建连接时,能够指定本身的命名空间。

相关文章
相关标签/搜索