博文

目前显示的是标签为“后端”的博文

消息队列重点问题

图片
参考资料: 从 0 开始带你成为消息中间件实战高手 中华石杉互联网 Java 工程师面试突击(第一季) 重点 一定要在自己的核心链路里做文章,有没有可能一个关键的步骤会失败?如果这个关键步骤失败了,这个时候会怎么样?如果某个步骤没有成功,是不是需要启动后台线程定时扫描进行补偿? 所谓的核心链路,不是说查询链路,即并不是一次请求全部是查询。而是说的是数据更新链路,即一次请求过后会对你的各种核心数据进行更新,同时还会调用其他服务或者系统进行数据更新或者查询,这样的一个链路叫做系统的核心链路。针对这样的系统核心数据链路, 你考虑一下有没有哪些环节拖累了性能?你能否通过在系统里打印日志的方式,排查出来核心数据链路中的每个环节的耗时是多长?哪些环节是最耗时的?有没有可能引入MQ技术把一些耗时的步骤做成异步化的方式,来优化核心数据链路的性能?如果可以的话,你应该如何设计这个技术方案?哪些环节同步执行?哪些环节要异步执行? 主动思考能力,随机应变的本事。 如果让你写一个消息队列,该如何进行架构设计?说一下你的思路。 从整体了解把握住一个消息队列的架构原理,给出一些关键点出来。技术的基本原理、核心组成部分、基本架构构成,然后参照一些开源的技术把一个系统设计出来的思路说一下就好。 首先是可伸缩性,负载均衡算法:参考rocketMQ而言就是设计一个逻辑上的topic,之后让物理上的多台broker上的message queue都属于这个topic, broker 扩容怎么办?给topic增加message queue的个数,这样不会导致有的机器分不到queue 其次是网络通信,以及分布式注册中心。心跳机制,通信框架。协议封装。 其次是数据持久化,防止消息丢失,副本机制以及落盘机制,可以不落盘,但是要有副本机制。采用顺序写commitlog,还要建立索引indexfile方便查找。 中间件的可用性,参考rocket的Delger,采用主从节点,raft协议选举一下master节点, 数据的丢失方案,事务消息,同步落盘才可以返回,消费方不会自动提交需要手动提交。以及故障自动转移机制, 附加一些高级功能特性,定时任务对应的延时队列,暂时消费失败返回CONSUME_Later的重试队列,重试一直失败之后加入到的死信队列。 熟悉的一个mq一直问到源码级别非常底层。结合项目来仔细问,详细说说你的业...