AMQP 是应用层协议的一个开放标准,为面向消息的中间件设计。 基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。 目标是实现一种在全行业广泛使用的标准消息中间件技术,以便降低企业和系统集成的开销,并且向大众提供工业级的集成服务。 主要实现有 RabbitMQ。
常见问题
Rabbitmq的四个部分->生产者、交换器、队列、消费者
生产者:消息的创建者,发送到rabbitmq
交换器:用于消息的分发
队列:用于存放消息的队列
消费者:连接到rabbitmq,订阅到队列上,消费消息,持续订阅(basicConsumer)和单条订阅(basicGet)
生产者
事务模式
事务的实现主要是对信道(Channel)的设置,主要的方法有三个:
1.channel.txSelect()声明启动事务模式;
2.channel.txComment()提交事务;
3.channel.txRollback()回滚事务;
但是事务在rabbitmq中效率很低,所以不建议使用,可以用失败确认和发送方确认模式代替。
确认模式
原理:生产者将信道设置成confirm模式,一旦信道进入confirm模式,所有在该信道上面发布的消息都将会被指派一个唯一的ID(从1开始),由这个id在生产者和RabbitMQ之间进行消息的确认。
Confirm的三种实现方式:
方式一:channel.waitForConfirms()普通发送方确认模式;消息到达交换器,就会返回true。
方式二:channel.waitForConfirmsOrDie()批量确认模式;使用同步方式等所有的消息发送之后才会执行后面代码,只要有一个消息未到达交换器就会抛出IOException异常。
方式三:channel.addConfirmListener()异步监听发送方确认模式;
交换器
交换器的四种类型:direct,fanout,topic,headers,其种headers(几乎和direct一样)不实用,可以忽略。
- fanout 发送到所有绑定的队列
- direct Routing Key 和 Binding Key 完全一致
- topic Routing Key 用.间隔分开 Routing Key com.rabbitmq.client
- Bind Key可以存在模糊匹配 * 一个 #多个 com.# 或 com.*.*
交换器路由不到消息,那么消息会被丢弃
队列
普通队列
用于正常存储消息的队列
死信队列
消息变成死信一般是以下几种情况:
1.消息被拒绝,并且设置 requeue 参数为 false 2.消息过期(单个或队列设置过期时间) 3.队列达到最大长度(默认无限长度)
延迟队列
Rabbitmq没有延迟队列的功能,通过使用普通队列对消息设置过期时间,再路由到死信队列中消费从而实现死信队列
消费者
每个消息只会发送给一个消费者
拉取Get:属于一种轮询模型,发送一次get请求,获得一个消息。
推送Consume:属于一种推送模型。注册一个消费者后,RabbitMQ会在消息可用时,自动将消息进行推送给消费者。
自动确认: 消费者在声明时,可以指定autoAck参数,当autoAck=true时,一旦消费者接收到了消息,就视为自动确认了消息。
手动确认:当autoAck=false时,RabbitMQ会等待消费者显式发回ack信号后才从内存(和磁盘,如果是持久化消息的话)中移去消息。
拒绝消息
当消费消息的时候不是我们想要处理的情况下,可以当前消息的消费
Reject一次只能拒绝一条消息。
Nack则可以一次性拒绝多个消息
消费幂等性
一个数据,重复来多次,得确保对应的数据是不会改变的,不能出错
1.全局唯一id
2.数据库唯一索引
消息持久化
生产者 delivery rnode 设置为 表示消息需要持久 处理。
交换者 durable=true
队列 durable=true
消费者 ack=false
rabbitmq的管理
终端:rabbitmqctl
web管理页面
参考来源:
《Rabbitmq实战指南》