我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Kafka的生产者优秀架构设计的示例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Kafka的生产者优秀架构设计的示例分析

本篇文章给大家分享的是有关Kafka的生产者优秀架构设计的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

Kafka 是一个高吞吐量的分布式的发布订阅消息系统,在全世界都很流行,在大数据项目里面使用尤其频繁。笔者看过多个大数据开源产品的源码,感觉 Kafka 的源码是其中质量比较上乘的一个,这得益于作者高超的编码水平和高超的架构设计能力。

Kafka 的核心源码分为两部分:客户端源码和服务端源码,客户端又分为生产者和消费者,而个人认为 Kafka 的源码里面生产者的源码技术含量最高,所以今天给大家剖析 Kafka 的生产者的架构设计,Kafka 是一个飞速发展的消息系统,其架构也在一直演进中,我们今天分析的 Kafka 的版本是比较成熟稳定的 Kafka1.0.0 版本源码。

Kafka的生产者优秀架构设计的示例分析

图1 Kafka核心模块

生产者流程概述 

先给大家介绍一下生产者的大概的运行的流程。Kafka的生产者优秀架构设计的示例分析

图2 Kafka运行方式

如上图所示:步骤一:一条消息过来首先会被封装成为一个 ProducerRecord 对象。

步骤二:接下来要对这个对象进行序列化,因为 Kafka 的消息需要从客户端传到服务端,涉及到网络传输,所以需要实现序列。Kafka 提供了默认的序列化机制,也支持自定义序列化(这种设计也值得我们积累,提高项目的扩展性)。

步骤三:消息序列化完了以后,对消息要进行分区,分区的时候需要获取集群的元数据。分区的这个过程很关键,因为这个时候就决定了,我们的这条消息会被发送到 Kafka 服务端到哪个主题的哪个分区了。

步骤四:分好区的消息不是直接被发送到服务端,而是放入了生产者的一个缓存里面。在这个缓存里面,多条消息会被封装成为一个批次(batch),默认一个批次的大小是 16K。

步骤五:Sender 线程启动以后会从缓存里面去获取可以发送的批次。

步骤六:Sender 线程把一个一个批次发送到服务端。大家要注意这个设计,在 Kafka0.8 版本以前,Kafka 生产者的设计是来一条数据,就往服务端发送一条数据,频繁的发生网络请求,结果性能很差。后面的版本再次架构演进的时候把这儿改成了批处理的方式,性能指数级的提升,这个设计值得我们积累。 

生产者细节深度剖析 

接下来我们生产者这儿技术含量比较高的一个地方,前面概述那儿我们看到,一个消息被分区以后,消息就会被放到一个缓存里面,我们看一下里面具体的细节。默认缓存块的大小是 32M,这个缓存块里面有一个重要的数据结构:batches,这个数据结构是 key-value 的结果,key 就是消息主题的分区,value 是一个队列,里面存的是发送到对应分区的批次,Sender 线程就是把这些批次发送到服务端。

Kafka的生产者优秀架构设计的示例分析

图3 生产者架构

01 /  生产者高级设计之自定义数据结构

生产者把批次信息用 batches 这个对象进行存储。如果是大家,大家会考虑用什么数据结构去存储批次信息?

Kafka 这儿采取的方式是自定义了一个数据结构:CopyOnWriteMap。熟悉 Java 的同学都知道,JUC 下面是有一个 CopyOnWriteArrayList 的数据结构的,但是没有 CopyOnWriteMap,我这儿给大家解释一下 Kafka 为什么要设计这样的一个数据结构。

他们存储的信息的是 key-value 的结构,key 是分区,value 是要存到这个分区的对应批次(批次可能有多个,所以用的是队列),故因为是 key-value 的数据结构,所以锁定用 Map 数据结构。

这个 Kafka 生产者面临的是一个高并发的场景,大量的消息会涌入这个这个数据结构,所以这个数据结构需要保证线程安全,这样我们就不能使用 HashMap 这样的数据结构了。

这个数据结构需要支持的是读多写少的场景。读多是因为每条消息过来都会根据 key 读取 value 的信息,假如有 1000 万条消息,那么就会读取 batches 对象 1000 万次。写少是因为,比如我们生产者发送数据需要往一个主题里面去发送数据,假设这个主题有 50 个分区,那么这个 batches 里面就需要写 50 个 key-value 数据就可以了(大家要搞清楚我们虽然要写 1000 万条数据,但是这 1000 万条是写入 queue 队列的 batch 里的,并不是直接写入 batches,所以就我们刚刚说的这个场景,batches 里只需要最多写 50 条数据就可以了)。

