本系列帖子为鼠鼠复习八股巩固记忆和个人理解所写,如有错误纯属本人实力不佳,欢迎各位大佬阅读指正
1.为什么选择RocketMQ的?
高可靠性,消息不会丢失,RocketMQ支持同步刷盘,主从同步机制,消息写到磁盘,并且主从副本备份,Broker挂掉可以切换从节点,保证消息尽量不丢失,适合订单,支付这类对数据可靠要求高的业务。
性能好支持高吞吐,基于顺序写磁盘,底层是CommitLog顺序存储,写入性能很高,可以支持大促场景海量消息。
功能齐全,贴合业务场景,支持事务消息,解决分布式事务场景,支持延迟消息,支持重试队列,死信队列,消息失败的信息可以重试,多次失败进入死信,方便排查问题。
支持消息堆积,当消费速度跟不上生产速度,消息可以大量堆积在Broker,不会直接崩溃,业务高峰期很有用。
2.RocketMQ和Kafka的区别是什么?如何做技术选型?
核心区别:
定位侧重点不同
RocketMQ面向业务消息,更注重消息可靠性,业务功能。
Kafka最初设计面向日志采集,大数据流处理,追求超高吞吐。
吞吐量
kafka吞吐更高,底层批量,零拷贝优化做的很深,适合每秒几十万上百万条日志。
RocketMQ吞吐也很高,足以满足大多是业务并发,但是极限吞吐弱于kafka。
功能支持
RockeMQ,原生支持延时信息,事务消息,死信队列,消息重试,消息查询,业务功能非常完善。
kafka,延时,事务消息支持很弱,没有死信队列,偏向简单的收发消息。
消息可靠度(两者都可做到高可靠)
Kafka通过多副本保证。
RocketMQ支持同步刷盘,异步刷盘+主从,对金融,订单类业务容错方案更友好。
消息堆积能力
都支持海量堆积,kafka底层分段日志,堆积性能更优。
技术选型怎么做?
选Kafka:
适合日志收集,用户行为埋点,大数据实时计算,流处理场景,追求机制高吞吐,不需要延迟,事务等复杂业务信息。
选RocketMQ:
业务解耦,异步通知,订单超时关闭,分布式事务,支付,电商业务消息,业务场景复杂,需要延时消息,重试,死信队列,优先RocketMQ。
3.RocketMQ延时消息的底层原理?
RocketMQ的延迟消息,并不是定时任务实时扫描,也不是等到指定时间才发送到目标队列。
生产者发送延迟消息,发送消息时候,指定延时级别,不会设置一个精确的时间戳。
消息不会直接投递到业务的Topic,Broker收到延迟信息之后,不会把消息放到我们业务的队列,而是转发到一个内部的延迟队列。
定时后台线程轮询,Broker内部开启一个定时任务,不断扫描这个延迟队列里面的消息,每一条消息会根据延时级别,计算出到期时间。
消费者这时才可以消费这条信息,消息到期转发之后,消费者才能拉取到消息进行消费。