消息队列高手课
李玥
京东零售技术架构部资深架构师
立即订阅
8426 人已学习
课程目录
已完结 41 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (2讲)
开篇词 | 优秀的程序员,你的技术栈中不能只有“增删改查”
免费
预习 | 怎样更好地学习这门课?
基础篇 (8讲)
01 | 为什么需要消息队列?
02 | 该如何选择消息队列?
03 | 消息模型:主题和队列有什么区别?
04 | 如何利用事务消息实现分布式事务?
05 | 如何确保消息不会丢失?
06 | 如何处理消费过程中的重复消息?
07 | 消息积压了该如何处理?
08 | 答疑解惑(一) : 网关如何接收服务端的秒杀结果?
进阶篇 (21讲)
09 | 学习开源代码该如何入手?
10 | 如何使用异步设计提升系统性能?
11 | 如何实现高性能的异步网络传输?
12 | 序列化与反序列化:如何通过网络传输结构化的数据?
13 | 传输协议:应用程序之间对话的语言
14 | 内存管理:如何避免内存溢出和频繁的垃圾回收?
加餐 | JMQ的Broker是如何异步处理消息的?
15 | Kafka如何实现高性能IO?
16 | 缓存策略:如何使用缓存来减少磁盘IO?
17 | 如何正确使用锁保护共享数据,协调异步线程?
18 | 如何用硬件同步原语(CAS)替代锁?
19 | 数据压缩:时间换空间的游戏
20 | RocketMQ Producer源码分析:消息生产的实现过程
21 | Kafka Consumer源码分析:消息消费的实现过程
22 | Kafka和RocketMQ的消息复制实现的差异点在哪?
23 | RocketMQ客户端如何在集群中找到正确的节点?
24 | Kafka的协调服务ZooKeeper:实现分布式系统的“瑞士军刀”
25 | RocketMQ与Kafka中如何实现事务?
26 | MQTT协议:如何支持海量的在线IoT设备?
27 | Pulsar的存储计算分离设计:全新的消息队列设计思路
28 | 答疑解惑(二):我的100元哪儿去了?
案例篇 (7讲)
29 | 流计算与消息(一):通过Flink理解流计算的原理
30 | 流计算与消息(二):在流计算中使用Kafka链接计算任务
31 | 动手实现一个简单的RPC框架(一):原理和程序的结构
32 | 动手实现一个简单的RPC框架(二):通信与序列化
33 | 动手实现一个简单的RPC框架(三):客户端
34 | 动手实现一个简单的RPC框架(四):服务端
35 | 答疑解惑(三):主流消息队列都是如何存储消息的?
测试篇 (2讲)
期中测试丨10个消息队列热点问题自测
免费
期末测试 | 消息队列100分试卷等你来挑战!
结束语 (1讲)
结束语 | 程序员如何构建知识体系?
消息队列高手课
登录|注册

22 | Kafka和RocketMQ的消息复制实现的差异点在哪?

李玥 2019-09-14
你好,我是李玥。
之前我在《05 | 如何确保消息不会丢失?》那节课中讲过,消息队列在收发两端,主要是依靠业务代码,配合请求确认的机制,来保证消息不会丢失的。而在服务端,一般采用持久化和复制的方式来保证不丢消息。
把消息复制到多个节点上,不仅可以解决丢消息的问题,还可以保证消息服务的高可用。即使某一个节点宕机了,还可以继续使用其他节点来收发消息。所以大部分生产系统,都会把消息队列配置成集群模式,并开启消息复制,来保证系统的高可用和数据可靠性。
这节课我们来讲一下,消息复制需要解决的一些问题,以及 RocketMQ 和 Kafka 都是如何应对这些问题来实现复制的。

消息复制面临什么问题?

