一、rocketmq是什么?为什么要用?
1、消息中间件,具有高性能、低延迟和高可靠特性
2、主要用来系统解耦、流量削锋、异步处理以提升系统性能
二、使用rocketmq有哪些缺点?
1、系统可用性降低
2、系统复杂度提高
3、事务一致性问题
三、rocketmq和kafka有什么区别?
1、单机吞吐量:两个都是10万级别,高吞吐量
2、topic数量看吞吐量:rocketmq达到几百几千吞吐量会有较小幅度下降,kafka几十到几百会大幅下降
2、时效性:rocketmq毫秒级别,kafka毫秒以内
3、可靠性:都可以做到消息零丢失
4、可用性:都是高可用,分布式架构
四、rocketmq部署架构是怎么样的?
分为四大块:nameserver集群、producer集群、consumer集群、broker集群
NameServer是一个路由的角色,生产消费者会通过nameserver查找topic相应的borker ip列表进行发送消费消息
broker是一个消息中转角色,负责存储消息,转发消息。定期向nameserver发送心跳包,轮询注册元数据(borker的ip端口、broder集群、topic地址等信息)
producer负责生产消息,将消息发送到broker服务器。可以是同步、异步、顺序、单向发送。同步和异步需要broker返回确认
consumer负责消费消息,从broker服务器拉取消息。可以是拉取式消费和推动式消费
五、rocketmq有哪几种部署模式?优缺点是什么?
1、单master
只有一个broker,如果broker挂了就会导致mq不可用
2、多master
集群模式,如果其中一个master挂了不影响mq继续提供服务,性能也最高,但如果master挂了必须要等恢复后才能继续消费消息
3、多master多slave 异步复制
集群模式,主要是弥补了多master集群下没有slave,master挂了不能继续订阅的问题,优点是低延迟高吞吐,缺点就是Master宕机,磁盘损坏的情况会导致消息丢失
4、多master多slave 同步双写
集群模式,和多master多slave模式你一样,唯一不同的是只有master和slave都写成功后,才向客户端返回成功,优点当master宕机后消息无延迟,服务高可用和数据可用性非常高,缺点就是降低消息写入效率,影响系统吞吐量
六、rocketmq的工作流程是怎样的?
1、启动namesever
2、启动broker
3、创建topic
4、producer发送消息
5、consumer消费消息
七、RocketMq有哪些方式消费消息?
1、rocketmq提供两种方式,pull和push
2、push本质还是使用pull方式实现,通过consumer轮询从broker拉取消息,只不过在push方式里,consumer把轮询过程封装了一层,并注册了messageListener监听器。当轮询获取消息后就会通知messageListener的consumerMessage()来消费。
八、RocketMq如何实现负载均衡?
1、producer生产者端负载均衡是默认轮询向topic的所有queue发送消息,来达到消息平均落到不同队列上
2、consumer消费者负载均衡则是假设5个队列,2个消费者,则第一个消费者消费3个队列,第二个则消费2个队列,以达到平均消费的效果。但要注意的是,当consumer数量大于队列的数量时,多余的consumer不会去消费队列,会浪费资源,建议配置等于小于队列的consumer消费者,避免浪费
九、RocketMq的存储机制是怎么实现的?
采用文件的方式存储,在写消息和发送消息使用顺序写和零拷贝模式,保证了rocketmq高性能
顺序写:直接追加数据到末尾
零拷贝:读取文件,再用socket发送出去
十、RocketMq的存储结构是怎样的?
1、使用commitlog来存储消息,并分别提供了consumerQueue和indexFile两个索引,来快速检索消息
十一、RocketMq如何进行消息去重?
1、消费端业务处理保持幂等性
2、建立日志表,使用消息主键作为表主键,处理消息前先insert
十二、怎么解决消息丢失问题?
1、生产者采用事务消息机制
发生half消息到mq
mq回复half消息
执行本地事务下单
通知mq本地事务状态
mq未确定事务状态进行回查
检查本地事务状态
返回mq本地事务检查状态
2、Broker配置同步刷盘+Dledger主从架构
配置mq队列flushDiskType同步刷盘
Dledger文件同步,通过二阶段提交来保证主从同步,Leader收到数据后标记为uncommit,在发送数据到Follower,Follower收到数据后回复ack,当大部分Follower回复ack后Leader会标记为commit,最后发送标记commit到Follower完成两阶段数据同步
3、消费者不要使用异步消费
4、整个mq挂了使用降级方案
临时写入redis或文件
开启定时任务扫描redis
尝试推送数据到mq,直到mq恢复正常
十三、怎么保证MQ消息顺序消费?
1、mq分为局部有序和全局有序
2、发送者发送消息时会通过messageQueue轮询方式尽量均匀的发送到不同消息队列
3、局部有序:通过在发送消息时指定MessageSelector对象,把有序的一组消息发送到同一个队列,利用messageQueue天生的FIFO先进先出来保证顺序消费
4、全局有序:将topic配置成一个messageQueue队列(默认4个)来保证全局有序
十四、怎么快速处理mq积压的消息?
生产消费者配置不平衡、消费者挂了、网络波动等场景出现消息积压情况
1、增加Consumer节点个数
2、创建一个新的Topic,负责消费旧Topic中的消息
3、官网特殊情况,从普通主从架构模式切换到Dledger高可用集群时避免消息丢失需要先消费完消息,因为Dledger集群会接管原mq集群commitlog日志,所以这种场景也需要尽快处理积压消息
十五、怎么配置mq消息轨迹?
broker.conf设置traceTopicEnable=true
参考:
RocketMQ 常见面试问题_柚子茶1990的博客-CSDN博客_rocketmq面试