1、RabbitMQ篇
1.1、RabbitMQ如何保证消息不丢失?
1、生产者服务宕机了,导致发送不成功
2、交换机发送不到队列
3、MQ宕机了 导致消息丢失
4、消费者宕机了 没消费到消息
解决第一二个问题,生产者发送消息失败
解决第三个问题,MQ宕机
解决第四个问题,消费端有异常
1.2、RabbitMQ重复消费
看完上面的应该知道,消费者有个确认机制
如果说消费者在向队列发确认ack的时候,由于网络抖动或者消费者挂掉了,导致队列没有收到确认,
过了一会儿网络又好了,队列说我没有收到确认ack,我要再重试一次,这样对于消费者来说就要重复处理消息了
1.3、RabbitMQ死信交换机(延迟队列)
1.4、RabbitMQ如果有100万消息堆积在MQ,如何解决(消息堆积怎么解决)
1.5、RabbitMQ的高可用机制有了解过嘛
1.6、RabbitMQ的核心组件与工作原理
交换机有多种
- Fanout Exchange
- Direct Exchange
- Topic Exchange
- Header Exchange
1.7、RabbitMQ怎么保证消息不丢失?
先看一下消息的传递流程:
- 第一步的保证
- 开启Confirm确认模式
- 消息未投递成功,采取补偿措施,存进数据库,让定时任务定时扫去补偿,或是记录日志,或是发送通知让负责人知道
- 开启Confirm确认模式
没有回调成功,confirm中的ack为false
- 第二步的保证
- 开启return返回模式()
- 消息未投递成功,采取补偿措施,存进数据库,让定时任务定时扫去补偿,或是记录日志,或是发送通知让负责人知道
- 开启return返回模式()
当消息不能投递到队列,会回调returnedMessage方法
以上两种需要提前实现的接口:
- 第三步的保证
- 交换机/队列/消息的持久化
- 集群高可用部署
队列持久化设置:
交换机持久化:
消息持久化:
- 第四步的保证
- 手动确认消息
1.8、RabbitMQ怎么保证幂等?
2、Kafka篇
2.1、Kafka怎么保证消息不丢失?
1、针对第一类,生产者发送消息到Broker消失
2、针对第二类,Broker怎么解决消息不丢失的问题?
发生重平衡的原因是:比如consumer2挂掉了,现在consumer2的任务给了consumer1,如下图
而此时,consumer实际消费到了6,但是只提交到了3,因为是每隔5s提交一次,所以consumer1可能会重复消费到456
原因是因为偏移量是每隔5s自动提交的,现在可以改成手动提交偏移量
2.2、kafka怎么保证消息的顺序消费?
2.3、Kafka的高可用机制?
2.4、Kafka的数据清理机制
2.5、Kafka中实现高性能的设计有了解过吗?
为什么顺序读写快?寻址快呗!
零拷贝:
生产者放消息 和 消费者消费消息 在操作系统中的流图
从磁盘文件拷贝到页缓存 第一次拷贝
从页缓存拷贝到kafka 第二次拷贝
从kafka拷贝到Socket缓冲区 第三次拷贝
从Socket缓冲区拷贝到网卡 第四次拷贝
现在kafka知道了哪一个消费者要消费消息,把所有的事情都委托给了操作系统操作,直接从页缓存把数据放进了网卡,这样做,只拷贝两次就行了