![](https://img-blog.csdnimg.cn/20210125134646528.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Kafka
文章平均质量分 85
从基础概念入手,再到原理深入,由浅入深理解 Kafka
码农架构
专注于系统架构、高可用、高性能、高并发类技术分享
展开
-
Kafka 架构中 ZooKeeper 以怎样的形式存在?
在基于 Kafka 的分布式消息队列中,ZooKeeper 的作用有 Broker 注册、Topic 注册、Producer 和 Consumer 负载均衡、维护 Partition 与 Consumer 的关系、记录消息消费的进度以及 Consumer 注册等。1.Broker 在 ZooKeeper 中的注册为了便于大家理解,我首先解释下“注册”一词。ZooKeeper 是一个共享配置中心,我们可以将一些信息存放入其中,比如 Broker 信息,本质上就是存放一个文件目录。这个配置中心是共享的,原创 2021-03-08 16:38:52 · 1713 阅读 · 3 评论 -
Kafka 中所谓的 ‘零拷贝’ 技术到底是什么?
文章收录地址:Java-Bang专注于系统架构、高可用、高性能、高并发类技术分享除了消息顺序追加、页缓存等技术,Kafka 还使用零拷贝技术来进一步提升性能。所谓的零拷贝是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手。零拷贝大大提高了应用程序的性能,减少了内核和用户模式之间的上下文切换。对 Linux 操作系统而言,零拷贝技术依赖于底层的 sendfile() 方法实现。对应于 Java 语言,FileChannal.transferTo() 方法的底层实现就是 sendfi.原创 2021-02-26 17:36:29 · 3131 阅读 · 4 评论 -
Kafka 是怎么存储的?为什么速度那么快?
文章收录地址:Java-Bang专注于系统架构、高可用、高性能、高并发类技术分享Kafka 依赖于文件系统(更底层地来说就是磁盘)来存储和缓存消息。在我们的印象中,对于各个存储介质的速度认知大体同下图所示的相同,层级越高代表速度越快。很显然,磁盘处于一个比较尴尬的位置,这不禁让我们怀疑 Kafka 采用这种持久化形式能否提供有竞争力的性能。在传统的消息中间件 RabbitMQ 中,就使用内存作为默认的存储介质,而磁盘作为备选介质,以此实现高吞吐和低延迟的特性。然而,事实上磁盘可以比我们预想的要快.原创 2021-02-24 13:37:20 · 1301 阅读 · 7 评论 -
Kafka 生产者哪些重要的参数是我们需要注意的?
在 KafkaProducer 中大部分的参数都有合理的默认值,一般不需要修改它们。不过了解这些参数可以让我们更合理地使用生产者客户端,其中还有一些重要的参数涉及程序的可用性和性能,如果能够熟练掌握它们,也可以让我们在编写相关的程序时能够更好地进行性能调优与故障排查。下面挑选一些重要的参数进行讲解。1. acks这个参数用来指定分区中必须要有多少个副本收到这条消息,之后生产者才会认为这条消息是成功写入的。acks 是生产者客户端中一个非常重要的参数,它涉及消息的可靠性和吞吐量之间的权衡。acks 参原创 2021-02-05 14:48:48 · 917 阅读 · 1 评论 -
Kafka 在哪些场景下会造成重复消费或消息丢失?
kafka消费者在消费的时候对于位移提交的具体时机的把握也很有讲究,有可能会造成重复消费和消息丢失的现象。参考上图,当前一次 poll() 操作所拉取的消息集为 [x+2, x+7],x+2 代表上一次提交的消费位移,说明已经完成了 x+1 之前(包括 x+1 在内)的所有消息的消费,x+5 表示当前正在处理的位置。如果拉取到消息之后就进行了位移提交,即提交了 x+8,那么当前消费 x+5 的时候遇到了异常,在故障恢复之后,我们重新拉取的消息是从 x+8 开始的。也就是说,x+5 至 x+7 之间的原创 2021-02-05 14:44:16 · 2074 阅读 · 2 评论 -
Kafka 消费者提交消费位移时提交的是当前消费到的最新消息的 offset 还是 offset+1?
对于 Kafka 中的分区而言,它的每条消息都有唯一的 offset,用来表示消息在分区中对应的位置。对于消费者而言,它也有一个 offset 的概念,消费者使用 offset 来表示消费到分区中某个消息所在的位置。单词“offset”可以翻译为“偏移量”,也可以翻译为“位移”。很多朋友都有不同的认识,我比赞同这类说法:对 offset 做了一些区分:对于消息在分区中的位置,我们将 offset 称为“偏移量”;对于消费者消费到的位置,将 offset 称为“位移”,有时候也会更明确地称之为“消费位移”原创 2021-02-05 14:27:24 · 1756 阅读 · 1 评论 -
开发Kafka消费者客户端需要注意哪些事项?
在了解了消费者与消费组之间的概念之后,我们就可以着手进行消费者客户端的开发了。在 Kafka 的历史中,消费者客户端同生产者客户端一样也经历了两个大版本:第一个是于 Kafka 开源之初使用 Scala 语言编写的客户端,我们可以称之为旧消费者客户端或 Scala 消费者客户端;第二个是从 Kafka 0.9.x 版本开始推出的使用 Java 编写的客户端,我们可以称之为新消费者客户端或 Java 消费者客户端,它弥补了旧客户端中存在的诸多设计缺陷。正常的消费逻辑需要具备以下几个步骤: 配置消费者原创 2021-02-05 14:20:19 · 722 阅读 · 1 评论 -
怎么理解Kafka消费者与消费组之间的关系?
与生产者对应的是消费者,应用程序可以通过 KafkaConsumer 来订阅主题,并从订阅的主题中拉取消息。不过在使用 KafkaConsumer 消费消息之前需要先了解消费者和消费组的概念,否则无法理解如何使用KafkaConsumer。今天先讲解消费者与消费组之间的关系,后续再结合案例再细致地讲解如何使用。消费者负责订阅 Kafka 中的主题(Topic),并且从订阅的主题上拉取消息。与其他一些消息中间件不同的是:在 Kafka 的消费理念中还有一层消费组的概念,每个消费者都有一个对应的消费组。原创 2021-02-05 14:11:37 · 1608 阅读 · 2 评论 -
图解分析:Kafka 生产者客户端工作原理
消息在真正发往 Kafka 之前,有可能需要经历拦截器、序列化器和分区器等一系列的作用,前面已经做了一系列分析。那么在此之后又会发生什么呢?先看一下生产者客户端的整体架构,如下图所示。整个生产者客户端由两个线程协调运行,这两个线程分别为主线程和发送线程。在主线程中由KafkaProducer创建消息,然后通过可能的拦截器、序列化器和分区器的作用之后缓存到消息收集器(RecordAccumulator,也称为消息累加器)中。发送线程负责从消息收集器中获取消息并将其发送到 Kafka 中。主要用..原创 2021-02-05 13:57:52 · 1417 阅读 · 4 评论 -
Kafka 发送消息过程中拦截器的用途?
消息在通过 send() 方法发往 broker 的过程中,有可能需要经过拦截、序列化器和分区器的一系列作用之后才能被真正地发往 broker。拦截器是早在 Kafka 0.10.0.0 中就已经引入的一个功能,Kafka 一共有两种拦截器:生产者拦截器和消费者拦截器。这里主要讲述生产者拦截器的相关内容生产者拦截器既可以用来在消息发送前做一些准备工作,比如按照某个规则过滤不符合要求的消息、修改消息的内容等,也可以用来在发送回调逻辑前做一些定制化的需求,比如统计类工作。生产者拦截器的使用也很...原创 2021-02-05 13:44:20 · 1783 阅读 · 2 评论 -
怎么理解 Kafka 消费者与消费组之间的关系?
与生产者对应的是消费者,应用程序可以通过 KafkaConsumer 来订阅主题,并从订阅的主题中拉取消息。不过在使用 KafkaConsumer 消费消息之前需要先了解消费者和消费组的概念,否则无法理解如何使用KafkaConsumer。今天先讲解消费者与消费组之间的关系,后续再结合案例再细致地讲解如何使用。消费者负责订阅 Kafka 中的主题(Topic),并且从订阅的主题上拉取消息。与其他一些消息中间件不同的是:在 Kafka 的消费理念中还有一层消费组的概念,每个消费者都有一个对应的消费组。原创 2021-01-29 15:40:33 · 2094 阅读 · 4 评论 -
Kafka 安装与配置
本节详细介绍 Kafka 运行环境的搭建,为了节省篇幅,本节的内容以 Linux CentOS 作为安装演示的操作系统,其他 Linux 系列的操作系统也可以参考本节的内容。具体的操作系统的信息如下:[root@node1 ~]# uname -aLinux node1 2.6.32-504.23.4.el6.x86_64 #1 SMP Tue Jun 9 20:57:37 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux[root@node1 ~]# cat /et原创 2021-01-28 16:14:19 · 10566 阅读 · 5 评论 -
Kafka中所谓的分区器,到底是什么?
消息在通过 send() 方法发往 broker 的过程中,有可能需要经过拦截(Interceptor)、序列化器(Serializer)和分区器(Partitioner)的一系列作用之后才能被真正地发往 broker。拦截器一般不是必需的,而序列化器是必需的。消息经过序列化之后就需要确定它发往的分区,如果消息 ProducerRecord 中指定了 partition 字段,那么就不需要分区器的作用,因为 partition 代表的就是所要发往的分区号。如果消息 ProducerRecord 中没有指原创 2021-01-25 13:43:27 · 982 阅读 · 1 评论 -
都在用Kafka ! 消息队列序列化怎么处理?
生产者需要用序列化器(Serializer)把对象转换成字节数组才能通过网络发送给Kafka。而在对侧,消费者需要用反序列化器(Deserializer)把从 Kafka 中收到的字节数组转换成相应的对象。先参考下面代码实现一个简单的客户端。为了方便,消息的 key 和 value 都使用了字符串,对应程序中的序列化器也使用了客户端自带的 org.apache.kafka.common.serialization.StringSerializer,除了用于 String 类型的序列化器,还有原创 2021-01-25 13:41:19 · 1118 阅读 · 1 评论 -
Kafka 中两个重要概念:主题与分区
在 Kafka 中还有两个特别重要的概念—主题(Topic)与分区(Partition)。Kafka 中的消息以主题为单位进行归类,生产者负责将消息发送到特定的主题(发送到 Kafka 集群中的每一条消息都要指定一个主题),而消费者负责订阅主题并进行消费。主题是一个逻辑上的概念,它还可以细分为多个分区,一个分区只属于单个主题,很多时候也会把分区称为主题分区(Topic-Partition)。同一主题下的不同分区包含的消息是不同的,分区在存储层面可以看作一个可追加的日志(Log)文件,消息在被追加到分区日原创 2021-01-24 15:52:45 · 1555 阅读 · 5 评论 -
如何开发一个完善的 Kafka 生产者客户端?
Kafka 起初是 由 LinkedIn 公司采用 Scala 语言开发的一个多分区、多副本且基于 ZooKeeper 协调的分布式消息系统,现已被捐献给 Apache 基金会。目前 Kafka 已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。目前越来越多的开源分布式处理系统如 Cloudera、Storm、Spark、Flink 等都支持与 Kafka 集成。Kafka 之所以受到越来越多的青睐,与它所“扮演”的三大角色是分不开的: 消息原创 2021-01-22 18:28:17 · 958 阅读 · 2 评论 -
Kafka 中的消息存储在磁盘上的目录布局是怎样的?
Kafka 中的消息是以主题为基本单位进行归类的,各个主题在逻辑上相互独立。每个主题又可以分为一个或多个分区,分区的数量可以在主题创建的时候指定,也可以在之后修改。每条消息在发送的时候会根据分区规则被追加到指定的分区中,分区中的每条消息都会被分配一个唯一的序列号,也就是通常所说的偏移量(offset),具有4个分区的主题的逻辑结构见下图。如果分区规则设置得合理,那么所有的消息可以均匀地分布到不同的分区中,这样就可以实现水平扩展。不考虑多副本的情况,一个分区对应一个日志(Log)。为了防止 Log 过大,原创 2021-01-20 14:29:37 · 1476 阅读 · 3 评论 -
Kafka分区机制介绍与示例
Kafka中可以将Topic从物理上划分成一个或多个分区(Partition),每个分区在物理上对应一个文件夹,以”topicName_partitionIndex”的命名方式命名,该文件夹下存储这个分区的所有消息(.log)和索引文件(.index),这使得Kafka的吞吐率可以水平扩展。生产者在生产数据的时候,可以为每条消息指定Key,这样消息被发送到broker时,会根据分区规则选择被存储到哪一个分区中,如果分区规则设置的合理,那么所有的消息将会被均匀的分布到不同的分区中,这样就实现了负载均衡和水原创 2020-10-12 11:05:17 · 2047 阅读 · 0 评论