目录
RabbitMQ
1、MQ
1.1、什么是MQ
“message queue”
1.2、为什么使用它?或者说使用它有什么好处?
流量削峰:用户下单-MQ-处理订单
应用解耦:订单系统完成,支付系统、库存系统、物流系统都要完成
异步处理:B任务完成后需要通知A,采用异步方式
1.3、MQ分类
- ActiveMQ:吞吐量万级、毫秒级;维护较少
- Kafka:适用大数据开发,吞吐量百万级、分布式,日志领域成熟;队列越多load越高,发送消息响应时间长,社区更新慢(大数据)
- RocketMQ:阿里旗下java实现,吞吐量十万级、分布式、消息0丢失;支持的语言不多(金融)
- RabbitMQ:当前主流,吞吐量万级,支持多语言,社区活跃高
2、RabbitMQ
2.1、概念
接收和转发:相当于一个“快递驿站”
2.2、四大核心
生产者
交换机:接收来自生产者的消息并推送至队列
队列:接收数据的一直数据结构,仅受主机内存和磁盘限制的约束、
消费者
2.3、RabbitMQ核心部分
Hello World
一个生产者–一个队列–一个消费者
2.4、Work queues
一个生产者–一个队列–多个消费者
方式:
- 轮询分发(公平方式:因为公平所以不公平)
- 给信道设置预取值:信道消息数量达到预取值后,信道便不在接收队列中的消息
消息应答机制:就是在“消费者”接收消息时,突然因为消费者线程发生异常而失败导致信息没有完全接收,那么就有可能造成信息丢失,因此消息应答机制就是为了保证信息不丢失,原理:只能当消费者完全接收完消息,应答机制才会通知rabbitmq我已经接收完了,此时rabbitmq就可以把消息删除。
- 自动应答
- 手动应答(对应信道里面的消息而言)
- 单个应答
- 批量应答
持久化:
- 队列持久化:durable(创建队列)
- 消息持久化:MessageProperties.PERSISTENT_TEXT_PLAIN(发布消息)
引出发布确认:即时队列和消息被持久化,但是在持久化的过程中还存在缓存的一个间隔点,在这个间隔点可能会出错。
2.5、Publish/Subscribe(发布确认)
发布订阅模式:将信道设置“发布订阅”模式,一旦消息到达指定队列后,broker会发送一个确认给发送者(如果消息和队列被持久化,那么确认消息写入磁盘后发出)
方式:
- 单个确认发布
- 批量确认发布
- 异步确认发布:给信道设置监听器,对确认的消息进行清除
Routing(交换机)
生产者–交换机–队列–消费者
- direct:直接
- topic:主题
- headers:标题
- fanout:扇出
- 默认交换机:空字符串表示
绑定(交换机和队列之间):队列只对它绑定的交换机的消息感兴趣
2.6、死信队列
死信队列的消息来源
- 消息TTL过期(Time To Live,生存时间)
- 队列满了,无法进行消息的存储
- 消息被拒绝
2.7、延迟队列
死信队列+TTL
TTL:队列中的消息如果在TTL范围之内没有被“消费”,会进入死信队列
- 消息设置TTL
- 队列设置TTL
优化:灵活设置TTL
基于插件实现延迟队列
- 自定义交换机类型,底层是将信息存储在mnesia表(分布式数据系统)中,当达到投递时间时,才投递到目标队列中。
2.8、发布确认高级
在生产者发送消息到消费者接收消息过程中,会存在两个明显的错误:交换机名称错误(不存在)、不可路由;如果发送以上两种错误,生产者并不知道消息发送失败,因此需要定义两个情况的回调接口。
备份交换机:如果想要处理上述的错误,仅仅知道错误信息是不行的,要想办法解决这种错误:备份交换机。