Kafka分区副本与RocketMQ队列的区别
微信公众号「后端进阶」,专注后端技术分享:Java、Golang、WEB框架、分布式中间件、服务治理等等。
最近在学习 Kafka,发现其核心概念与 RocketMQ 还是存在一定的差别,下面我来说下 Kafka 分区 与 RocketMQ
队列之间的区别。
RocketMQ 队列
RocketMQ 每个主题都会有若干个队列,分布于集群中各个 broker 上,分布规律如下:
队列会在 broker 中抽象成一个 consumer queue,在集群模式下,每个队列每个消费组只能存在一个消费者进行订阅消费,但是一个消费者可以消费多个队列,这也保证了在集群模式下消息不会被重复消费,如下图所示:
在RocketMQ开源版本中,在创建主题时,通过集群创建模式,指定主题在集群中的队列数量,比如集群中有 2 个 broker,我们创建主题时选择队列数量为 4,就会在每个 broker 中为该主题创建 4 个 队列,那么该主题在集群中就会有 4 * 2 个队列数量,这里有个不好的地方就是无法精确控制队列数量,但这个问题不大。
RocketMQ 是通过主从模式实现消息的冗余,在生产环境中,也会采取多 Master 多 Slave 模式搭建集群,主从之间的队列数据同步有同步复制和异步复制两种。
因此,RocketMQ 是依靠队列进行消费的,而队列数据通过主从同步实现消息的冗余。
Kafka分区与副本
Kafka 的分区概念是其核心概念之一,分区机制使得 Kafka 具备了水平扩展的能力,在其分区之上,Kafka 还可以设置分区的副本,大大提高了 Kafka 消息的可靠性。
在 Kafka 中,一个主题在集群中会拥有一个以上分区,每个分区在每个消费集群中只能有一个消费者进行订阅消费,,但是一个消费者可以消费多个队列,与 RocketMQ 队列一样:
我们可以通过调整主题的分区数量提高消息的吞吐量,还可以为分区设置副本因子,即该分区在集群中拥有多少个副本(replica),副本分为 leader replica 与 follower replica,它们之间通过 ISR(in-sync replica)与 leader replica 保持数据同步。
在创建主题topic-demo时,可以指定主题在集群中的分区数量,以及副本因子大小:
--partitions 4 --replication-factor 2
以上参数为该主题创建了 4 个分区,副本因子为 2,我现在有个集群,有 3 个 broker:
nodel brokerid=O node2 brokerid=l node3 brokerid=2
根据 Kafka 的默认分配:
node1: topic-demo-0、topic-demo-1 node2: topic-demo-1、topic-demo-2、topic-demo-3 node3: topic-demo-0、topic-demo-2、topic-demo-3
有没有发现,每个分区都分配了一个副本,而且分区的分布尽量均衡,分区副本尽量不在同一个节点上,如果我们设置副本因子为 3,原理一样。
不同于 RocketMQ 队列,Kafka 的分区可以在集群中精确设置多少个,然后随机均衡地分布在集群上,还可以自由定义副本的多少,而 RocketMQ 的 Master-Slave 模式看起来仅有一份副本,当然为了节省存储空间以及提高性能,一般副本因子设置 2 也就够了。
相对比 RocketMQ 的队列与主从同步机制,Kafka 的分区与副本机制显得更加灵活,而且也更加合理。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Zookeeper深度学习(三):源码分析-Leader选举
前两篇文章已经对Zookeeper是什么,能做什么,以及Paxos算法和底层使用的Zab协议做了详细的描述(如果你还不了解Paxos算法和Zab协议建议先到文稿末尾查看前两篇再来学习本篇文章),相信大家一定都有了自己的理解,那么本文就开始真正走进Zookeeper底层源码的学习。俗话说授人以鱼不如授人以渔,今天我们就来分析下Zookeeper非常重要的一个环节--Leader选举。 一、前言 1. 基本概念 SID:服务器ID,用来标示ZooKeeper集群中的机器,每台机器不能重复,和myid的值一致 ZXID:事务ID Vote: 选票,具体的数据结构后面有 Quorum:过半机器数 logicalclock:逻辑时钟(选举轮次),zk服务器Leader选举的轮次 服务器类型: 在zk中,引入了Leader、Follwer和Observer三种角色。zk集群中的所有机器通过一个Leader选举过程来选定一台被称为Leader的机器,Leader服务器为客户端提供读和写服务。Follower和Observer都能够提供读服务,唯一的区别在于,Observer机器不参与Leader...
- 下一篇
Flutter之 State 生命周期
State 的生命周期,指的是在用户参与的情况下,其关联的 Widget 所经历的,从创建到显示,再到更新最后到停止,直至销毁等各个阶段 不同的阶段涉及到特定的任务处理 State 的生命周期流程如下图所示 由图可知:State 的生命周期可以分为三个阶段:创建(插入视图树)、更新(在视图树中存在)、销毁(从视图树中移除) 创建 State 初始化时会依次执行:构造方法 -> initState -> didChangeDependencies -> build,随后完成页面渲染 构造方法:State 生命周期的起点,Flutter 会通过调用 StatefulWidget.createState() 来创建一个 State。可以通过构造方法,来接收父 Widget 传递的初始化 UI 配置数据,而这些配置数据,决定了 Widget 最初的呈现状态 initState:在 State 对象被插入视图树时调用。在 State 的生命周期中只会被调用一次,因此可以在 initState 函数中做一些初始化操作 didChangeDependencies:专门用来处理 St...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7设置SWAP分区,小内存服务器的救世主