接下来我们再冲一波rocketMQ的经典面试题:
1.多种MQ如何选型?
MQ | 描述 |
---|---|
RabbitMQ | erlang开发,对消息堆积的支持并不好,当大量消息积压的时候,会导致 RabbitMQ 的性能急剧下降。每秒钟可以处理几万到十几万条消息。 |
RocketMQ | java开发,面向互联网集群化功能丰富,对在线业务的响应时延做了很多的优化,大多数情况下可以做到毫秒级的响应,每秒钟大概能处理几十万条消息。 |
Kafka | Scala开发,面向日志功能丰富,性能最高。当你的业务场景中,每秒钟消息数量没有那么多的时候,Kafka 的时延反而会比较高。所以,Kafka 不太适合在线业务场景。(不支持延时消息) |
ActiveMQ | java开发,简单,稳定,性能不如前面三个。小型系统用也ok,但是不推荐。推荐用互联网主流的。 |
2.为什么要使用MQ?
作用 | 描述 |
---|---|
异步 | 系统耦合度降低,没有强依赖关系 |
解耦 | 不需要同步执行的远程调用可以有效提高响应时间 |
削峰 | 请求达到峰值后,后端service还可以保持固定消费速率消费,不会被压垮 |
3.RocketMQ由哪些角色组成,每个角色作用和特点是什么?
角色 | 作用 |
---|---|
NameServer | 无状态,动态列表;这也是和zookeeper的重要区别之一。zookeeper是有状态的 |
Producer | 消息生产者,负责发消息到Broker |
Broker | 就是MQ本身,负责收发消息、持久化消息等 |
Consumer | 消息消费者,负责从Broker上拉取消息进行消费,消费完进行ack(确认) |
4.RocketMQ中的Topic和JMS的queue有什么区别?
queue就是来源于数据结构的FIFO队列。而Topic是个抽象的概念,每个Topic底层对应N个queue,而数据也真实存在queue上的。
5.RocketMQ Broker中的消息被消费后会立即删除吗?
不会,每条消息都会持久化到CommitLog中,每个Consumer连接到Broker后会维持消费进度信息,当有消息消费后只是当前Consumer的消费进度(CommitLog的offset)更新了。
追问:那么消息会堆积吗?什么时候清理过期消息?
4.6版本默认48小时后会删除不再使用的CommitLog文件
- 检查这个文件最后访问时间
- 判断是否大于过期时间
- 指定时间删除,默认凌晨4点