我们希望消息队列最好能兼具高性能、高可用并且还能提供数据一致性的保证。虽然很多消息队列产品宣称三个特性全都支持,但你需要知道,这都是有前置条件的。
首先来说性能。任何的复制实现方式,数据的写入性能一定是不如单节点的。这个很好理解,因为无论采用哪种复制实现方式,都需要数据被写入到多个节点之后再返回,性能一定是不如只写入一个节点的。
需要写入的节点数量越多,可用性和数据可靠性就越好,但是写入性能就越低,这是一个天然的矛盾。不过,复制对消费的性能影响不大,不管采用哪种复制方式,消费消息的时候,都只是选择多副本中一个节点去读数据而已,这和单节点消费并没有差别。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《消息队列高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(13)

  • a、
    5副本,10个分区,至少保持isr集合中有三个broker

    bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 5 --partitions 10 --topic test 

    min.insync.replicas=3

    作者回复: 👍👍👍

    2019-09-26
    5
  • 郑勺子
    请问老师~可用于消息中间性能测试的工具有哪些~

    作者回复: 你可以参考一下这个:https://github.com/openmessaging/openmessaging-benchmark/

    2019-09-17
    2
  • 业余草
    没有完美的方案,我相信JMQ也是这样。高性能,高可用本身和一致性就是一个矛盾体。
    2019-09-16
    2
  • WL
    请问一下老师,kafka消息复制中,“Broker只是副本分区的容器,Broker不分主从” 这句话具体怎么理解? 是指一个Broker上可能有Topic1的partition2的从副本和Topic2的partition1的主副本,所以在Broker上不分主从,是这样吗?

    作者回复: 没错,就是这样的。

    2019-10-13
    1
  • 樱花落花
    采用RocketMQ Dledger 5副本复制方式,那就是最多允许宕机两台,因为要求半数以上;broker的设置我觉得一样就行,所以:kafka 配置5台broker,一个主题50个分区,ISR算上leader副本至少是3;
    2019-09-16
    1
  • 饭粒
    请教下老师,kafka 使用时是一个节点对应一个 broker 吗?然后 broker 作为分区副本容器存放不同主题-分区的主/从副本。

    作者回复: 是这样的。

    2019-11-16
  • 成立-Charlie
    老师, 关于Kafka的高可用性我有一点迷惑。因为kafka是使用zookeeper作为其集群服务的协调服务器,Zookeeper采用超过半数可用的原则,3台Zookeeper集群只允许一台宕机。那Kafka却可以实现只有一台存活,仍然可以提供服务,这是如何实现的呢,Kafka可以脱离Zookeeper工作吗。谢谢!

    作者回复: 你这些问题在第24节课中,会有详细的说明。

    2019-11-05
  • 旭东
    如果只记住一句话,那就是“目前并没有一种完美的实现方案能够兼顾高性能、高可用和一致性”。

    世界本无完美,只有追求完美的人

    作者回复: 倒没有上升到这么哲学的高度,但架构设计更多的情况就是在权衡和取舍,找到最适合项目的设计方式。

    2019-10-21
  • WL
    请问一下老师,我看RocketMQ官微上说DLedger只做一件事就是Commitlog,上面用Etcd对Raft协议的实现做对比,说Etcd对于Raft的实现时StateMachine+CommitLog的方式,CommitLog记录日志和操作记录,StateMachine通过操作记录构建出来的系统状态,请问一下在DLedger中的系统状态是怎样判定的?

    作者回复: Dledger中只做Log复制,它没有状态,或者说它的状态就是Log,所以不需要状态机。

    2019-10-13
  • K-Li
    5个broker 10个partition 5复制 isr设置3 ack为-1
    2019-09-23
  • 吟游雪人
    kafka的配置应该是:
    ack=all
    min.insync.replicas=3
    replication.factor=5
    一个topic, 50个分区采用默认轮询的机制

    这样应该能达到题目中的一致性和可用性
    2019-09-20
  • leslie
    发现学习老师的课程其实蛮辛苦的:回答题目要查资料的。Rocket的Dledger是5个需要保证3个可用,kafka的ISR同样的答案。
         我觉得老师在讲解Kafka的ISR过程中露了一张图:kafka领导者的副本机制图,老师如果把图放上了,题目就出不来了-答案全部在这张图上了^_^
        感谢老师过节还努力的分析知识:过个节漏课了:今天补课跟上老师的步伐。期待老师下节课的精彩分享。
    2019-09-15
  • lmtoo
    1.kafka集群配置broker数量为5
    2.创建主题的时候,指定分区数量为50、分区副本数为5
    3.每个分区的ISR数量为3
    2019-09-14
收起评论
13
返回
顶部