戳蓝字“CSDN云计算”关注我们哦!

技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!

大家都知道 Kafka 是一个非常牛逼的消息队列框架,阿里的 RocketMQ 也是在 Kafka 的基础上进行改进的。对于初学者来说,一开始面对这么一个庞然大物会不知道怎么入手。那么这篇文章就带你先了解一下 Kafka 的技术架构,让你从全局的视野认识 Kafka。了解了 Kafka 的整体架构和消息流程之后,脑海里就会有一个大致的结构,这时候再去学习每个部分就容易得多了。

我们先来看一下 Kafka 的整体架构图:

Kafka 的架构图可以分为四个部分:

  • Producer Cluster:生产者集群。一般由许多个实际的业务项目组成,其不断地往 Kafka 集群中写入数据。

  • Kafka Cluster:Kafka 服务器集群。这里就是 Kafka 作为重要的一部分,这里负责接收生产者写入的数据,并将其持久化到文件里,最终将消息提供给 Consumer Cluster。

  • Zookeeper Cluster:Zookeeper 集群。Zookeeper 负责维护整个 Kafka 集群的 Topic 信息、Kafka Controller 等信息。

  • Consumer Cluster:消费者集群。与 Producer Cluster 一样,其一般是由许多个实际的业务项目组成,不断地从 Kafka Cluster 中读取数据。

了解了 Kafka 的整体架构,那一个消息是怎么从生产者到 Kafka Server,又是如何从 Kafka Server 到消费者的呢?一般来说,一个消息的流转可以分为下面几个阶段:

  • 服务器启动阶段

  • 生产者发送消息阶段

  • Kafka存储消息阶段

  • 消费者拉取消息阶段

服务器启动阶段

首先,我们会启动 Zookeeper 服务器,作为集群管理服务器。接着,启动 Kafka Server。Kafka Server 会向 Zookeeper 服务器注册信息,接着启动线程池监听客户端的连接请求。最后,启动生产者和消费者,连接到 Zookeeper 服务器,从 Zookeeper 服务器获取到对应的 Kafka Server 信息[1]。

生产者发送消息阶段

当需要将消息存入消息队列中时,生产者根据配置的分片算法,选择分到哪一个 partition 中。在发送一条消息时,可以指定这条消息的 key,Producer 根据这个 key 和 Partition 机制来判断应该将这条消息发送到哪个 Parition。

Paritition 机制可以通过指定 Producer 的 paritition.class 这一参数来指定,该 class 必须实现 kafka.producer.Partitioner 接口。如果不实现 Partition 接口,那么会使用默认的分区算法,即根据根据 key 哈希后取余[2]。

随后生产者与该 Partition Leader 建立联系,之后将消息发送至该 partition leader。之后生产者会根据设置的 request.required.acks 参数不同,选择等待或或直接发送下一条消息。

  • request.required.acks = 0 表示 Producer 不等待来自 Leader 的 ACK 确认,直接发送下一条消息。在这种情况下,如果 Leader 分片所在服务器发生宕机,那么这些已经发送的数据会丢失。

  • request.required.acks = 1 表示 Producer 等待来自 Leader 的 ACK 确认,当收到确认后才发送下一条消息。在这种情况下,消息一定会被写入到 Leader 服务器,但并不保证 Follow 节点已经同步完成。所以如果在消息已经被写入 Leader 分片,但是还未同步到 Follower 节点,此时Leader 分片所在服务器宕机了,那么这条消息也就丢失了,无法被消费到。

  • request.required.acks = -1 表示 Producer 等待来自 Leader 和所有 Follower 的 ACK 确认之后,才发送下一条消息。在这种情况下,除非 Leader 节点和所有 Follower 节点都宕机了,否则不会发生消息的丢失。

Kafka存储消息阶段

当 Kafka 接收到消息后,其并不直接将消息写入磁盘,而是先写入内存中。之后根据生产者设置参数的不同,选择是否回复 ack 给生产者。之后有一个线程会定期将内存中的数据刷入磁盘,这里有两个参数控制着这个过程:

  1. # 数据达到多少条就将消息刷到磁盘

  2. #log.flush.interval.messages=10000

  3. # 多久将累积的消息刷到磁盘,任何一个达到指定值就触发写入

  4. #log.flush.interval.ms=1000

如果我们设置 log.flush.interval.messages=1,那么每次来一条消息,就会刷一次磁盘。通过这种方式,就可以达到消息绝对不丢失的目的,这种情况我们称之为同步刷盘。反之,我们称之为异步刷盘。

于此同时,Kafka 服务器也会进行副本的复制,该 Partition 的 Follower 会从 Leader 节点拉取数据进行保存。然后将数据存储到 Partition 的 Follower 节点中。

消费者拉取消息阶段

在消费者启动时,其会连接到 zk 注册节点,之后根据所连接 topic 的 partition 个数和消费者个数,进行 partition 分配。一个 partition 最多只能被一个线程消费,但一个线程可以消费多个 partition。其分配算法如下:

  1. 1. 将目标 topic 下的所有 partirtion 排序,存于PT

  2. 2. 对某 consumer group 下所有 consumer 排序,存于 CG,第 i 个consumer 记为 Ci

  3. 3. N=size(PT)/size(CG),向上取整

  4. 4. 解除 Ci 对原来分配的 partition 的消费权(i从0开始)

  5. 5. 将第i*N到(i+1)*N-1个 partition 分配给 Ci

我们用例子简单描述下这个算法的内容:假设我们连接的 topic 有 8 个 partition,此时有 3 个消费线程。那么 partition 的分配过程大致是这样的:

  • 8/3=2.667,向上取整就是3,也就是说每个consumer分配3个分区。

  • 那么给第一个消费者分配p0/p1/p2三个分区。

  • 给第二个消费者分配p3/p4/p5三个分区。

  • 给第三个消费者分配p6/p7两个分区。

