• 面试Java高级工程师之RocketMQ总结


    一、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面试

    RocketMQ常见面试题_ayu_programer的博客-CSDN博客_rocketmq面试

    RocketMQ在面试中那些常见问题及答案+汇总-阿里云开发者社区

  • 相关阅读:
    Android 10.0 SystemUI锁屏界面去掉多用户和只能拨打紧急电话提示功能
    小满Vue3第三十六章(Vue如何开发移动端)
    从几次事故引起的对项目质量保障的思考
    多表查询和连接查询
    openharmony容器组件之Refresh
    Java策略模式在我司应用
    重新认识交叉编译
    【电路笔记】-基尔霍夫电路定律
    java random随机数的用法
    【网络安全】Web安全渗透三大核心方向
  • 原文地址:https://blog.csdn.net/biao_java/article/details/126236174