RabbitMQ,Kafka八股(自用笔记)
RabbitMQ
异步发送(验证码,短信,邮件)
MYSQL和redis,ES之间的数据同步
分布式事务
削峰填谷
生产者确认机制
publisher confirm
回调方法即时发送
记录日志
保存数据库,发送成功后删除
消息持久化
交换机持久化:第二个参数
队列持久化:durable创建持久化
消息持久化:DeliverMode指定
消费者确认
SpringAMQP 高级消息队列协议
手动ack 调用api
自动ack(常用)
none:关闭ack 投递立即删除
消息重复消费
网络抖动
消费者挂了
1.每条消息设置唯一id
2.幂等:分布式锁,数据库锁(悲观锁,乐观锁)
死信交换机
延迟队列=死信交换机+TTL(消息会被延迟消费)
超时订单,限时优惠,定时发布
1.消费者使用basic.reject或basic.nack并且requeue为false
2.过期消息,超时无人消费
3.投递的消息队列满了,最早投递的成为死信
队列绑定死信交换机
TTL
消息存活时间和队列存活时间取最小值
延迟队列插件
声明交换机:设置delayed属性
消息堆积怎么解决
1.增加消费者
2.消费者开启线程池加快消息处理速度
3.扩大队列容积,提高堆积上限
惰性队列
队列声明时开启lazy
接受消息存入磁盘
消费时从磁盘读入内存
支持百万存储
高可用(集群)
普通集群(标准集群)
集群各个节点共享数据(交换机,队列元信息,不包含消息信息)
队列所在节点传递到当前节点返回
队列所在节点宕机,消息丢失
镜像集群(主从模式)
交换机、队列、消息会在镜像节点同步备份
创建队列的节点主节点,备份节点镜像节点
一个队列的主节点可能是另一个队列的镜像节点
主宕机,镜像成为新的主
仲裁集群(主从模式)
功能同镜像集群
主从同步基于Raft,强一致(.quorum)
Kafka
数据不丢失
1.生产者到Brocker
设置异步发送(传入一个回调函数,处理回调的结果)
消息重试(设置重试次数)
2.Brocker消息存储
发送确认机制acks
acks = 0 速度最快,不等待服务器响应
acks = 1(默认)集群首领节点响应
acks = all 所有赋值节点全部接收到,统一响应一个成功
3.消费者接收
分区机制:一个主题多个分区
分区消息只能由消费者组中唯一一个消费者处理,
不同分区分给不同消费者(但是同一个消费者组)
重平衡:消费者个数变化,分区个数变化触发
消费者默认提交自动按期提交消费偏移量(5s提交一次)
重平衡可能会重复消费或丢失数据
同步+异步提交:
Finally里使用同步提交是为了保证最后一次消费记录不会丢失
只发生在关闭消费者的时候,其他时候都是异步提交
消费的顺序性
同一个分区消息由消费者组中唯一消费者消费,
保证Topic的一个分区顺序处理,不保证跨分区
发送消息时指定分区号
相同业务相同key(分区默认通过key的hashcode选择分区)
高可用机制(集群,分区备份机制)
分区备份机制:
一个topic多个分区,每个分区有多个副本
其中一个leader,其余follower(副本),副本存储到不同的broker
leader故障,follower升级leader
leader
同步复制保存的follower为ISR
异步复制保存的follower为普通follower
选举原则:
优先从ISR选leader,没有则从普通follower
文件存储机制
.index 索引文件
.log 数据文件
.timeindex 时间索引文件
分段
便于删除无用文件
查找数据方便
数据清理机制
超过保存时间清理(自动触发)
日志文件(.log文件)超过一定阈值,删除最久消息(手动开启)
实现高性能
消息分区(多台服务器)
顺序读写(磁盘顺序读写)
页缓存(对内存访问)
零拷贝(上下文切换(用户内核),减少数据拷贝)
消息压缩(磁盘io,网络io)
分批发送(打包批量发送)
页缓存
磁盘->页缓存->网卡->消费者
省去了页缓存到kafka,kafka到socket缓冲区,缓冲区复制到网卡