接着消费者连接对应分区的 Kafka Server,并从该分区服务器拉取数据。

总结

这篇文章简单介绍了 Kafka 框架的技术架构以及消息流转过程,并介绍了其中的某些细节。通过这篇文章,相信大家对 Kafka 框架应该有个大致的了解。

参考资料

  • [1].kafka broker启动流程和server结构

  • [2].kafka发送消息分区选择策略详解

福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!

推荐阅读:

  • Elastic Jeff Yoshimura:开源正在开启新一轮的创新 | 人物志

  • 深入浅出Docker 镜像 | 技术头条

  • 19岁当老板, 20岁ICO失败, 21岁将项目挂到了eBay, 为何初创公司如此艰难?

  • 码二代的出路是什么?

  • 机器学习萌新必备的三种优化算法 | 选型指南

  • 小程序的侵权“生死局”

  • @996 程序员,ICU 你真的去不起!

真香,朕在看了!

5分钟带你了解Kafka的技术架构 | 技术头条相关推荐

  1. 10分钟带你彻底搞懂微内核架构

    文章目录 十分钟搞懂系列 什么是微内核架构? 如何实现微内核架构? 总结 十分钟搞懂系列 序号 标题 链接 1 10分钟带你彻底搞懂企业服务总线 https://blog.csdn.net/belon ...

  2. 以太坊技术架构/技术栈

    为什么80%的码农都做不了架构师?>>>    以太坊技术架构/技术栈.从下往上看 一  底层技术 p2p:P2P 网络中的每个节点都可以既是客户端 也是服务端.采用Kademlia ...

  3. 10分钟带你彻底搞懂负载均衡

    文章目录 十分钟搞懂系列 负载均衡是如何保证软件系统的生产部署的? 负载均衡分发策略 请求由谁来分发? 服务器端负载均衡器 客户端负载均衡 请求分发到哪去? 静态负载均衡算法 动态负载均衡算法 十分钟 ...

  4. 10分钟带你彻底搞懂服务限流和服务降级

    文章目录 十分钟搞懂系列 服务限流 计数器法 滑动窗口法 漏桶算法 令牌桶算法 服务降级 十分钟搞懂系列 序号 标题 链接 1 10分钟带你彻底搞懂企业服务总线 https://blog.csdn.n ...

  5. 技术架构之高并发系统设计方法论

    技术架构在业内并没有形成约定的统一认识,不同人的理解也不一样,有的人认为引入了中间件就是技术架构.笔者并不这么认为,如果是这样的话,只是将中间件堆在一起就是技术架构,那技术架构就是千篇一律了.在相似的 ...

  6. 人力资源数据可视化技术架构

    大数据技术的应用正在潜移默化改变着我们的日常生活习惯和工作方式,很多看起来有点"不可思议"的事情也渐渐被我们"习以为常".大数据可能在国内的起步较晚,但我们可能 ...

  7. 业务架构、数据架构、应用架构、技术架构对比

    业务架构 业务架构,阐述的是你的业务是如何开展的,可以从外部视角和内部视角来看业务架构 外部视角:产业链,上下游 上游:各种供应商,原材料.代加工.物流 下游:各个渠道的消费者 内部视角:组织架构.经 ...

  8. 来吧,1分钟带你玩转Kafka

    [摘要] Kafka让人又爱又恨?来吧,一分钟带你玩转它 说起Kafka,许多使用者对它是又爱又恨.Kafka是一种分布式的.基于发布/订阅的消息系统,其极致体验让人欲罢不能,但操心的运维.复杂的安全 ...

  9. java编程石头剪刀布图片_石头、剪刀、布!10分钟带你打开深度学习大门,代码已开源...

    原标题:石头.剪刀.布!10分钟带你打开深度学习大门,代码已开源 沉沉 发自 宇宙中心 量子位 出品 | 公众号 QbitAI 深度学习技术的不断普及,越来越多的语言可以用来进行深度学习项目的开发,即 ...

最新文章

  1. 关于redis的几件小事(一)redis的使用目的与问题
  2. 如何初始化静态地图?
  3. angr学习笔记(6)(内存地址单元符号化)
  4. 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”...
  5. java有画图的库吗_Java画图
  6. BZOJ 4278 [ONTAK2015]Tasowanie (后缀数组)
  7. springboot开启redis共享session设置过期时间
  8. 修改mysql文件位置_如何修改mysql数据文件存储位置
  9. 采访前高级软件工程课程学员付浩同学,及Scrum总结阅读感想
  10. pip 安装GDAL
  11. AVL树,红黑树,B树,B+树,Trie树都分别应用在哪些现实场景中?
  12. vue 下载文件 前后端代码亲测有效
  13. ubuntu18 安装caj阅读器 wine
  14. androidstudio上传自己的lib到Jcenter
  15. IOS:IOS集成开发和环境的介绍
  16. 如何用JS刷新当前页面
  17. carla学习笔记(五)
  18. IT青年们如何突围?要接地气
  19. CentOS 7.0.1503
  20. stripe支付集成

热门文章

  1. python 字典添加元素乱序了_Python有序字典的两个小“惊喜”
  2. 我在网上抢火车票:多加了100元的加速包,却依然买不到票
  3. 科研牛人是如何看文献的?
  4. 图灵,蔡汀,达尔文:计算中的上帝
  5. 虚拟内存分页机制的地址映射
  6. 二叉树学习之二叉查找树
  7. jQuery ajax实现
  8. c# MEF框架(三 导出类的方法和属性)
  9. 全网首发|阿里资深技术专家数仓调优经验分享(上)
  10. 基于海量日志和时序数据的质量建设最佳实践