本文已参与「新人创作礼」活动,一起开启掘金创作之路。
RocketMQ是根据kafak的架构原型设计出来的,有很多地方都相似
baijiahao.baidu.com/s?id=168502…
1. 消息发送方式****
kafka的高吐量一个重要的原因就是kafka消息的发送方式,采用异步的,缓存批量的发送方式
RocketMQ采用单条的方式,根据路由选择算法选择一个队列,然后将消息发送到服务端,消息会在服务端按照消息的存储格式进行组织,然后进行持久化等操作。RocketMQ不采用消息缓存批量发送,原因是RocketMQ通常使用的Java语言,缓存过多消息会导致频繁GC,影响性能
两者都支持用同步的方式来解决消息可靠性问题
2. 性能方面****
Kafka>RocketMQ
kafka采用异步发送的机制,当发送一条消息时,消息并没有发送到broker而是缓存起来,然后直接向业务返回成功,当缓存的消息达到一定数量时再批量发送。此时减少了网络io,从而提高了消息发送的性能,但是如果消息发送者宕机,会导致消息丢失,业务出错,所以理论上kafka利用此机制提高了io性能却降低了可靠性。
但是当broker里面的topic的partition数量过多时,Kafka的性能会收到影响
RocketMQ不采用消息缓存批量发送,原因是RocketMQ通常使用的Java语言,缓存过多消息会导致频繁GC,然后希望提高可靠性
rocketMq所有的队列都存储在一个文件中,每个队列的存储的消息量也比较小,因此topic的增加对rocketMq的性能的影响较小。
所以Kafka发送更快,吞吐量更高
3. 文件 存储****
kafka 使用日志文件的方式来保存生产者和发送者的消息,分片目录+分段消息文件
kafka一个分片对应磁盘上的一个目录,文件有后缀".index"和".log"、".timeindex",分别表示为segment索引文件、数据文件、时间戳索引文件
kafka 这种分片和分段策略,避免了数据量过大时,数据文件文件无限扩张带来的隐患,更有助于消息文件的维护以及被消费的消息的清理。
t1mek1ller.github.io/2019/11/13/…
baijiahao.baidu.com/s?id=168502…
rocketmq将所有的消息数据(不同topic、不同队列)都写入同一个文件(当然物理存储时还是会以固定大小进行文件切割),这个文件称之为CommitLog。
为每个队列新增ConsumeQueue文件,存储消息在CommitLog中的文件偏移量
存储的文件主要分为:
commitlog: 存储消息实体
consumequeue: 按Topic和队列存储消息的offset
index: index按key、tag、时间等存储
Kafka和RocketMQ都使用了文件系统,并利用了PageCache带来的特性
4. 负载均衡****
Kafka 的负载均衡主要依靠分区 Leader 节点的分布情况
Kafka 内部有机制保证 topic 的某一个分区的 Leader 与 follow 不会存在在同一台机器,并且每一台 broker 会尽量均衡的承担各个分区的 Leader,Leader 节点承担一个分区的读写,follow 节点只负责数据备份。如果发生Leader 宕机,会触发主从节点的切换
RocketMQ 发送端通过策略(随机递增取模)选择队列发来送消息到不同的broker,来达到写入时的负载均衡
RocketMQ 拉取消息时采用的是消息队列(消息消费队列)分配策略算法来进行负载均衡
总的来说:Kafka 通过对分区Leader节点的分布情况实现生产和消费的负载均衡,RocketMQ 通过选取不同的消息队列来实现生产和消费的负载均衡
5. 运维成本****
RocketMQ 的运维成本对 Kafka 更低
(1) 扩容****
由于其粒度的问题,Kafka 的 topic 扩容分区会涉及分区在各个 Broker 的移动,其扩容操作比较重
而 RocketMQ 数据存储是基于 commitlog 文件的,扩容时不会产生数据移动,只会对新的数据产生影响
(2) 部署****
Kafka 需要安装zk,RocketMQ 不需要,节省一个组件的安装与维护
6. 消息 查询 回溯****
Kafka不支持消息查询,也不支持消息回溯
RocketMQ支持根据Message Id查询消息,也支持根据消息内容查询消息,支持根据时间回溯消息,重新消费
7. 事务****
Kafka的事务特性就是要确保跨分区的多个写操作的原子性,即保证多条消息原子性地写入到目标分区,同时也能保证Consumer只能看到事务成功提交的消息。Kafka只提供对Kafka本身的读写操作的事务性,不提供包含外部系统的事务性。 RocketMQ的事务比Kafka更完善,表现在RocketMQ引入half消息,两阶段提交 + 回查。可以和发送端建立完整业务体系
8. 其他原因****
如果考虑国产化,选用RocketMQ
kafka与RocketMQ对比blog.csdn.net/ssllkkyyaa/…