摘要:\" inline=\"0\"\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E\u003Cstrong\u003E【优化一】零拷贝\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E这是Kafka在消费者端的优化,我们通过两张图来比较一下传统方式与零拷贝方式的区别:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003E传统方式:\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F3b4d349aa4824fabbee4b071de058b26\" img_width=\"1080\" img_height=\"705\" alt=\"我挖掘Kafka底层原理。\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cstrong\u003Erequest.required.acks来设置数据的可靠性:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002F9c72665611054b0e819ebf9e03a0fbe8\" img_width=\"924\" img_height=\"318\" alt=\"我挖掘Kafka底层原理。

"\u003Cdiv\u003E\u003Cblockquote\u003E\u003Cp\u003E专注于Java领域优质技术,欢迎关注\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Cp\u003E来自:架构师社区\u003C\u002Fp\u003E\u003Cp\u003E作者:陌北有棵树,一线互联网资深高级JAVA工程师,热爱研究开源技术,架构师社区合伙人\u003C\u002Fp\u003E\u003Cp\u003E目前市面上各种中间件层出不穷,我们在做具体的选型时难免会纠结,在这里阐述点粗浅的看法,其实每个中间件在其设计上,都有其独有的特点或优化点,这些恰好应该是我们所关注的,这样才能做到物尽其用,将其特性发挥到最大;同时还要了解它们各自的劣势,这主要为了避坑。各种中间件就像是积木,我们能做的,就是选择合适形状的积木,搭出需要的房子。\u003C\u002Fp\u003E\u003Cp\u003E不得不说Kafka这块积木,既能做消息中间件削峰解耦,又能做实时流处理,数据业务两手抓,真可谓上得厅堂,下得厨房。所以Kafka系列的第一篇,想先从它的应用场景分别出发,说说是哪些技术和原理支撑了它的技术特性。\u003C\u002Fp\u003E\u003Ch1\u003E\u003Cstrong\u003EKafka核心思想概括\u003C\u002Fstrong\u003E\u003C\u002Fh1\u003E\u003Cp\u003E所有的消息以“有序日志“的方式存储,生产者将消息发布到末端(可理解为追加),消费者从某个逻辑位按序读取。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E【场景一】消息中间件\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E在选择消息中间件时,我们的主要关注点有:性能、消息的可靠性,顺序性。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E1.性能\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E关于Kafka的高性能,主要是因为它在实现上利用了操作系统一些底层的优化技术,尽管作为写业务代码的程序员,这些底层知识也是需要了解的。\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002Fd1b96acc43a0499d9e11e79db524d002\" img_width=\"323\" img_height=\"310\" alt=\"我挖掘Kafka底层原理!发现了它火爆宇宙的3个真相!\" inline=\"0\"\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E\u003Cstrong\u003E【优化一】零拷贝\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E这是Kafka在消费者端的优化,我们通过两张图来比较一下传统方式与零拷贝方式的区别:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003E传统方式:\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F3b4d349aa4824fabbee4b071de058b26\" img_width=\"1080\" img_height=\"705\" alt=\"我挖掘Kafka底层原理!发现了它火爆宇宙的3个真相!\" inline=\"0\"\u003E\u003C\u002Fdiv\u003E\u003Cul\u003E\u003Cli\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cstrong\u003E零拷贝方式:\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\u003Cli\u003E终极目标:如何让数据不经过用户空间?\u003C\u002Fli\u003E\u003Cli\u003E从图中可看出,零拷贝省略了拷贝到用户缓冲的步骤,通过文件描述符,直接从内核空间将数据复制到网卡接口。\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002Fb1da1ee70c0d465e92f6f8795825f842\" img_width=\"1080\" img_height=\"649\" alt=\"我挖掘Kafka底层原理!发现了它火爆宇宙的3个真相!\" inline=\"0\"\u003E\u003C\u002Fdiv\u003E\u003Cul\u003E\u003Cli\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cstrong\u003E【优化二】顺序写入磁盘\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E写入消息时,采用文件追加的方式,并且不允许修改已经写入的消息,于是写入磁盘的方式是顺序写入。我们通常认为的基于磁盘读写性能较差,指的是基于磁盘的随机读写;事实上,基于磁盘的顺序读写,性能接近于内存的随机读写,以下是性能对比图:\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002Fee55b36ef56f4d309a162466f92616f8\" img_width=\"1080\" img_height=\"590\" alt=\"我挖掘Kafka底层原理!发现了它火爆宇宙的3个真相!\" inline=\"0\"\u003E\u003C\u002Fdiv\u003E\u003Cul\u003E\u003Cli\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cstrong\u003E【优化三】内存映射\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E概括:用户空间的一段内存区域映射到内核空间,这样,无论是内核空间或用户空间对这段内存区域的修改,都可以直接映射到另一个区域。\u003C\u002Fli\u003E\u003Cli\u003E优势:如果内核态和用户态存在大量的数据传输,效率是非常高的。\u003C\u002Fli\u003E\u003Cli\u003E为什么会提高效率:概括来讲,传统方式为read()系统调用,进行了两次数据拷贝;内存映射方式为mmap()系统调用,只进行一次数据拷贝\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cstrong\u003E【优化四】批量压缩\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003E生产者:\u003C\u002Fstrong\u003E批量发送消息集\u003C\u002Fli\u003E\u003Cli\u003E\u003Cstrong\u003E消费者:\u003C\u002Fstrong\u003E主动拉取数据,同样采用批量拉取的方式\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cstrong\u003E2.可靠性\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003EKafka的\u003Cstrong\u003E副本机制\u003C\u002Fstrong\u003E是保证其可靠性的核心。\u003C\u002Fp\u003E\u003Cp\u003E关于副本机制,我将它理解为Leader-Follower机制,就是多个服务器中有相同数据的多个副本,并且划分的粒度是分区。很明显,这样的策略就有下面几个问题必须解决:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E各副本间如何同步?\u003C\u002Fli\u003E\u003Cli\u003EISR机制:Leader动态维护一个ISR(In-Sync Replica)列表,\u003C\u002Fli\u003E\u003Cli\u003ELeader故障,如何选举新的Leader?\u003C\u002Fli\u003E\u003Cli\u003E要想解决这个问题,就要引出Zookeeper,它是Kafka实现副本机制的前提,关于它的原理且听下回分解,本篇还是从Kafka角度进行分析。在这里我们只需要了解,一些关于Broker、Topics、Partitions的元信息存储在Zookeeper中,Leader发生故障时,从ISR集合中进行选举新的Leader。\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cstrong\u003Erequest.required.acks来设置数据的可靠性:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002F9c72665611054b0e819ebf9e03a0fbe8\" img_width=\"924\" img_height=\"318\" alt=\"我挖掘Kafka底层原理!发现了它火爆宇宙的3个真相!\" inline=\"0\"\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E分区机制和副本机制知识点:\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002Faf1359ef7381469d8b48d1c21b6fc007\" img_width=\"347\" img_height=\"320\" alt=\"我挖掘Kafka底层原理!发现了它火爆宇宙的3个真相!\" inline=\"0\"\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E\u003Cstrong\u003E3.顺序性\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E顺序性保证主要依赖于\u003Cstrong\u003E分区机制 + 偏移量\u003C\u002Fstrong\u003E。\u003C\u002Fp\u003E\u003Cp\u003E提到分区,首先就要解释一下相关的概念以及他们之间的关系,个人总结如下几点:\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E服务器(Broker):\u003C\u002Fstrong\u003E指一个独立的服务器\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E主题(Topic):\u003C\u002Fstrong\u003E消息的逻辑分类,可跨Broker\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E分区(Partition):\u003C\u002Fstrong\u003E消息的物理分类,基本的存储单元\u003C\u002Fp\u003E\u003Cp\u003E这里盗一张图阐述上述概念间的关系\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F82fe274fea124123b0126bb2f180f7bb\" img_width=\"558\" img_height=\"308\" alt=\"我挖掘Kafka底层原理!发现了它火爆宇宙的3个真相!\" inline=\"0\"\u003E\u003C\u002Fdiv\u003E\u003Cul\u003E\u003Cli\u003E为什么分区机制可以保证消息的顺序性?\u003C\u002Fli\u003E\u003Cli\u003EKafka可以保证一个分区内消息是有序且不可变的。\u003C\u002Fli\u003E\u003Cli\u003E\u003Cstrong\u003E生产者:\u003C\u002Fstrong\u003EKafka的消息是一个键值对,我们通过设置键值,指定消息被发送到特定主题的特定分区。\u003C\u002Fli\u003E\u003Cli\u003E可以通过设置key,将同一类型的消息,发到同一个分区,就可以保证消息的有序性。\u003C\u002Fli\u003E\u003Cli\u003E\u003Cstrong\u003E消费者:\u003C\u002Fstrong\u003E消费者需要通过保存偏移量,来记录自己消费到哪个位置,在0.10版本前,偏移量保存在zk中,后来保存在 __consumeroffsets topic中。\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cstrong\u003E【场景二】流处理\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E在0.10版本后,Kafka内置了流处理框架API——Kafka Streams,一个基于Kafka的流式处理类库,它利用了上述,至此,Kafka也就随之发展成为一个囊括消息系统、存储系统、流处理系统的中央式的流处理平台。\u003C\u002Fp\u003E\u003Cp\u003E与已有的Spark Streaming平台不同的是,Spark Streaming或Flink是一个是一个系统架构,而Kafka Streams属于一个库。Kafka Streams秉承简单的设计原则,优势体现在运维上。同时Kafka Streams保持了上面提到的所有特性。\u003C\u002Fp\u003E\u003Cp\u003E关于二者适合的应用场景,已有大佬给出了结论,就不强行总结了。\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003EKafka Streams:适合”Kafka --> Kafka“场景\u003C\u002Fli\u003E\u003Cli\u003ESpark Streaming:适合”Kafka --> 数据库”或“Kafka --> 数据科学模型“场景\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cstrong\u003E参考\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E《Kafka权威指南》\u003C\u002Fli\u003E\u003Cli\u003E《Kafka技术内幕》\u003C\u002Fli\u003E\u003Cli\u003EThe Pathologies of Big Data\u003C\u002Fli\u003E\u003Cli\u003EApache Kafka:大数据的实时处理时代\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Chr\u003E\u003Cp\u003E最近无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。\u003C\u002Fp\u003E\u003Cp\u003E \u003Ca class=\"pgc-link\" href=\"https:\u002F\u002Fwww.captainbed.net\u002Fsuga\" target=\"_blank\"\u003Ehttps:\u002F\u002Fwww.captainbed.net\u002Fsuga\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E"'.slice(6, -6), groupId: '6718537748367540749
相关文章