一、队列
1)消费消息
- 通过AMQP的basic.consume命令订阅。
- 通过AMQP的basic.get从队列获取单条消息。
- 队列有多个消费者,则会采取循环(round-robin)的方式发给消费者。
- 消息必须确认:可以是通过AMQP的basic.ack显式确认或者订阅队列时设置auto_ack为true。
- 拒绝消息:可以通过AMQP的basic.reject消息或者消费者从RabbitMQ服务器断开连接。reject的话存在两种情况,requeue设置为true,则发送给下个消费者,false则从队列移除。
2)队列创建
- queue.declare创建队列。
- exclusive:true私有队列。
- auto-delete:最后一个消费者取消订阅,则会自动删除。
- passive:true存在队列,则直接返回,false存在队列则异常。
二、交换器与绑定
交换器可使用exchange.declare创建。
- direct:路由key匹配。
- fanout:发给绑定该交换机的所所有队列。
- topic:模糊匹配,允许不同key的消息进入相同队列。
- headers:匹配AMQP消息的header而非路由key,与direct一致。
三、虚拟主机与隔离
vhost:实现队列、交换器的隔离,并且有独立的权限。
四、消息持久化
1)持久化条件
- 消息投递模式必须为持久(delivery mode 为2)
- 发送到持久化交换器(durable为true)非持久化的话,不会写到日志文件。
- 到达持久化队列(durable为true)非持久话的话,到达队列将从持久化日志移除。
2)AMQP事务
发送方确认模式:设置信道为confirm模式,所有在信道上发布的消息都会被指派一个唯一的ID,一旦消息被投递到匹配的队列后,信道会发送一个发送方确认模式给生产者引用程序,内包含消息ID。如果消息和队列是持久化的,确认消息会在写入磁盘后才发出。确认是异步的。
五、消息的整个过程
发送消息:连接到RabbitMQ—>获取信道—>声明交换器—>创建消息—>发布消息—>关闭信道—>关闭连接
消费消息:连接到RabbitMQ—>获取信道—>声明交换器—>声明队列—>绑定交换器与队列—>消费消息—>关闭信道—>关闭连接