RabbitMQ
1、概述
什么是MQ
消息队列
流量削峰
应用解耦:上游只需发送消息
异步处理:异步处理回调消息
四大核心概念
生产者、交换机、队列、消费者
六大核心模式
简单、工作队列、发布订阅、路由、主题、发布确认
工作原理
Broker
Virtual host
Connection
Channel
Exchange
Queue
Binding
2、核心
工作队列
轮询分发消息
消息应答:消费者是否处理消息
自动应答、手动应答(批量应答)
消息自动重新入队
rabbitmq持久化:队列持久化、消息持久化
不公平分发
预取值:通道中堆积消息个数
发布确认
单个确认发布
批量确认发布
异步确认发布:异步通知——交换机确认收到、未确认收到
并发链路式队列——发消息和监听线程之间传递消息——本质:map
1、发送消息时进记录队列
2、确认回调再删除
未删除的——未确认消息
跳表
Exchange
直接(direct), 主题(topic) ,标题(headers) , 扇出(fanout)
无名 exchange
临时队列
bindings
Fanout
广播:路由key为空
Direct
发送路由key对应队列——无论队列个数
Topics
没有*和#:fanout、direct模式
*(星号)可以代替一个单词
#(井号)可以替代零个或多个单词
3、高级
死信队列
发送异常消息——进入死信队列
死信队列的来源:
消息 TTL 过期
队列达到最大长度(队列满了,无法再添加数据到 mq 中)
消息被拒绝(basic.reject 或 basic.nack)并且 requeue=false.
延迟队列
延时队列
延迟队列——消息过期进入死信队列
存放需要在指定时间被处理的元素的队列
应用场景
缺陷:ttl不灵活
延时队列优化
QC队列不设置过期时间,由生产者设置ttl
缺陷:队列FIFO
基于插件优化
基于插件的交换机:在交换机处延迟
延迟交换机:类型、延迟类型(直接:路由key固定)
其他延时队列:
Java 的 DelayQueue,利用 Redis 的 zset,利用 Quartz,或者利用 kafka 的时间轮。RabbitMQ安全,完善。
发布确认高级
交换机回调
交换机确认消息是否收到
写回调方法、注入
生产者只管给交换机消息,只接受交换机的接收结果
路由错误无法接收结果
回退消息
无法路由时,消息回退给交换机,通知生产者
备份交换机
无法投递的消息给备份交换机
没有什么是加一层解决不了的
备份优先级更高
幂等性
幂等性:重复提交
消费者ack中断,造成重新消费
解决思路:生成全局唯一id,消费之前判断是否被消费过
1、唯一ID + 指纹码机制(数据库)
2、Redis原子性:利用 redis 执行 setnx 命令,天然具有幂等性。从而实现不重复消费
优先级队列
设置优先级参数
惰性队列
消息存到磁盘中,消费者从磁盘取
内存占比非常小,取消息慢
4、集群
普通集群
镜像集群
高负载均衡
nginx、gateway、Haproxy等集群,进行反向代理
以下暂用不到
Shovel集群
远程同步
Federation 联邦集群
Federation Exchange、Federation Queue