1、什么是AMQP协议?
AMQP的全称是 Advanced Message Queuing Protocol (高级消息队列协议)
他是应用层协议的一个开放的标准,为面向消息中间件而设计,基于此协议的客户端和消息中间件可以进行消息的传递,并不受产品和开发语言的限制
2、rabbitMQ的应用场景系统架构?
3、生产者(producer)
4、消费者(customer)
5、connection
6、队列
basic.consume 订阅 可以自动的从队列中获取消息
basic.get 可以从队列中获取单条的信息(不是持续自动的获取)
消息怎么样才算是被正确的接收?(basic.ack)
通过ack。每个Message都要被acknowledged(确认,ack)。消费者可以通过AMQP的basic.ack命令显示地向RabbitMQ发送一个确认,或者在订阅到队列的时候就将auto_ack设置为true。如果有数据没有被ack,那么, RabbitMQ Server会把这个信息发送到下一个Consumer。如果这个app有bug,忘记了ack,那么RabbitMQ Server不会再发送数据给它,因为Server认为这个Consumer处理能力有限。
reject a message(拒绝消息)
basic.reject命令拒绝接收一个消息
一个消费者如果把reject命令的requeue参数设置为true的话,RabbitMQ会把消息重新发送给下一个订阅的消费者。如果设置成false的话,RabbitMQ会立即把消息移除,而不会把拼写发送给新的消费者。
7、创建队列
通过 queue.declare 命令创建一个 队列
队列中的常用参数:
exclusive
auto_delete
如果尝试声明一个已经存在的队列会发生什么呢?
只要声明参数完全匹配现存队列的话,RabbitMQ就什么都不做,并成功返回,就好像这个队列已经创建成功一样(如果参数不匹配的话,队列声明尝试会失败)。如果你只是想检测队列是否存在,则可以设置queue.decalre的passive选项为true。在该设置下,如果队列存在,那么queue.declare命令会成功返回;如果队列不存在的话,queue.declare不会返回一个创建失败的错误。
8、排他性队列
如果你想创建一个只有自己可见的队列,即不允许其它用户访问,RabbitMQ允许你将一个Queue声明成为排他性的(Exclusive Queue)
该队列的特点是:
(1)只对首次声明它的连接(Connection)可见
(2)会在其连接断开的时候自动删除。
备注:一个连接只能声明一个排他性队列,另一个连接不能声明一个同样的排他性队列。如果在不同的连接中重新声明或者访问同一个排他性队列会得到资源被锁定的错误
9、持久化
queue的持久化
队列的持久化是通过设置队列的 durable=true 实现的
消息的持久化