Rocket MQ

架构上减法
在kafka中topic中多个分区叫做partition
但在mq中叫做Queue,只是kafka中是完整的消息体,而mq的Q是存一些简要的信息,例如消息偏移offset,而消息的完整数据放在一个叫CommitLog的文件上,通过offset我们可以定位在Commitlog上的某条消息
kafka是直接读取partition。然而MQ是先从Q上读取到Offset然后再跑到commitLog上将完整数据读取出来。

Kafka的底层存储,它的partition分区其实在底层有很多段,也就是segment组成。每个segment可以认为就是小文件。
生产者将消息数据写入进某个分区partition中,也就是写进某个segment文件下。

在磁盘中,顺序写比随机写快很多。虽然每个文件都是顺序写,但是多个文件也就是多个segment存储在磁盘不同的位置,又变成了随机写。
故mq为了缓解同时写多个文件带来的随机写问题,MQ索性将单个broker下的多个topic数据全部写到一个逻辑文件CommitLog上,这就消除了随机写多文件的问题。都是顺序写,就快了!

kafka的主从是同步的,也就是同步segment文件数据。为了避免随机写,MQ是多个topic数据写到逻辑文件CommitLog文件上,直接同步commitLog文件,以broker为单位区分主从。

功能上加法:
消息过滤。
kafka是通过topic进行分类。mq支持给消息打上标记tag,消费者能根据tag过滤所需要的消息。
比如按照topic分类消息有用户数据和订单数据,但如果用户有等级,我要vip6的数据怎么获得呢,kafka就需要过滤,mq就简化很多

事务。
kafka中,生产者发布三个消息,要么全成功,要么全失败。
mq可以将业务逻辑和消息的发布绑定到一块形成事务。
kafk可以自定义分配策略,也可以满足。

延时消息
消息队列的消息不希望立刻被消费到。可以用RocketMQ中的延时队列实现。
kafka就需要程序员自己实现类似的功能就很费劲。

加入死信队列
消费消息是有可能失败的,失败后一般可以设置重试。如果多次重试失败,RocketMQ可以将消息放在一个专门的队列。方便我们以后单独处理。这个专门存放失败消息的队列就叫做死信队列。
rabbitMQ也有死信队列。

消息回溯。
kafka可以调整offset从某个地方开始消费。mq不但支持调整offset,还支持调整时间。

posted @ 2024-08-28 17:41  launch  阅读(23)  评论(0)    收藏  举报