rabbitmq学习记录
同步和异步
(1)同步(按照流程一步一步做)使用openfengin传统的交互
- 响应时间长,需要将每一步的时间加起来。
- 如果一个环境出错了,整个就报错了。
- 并发压力大,前边的步骤有多大的并发量,后续就需要承担多大的并发量。
(2)异步(微服务A无需等待微服务B,之间返回,微服务B可以等他空闲的时候来消费)
- 响应时间相对更短,无需等待服务B执行完成就返回响应。
- 可以通过调节参数,减少后续服务的并发量。
削峰填谷:把高峰期的任务转移到低谷期执行。
qps:kafka>rocketmq>rabbitmq>activemq
rabbitmq有可靠的消息确认机制,并且吞吐量还行10w左右。
基础
消息发送端:生产者 消息消费端:消费者
TCP连接(三握四挥)
为了连接复用,建立了channel。
broker示例:搭建一个rabbitmq就叫一个broker,broker分成很多个虚拟机,
1.流程
生产者---------》channel---------》exchange:交换机(中转消息)--------》queue:队列(暂存消息)---------》channel-----------》消费者
2.交换机怎么知道把消息存放在那个队列中?
交换机通过binding队列
5672客户端交互 15672图形化界面交互
3.rabbitmq的使用模式
默认的交换机:
(1)简单工作队列模式:生产者–(队列)----消费者
(2)工作队列:生产者—默认交换机----(队列)----多个消费者(轮询竞争)
(3)发布订阅模式:生产者----fanout类型交换机-----多个队列-----指定消费者监听
fanout交换机,广播,将消息发布到多个队列。多个消费端对于队列的关系是竞争关系。路由键是空。
交换机类型:fanout广播、diret定向、topic通配符
(4)路由模式:生产者----direct交换机-----使用多个不同的ronuting key绑定队列-----多个消费者
交换消息的时候,指定交换机、路由键。channel和队列绑定,指定路由键。
(5)主题模式:生产者----topic交换机-----使用多个不同的ronuting key绑定队列-----多个消费者
在路由模式的基础上,使用通配符匹配。
使用
可靠性
故障:消息没有存放在消息队列,保存在队列(内存)服务器宕机丢失,消息没有消费成功。
1.消息没有发送到消息队列
解决
在生产者端进行确认,如果失败就重试。
(1)生产者端交换机和队列的确认机制:配置文件开启确认机制+配置类对mq模板增强。
(2)备份交换机制:目标交换器故障,备份交换机可以执行目标交换机的业务,或者做日志通知运维人员故障。在创建交换器的时候,可视化界面可以指定备份交换机(需要使用fanout类型)。
2.消息队列服务器宕机,内存数据丢失。
将消息持久化,默认是持久化的
3.消费端宕机或者消息没有消费成功
消费成功,消费端给mq返回ACK信息,消息队列删除该消息。
消费失败,消费端给mq返回NACK信息,重试(消费端的接口支持幂等性)。
配置手动确认返回ack通知。
削峰填谷
yml配置prefetch参数(每次取出的消息数量)
死信
消费者拒收消息+requeue=false(不把消息放到原目标队列)
消息队列溢出:消息放满了还放
消息超时(rabbitmq服务器会自动删除过期的消息,可以在创建队列时指定该队列存放消息的过期时间,也可以对消息指定过期时间。)
解决:
丢弃、入库、监听进入死信队列:消费者监听死信队列,做日志报警、人工干预。
延迟队列
消息超时时间+死信队列:某一个消息队列不监听,设置一个超时时间。超时之后进入死信队列,被消费者捕获到。
事务消息
当生产者代码出现错误的时候发送消息就会回滚,注解@RollBack(ture)。默认开启回滚事务。