一、RocketMQ相关知识
1. 为什么要用消息队列?
答:异步、解耦、削峰。
2. RocketMQ如何解决重复消费消息问题?
答:保证幂等性。
什么是幂等性?
答:多次执行的结果始终一致。也就是说,相同的接口,无论你调1次还是100次,结果都是完全一致的。
3. RocketMQ如何解决顺序消费消息问题?
答:一致性Hash(Hash取模法)。就是让一类请求(同一个订单)落在同一个队列上。单个队列天生支持顺序消费,如下图:
4. RocketMQ如何解决分布式事务问题?
答:事务反查机制。
消息队列中的分布式事务是——本地事务和存储消息到消息队列才是同一个事务。这样也就产生了事务的最终一致性,因为整个过程是异步的,每个系统只要保证它自己那一部分的事务就行了。
5. 什么是回溯消费?
答:重新消费已经消费过的消息。
重新消费一般是按照时间维度,例如由于 Consumer 系统故障,恢复后需要重新消费1小时前的数据。RocketMQ 支持按照时间回溯消费,时间维度精确到毫秒。
6. RocketMQ持久化机制
答:分为单节点和集群两种情况。
单节点 - 持久化方式:同步刷盘和异步刷盘。
如上图所示,在同步刷盘中需要等待一个刷盘成功的 ACK ,同步刷盘对 MQ 消息可靠性来说是一种不错的保障,但是 性能上会有较大影响 ,一般地适用于金融等特定业务场景。
而异步刷盘往往是开启一个线程去异步地执行刷盘操作。消息刷盘采用后台异步线程提交的方式进行, 降低了读写延迟 ,提高了 MQ 的性能和吞吐量,一般适用于如发验证码等对于消息保证要求不太高的业务场景。
一般地,异步刷盘只有在 Broker 意外宕机的时候会丢失部分数据,你可以设置 Broker 的参数 FlushDiskType 来调整你的刷盘策略(ASYNC_FLUSH 或者 SYNC_FLUSH)。
RocketMQ默认采用异步刷盘策略。
集群 - 持久化方式:上面的同步刷盘和异步刷盘是在单个结点层面的,而同步复制和异步复制主要是指的 Borker 主从模式下,主节点返回消息给客户端的时候是否需要同步从节点。
- 同步复制:也叫“主从双写”,指只有将消息写入到主节点和从节点才算写入成功。
- 异步复制:将消息写入到主节点就算写入成功。