根据第二和第三个场景我们总结出来,Kafka 这儿需要一个能保证线程安全的,支持读多写少的 Map 数据结构。但是 Java 里面并没有提供出来的这样的一个数据,唯一跟这个需求比较接近的是 CopyOnWriteArrayList,但是偏偏它又不是 Map 结构,所以 Kafka 这儿模仿 CopyOnWriteArrayList 设计了 CopyOnWriteMap。采用了读写分离的思想解决了线程安全且支持读多写少等问题。

高效的数据结构保证了生产者的性能。(CopyOnWriteArrayList 不熟悉的同学,可以尝试百度学习)。这儿笔者建议大家可以去看看 Kafka 生产者往 batches 里插入数据的源码,生产者为了保证插入数据的高性能,采用了多线程,又为了线程安全,使用了分段加锁等多种手段,源码非常精彩。

02 /  生产者高级设计之内存池设计

刚刚我们看到 batches 里面存储的是批次,批次默认的大小是 16K,整个缓存的大小是 32M,生产者每封装一个批次都需要去申请内存,正常情况下如果一个批次发送出去了以后,那么这 16K 的内存就等着 GC 来回收了。但是如果是这样的话,就可能会频繁的引发 FullGC,故而影响生产者的性能,所以在缓存里面设计了一个内存池(类似于我们平时用的数据库的连接池),一个 16K 的内存用完了以后,把数据清空,放入到内存池里,下个批次用的时候直接从里面获取就可以。这样大大的减少了 GC 的频率,保证了生产者的稳定和高效(Java 的 GC 问题是一个头疼的问题,所以这种设计也非常值得我们去积累)。

以上就是Kafka的生产者优秀架构设计的示例分析,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Kafka的生产者优秀架构设计的示例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Kafka的生产者优秀架构设计的示例分析

本篇文章给大家分享的是有关Kafka的生产者优秀架构设计的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Kafka 是一个高吞吐量的分布式的发布订阅消息系统,在全世界都
2023-06-05

Hive架构设计及原理的示例分析

这篇文章给大家分享的是有关Hive架构设计及原理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Hive架构设计及原理1.什么是Hive:Hive是构建在Hadoop之上的数据仓库平台,可以结构化的数据文
2023-06-03

Java实现生产者消费者问题与读者写者问题的示例分析

这篇文章将为大家详细讲解有关Java实现生产者消费者问题与读者写者问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、生产者消费者问题生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它
2023-05-30

C语言结构化程序设计的示例分析

这篇文章主要为大家展示了“C语言结构化程序设计的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言结构化程序设计的示例分析”这篇文章吧。C语言是结构化的程序设计语言!结构有三大类:顺序
2023-06-20

Java设计者模式简单工厂模式的示例分析

这篇文章主要介绍Java设计者模式简单工厂模式的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!简介简单工厂模式 (Simple Factory) 又叫静态工厂方法(Static Factory Method)
2023-05-30

java中学生信息管理系统MVC架构的示例分析

这篇文章给大家分享的是有关java中学生信息管理系统MVC架构的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、项目结构 学生信息管理系统分三层进行实现。student.java主要提供数
2023-05-30

Java多线程中不同条件下编写生产消费者模型的示例分析

这篇文章主要为大家展示了“Java多线程中不同条件下编写生产消费者模型的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java多线程中不同条件下编写生产消费者模型的示例分析”这篇文章吧。
2023-05-30

Linux五大模块内核源码以及内核整体架构设计的示例分析

小编给大家分享一下Linux五大模块内核源码以及内核整体架构设计的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、前言本文是“Linux内核源码分析”系
2023-06-29

软考系统架构设计师考试中的案例分析题如何准备和解答

软考系统架构设计师考试中的案例分析题是考察考生实际应用能力和综合分析能力的重要环节。案例分析题通常要求考生根据给定的情景描述,分析问题、提出解决方案,并展示出系统架构设计的相关技能。具体请见下文。
软考系统架构设计师考试中的案例分析题如何准备和解答
2024-09-11

软考系统架构设计师考试中的案例分析题怎么应对?有哪些解题技巧?

在软考系统架构设计师考试中,案例分析题是检验考生实际运用能力的重要题型。这类题目通常以实际场景为背景,要求考生结合所学知识进行分析和解决问题。有哪些解题技巧呢?具体请见下文。
软考系统架构设计师考试中的案例分析题怎么应对?有哪些解题技巧?
2024-09-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录