1、什么是kafka?

Kafka是一种分布式的,基于发布/订阅的消息系统(消息队列)。

2、为什么要用kafka?

当业务逻辑变得复杂,数据量也会越来越多。此时可能需要增加多条数据线,每条数据线将收集到的数据导入到不同的存储和分析系统中。若仍使用之前的数据收集模式,则会出现以下问题:

1)生产者和消费者耦合度过高:当需要增加一个消费者时,所有的生产者都需要去改动,数据流水线扩展性差。

2)生产者消费者之间数据处理速率不对等:如果生产者的生产速率过高,可能会导致消费者压力过大,导致崩溃。

3)大量的并发网络连接对后台消费者不友好:大量生产者直接与消费者通信,对消费者造成过高的网络并发压力,会成为系统扩展中潜在的性能瓶颈;另外,大量并发生产者同时写入后端存储,可能会产生大量小文件,对Hadoop等分布式文件系统会造成存储压力。

分布式消息队列优点:降低耦合、异步执行、削峰填谷

3、kafka特点

1)高性能:相比于其他队列,Kafka拥有更高的性能和吞吐率。

2)良好的扩展性:采用分布式设计架构,数据经分片后写入多个节点,既可以突破单节点的存储处理的瓶颈,也可以实现高容错。

3)数据持久性:数据消息均会持久化到磁盘上,通过多副本避免数据丢失。采用顺序读写和批量写等机制,提高了磁盘操作效率。

4、kafka架构

​ Kafka采用了不同于其他队列push-push的架构,而是采用了push-pull架构。Producer直接将数据push给Broker,Consumer从Broker端pull数据。优势主要体现在以下两点:

1)Consumer可根据实际负载和需求获取数据,避免给Consumer带来太大压力。

2)Consumer自己维护已读消息的offset而不是由Broker维护,使Broker更加轻量级。

5、Producer

生产者,发布消息到Broker。

在Kafka中,每条数据被称为消息,每条消息表示为一个三元组:<topic, key, message>。

1)topic:表示该条消息所属的主题。topic是划分消息的逻辑概念,一个topic可以分布在多个Broker上。

2)key:表示该条消息的主键,Kafka会根据主键将同一topic下的消息划分为不同的分区。

​ 当用户写入一条消息时,会对key求Hash值,用该数对partition数量求模,得到的就是分区编号,之后网络告知Broker,Broker写到对应的partition中。

3)message:表示该条消息的值,该数值的类型为字节数组,可以是普通的字符串、JSON对象,或者经序列化框架序列化过后的对象。

6、Broker

1)Kafka中Broker一般会有多个来组成分布式高容错集群。

2)Broker的主要职责是接受Producer和Consumer的请求,并把消息持久化到磁盘。

3)Broker以topic为单位将消息分成不同的分区,每个分区有多个副本,通过数据冗余方式实现容错。

4)当partition中存在多个副本时,其中一个为leader,对外提供读写请求,其余为follower,不对外提供读写请求,只是同步leader中的数据,当leader出现问题时,通过选举算法将其中一个选举为leader。

5)Broker能保证同一topic下的同一partition内数据有序,无法保证partition之间的数据全局有序。

6)Broker以追加的方式将数据写入磁盘,且每个分区中的消息被赋予了唯一整数标识,称为offset。

7)Broker中保存的数据是有有效期的,如果超过了有效期,将磁盘中的数据移除以释放空间,在有效期内,Consumer可以任意重复读取不受限制。

7、Consumer

消费者,主动从Broker中拉取消息进行处理。

1)Consumer自己维护最后一个已读消息的offset。

2)Kafka允许多个Consumer构成一个Consumer Group,共同读取一个topic中的数据来提高效率。

3)Kafka可以自动为同一Group中的Consumer分摊负载,从而实现消息的并发读取。

4)Kafka在某个Consumer发生故障时,自动将它处理的partition转移给同组的其它Consumer来处理。

8、Zookeeper

1)Broker与Zookeeper:Broker会向Zookeeper进行注册,将自己的位置、健康状态、维护的topic和partition等信息写入Zookeeper,以便于其它可以发现获取这些数据。

2)Consumer与Zookeeper:Consumer Group利用Zookeeper保证组内的Consumer负载均衡。

9、关键技术点

1)可控的可靠性级别

​ Producer可以通过两种方式向Broker发送数据,同步和异步。其中异步方式通过批处理方式大大提高了写入效率。不管是以何种方式,Producer均能通过消息应答方式,在写效率和可靠性之间(二者是此消彼长的)做一个较好的权衡。

​ 目前支持三种消息应答方式,通过控制参数request.required.acks:

0:Produce向Broker发送消息后马上返回,无需等待写是否成功,效率最高但不能保证消息被成功接收且写入磁盘。

1:Produce向Broker发送消息后需要等待leader partition写入成功才会返回,不能保证follower partition写入成功,在相对高效的情况下保证至少写入成功一个节点。

-1:Produce向Broker发送消息后需要等待所有的partition写成功后才会返回,容错性高效率低,特别是在写入某个节点较慢时。

2)数据多副本

​ partition中存在多个副本其中一个为leader,对外提供读写请求,其余为follower,不对外提供读写请求,只是同步leader中的数据,当leader出现问题时,通过选举算法将其中一个选举为leader。

​ Kafka Broker的负载均衡实际上是对leader partition的负载均衡,保证leader partition在各个Broker上的数目尽可能相近。

3)高效的持久化机制

​ 为了应对大数据的场景,Kafka Broker直接将数据写入磁盘而不是内存。

​ Kafka Broker利用顺序写的方式写入磁盘,并结合offset方式大大提高了写的效率。

4)数据优化传输

批处理:为了降低单条消息传输带来的网络开销,Broker将多条消息组装在一起。Kafka对数据格式进行统一设计,避免数据格式转换带来的开销。

zero-copy:通常情况下,从磁盘中读取数据并发送出去需要经过4次拷贝(内核态->用户态应用->内核态->网卡),两次系统调用。

​ 通过zero-copy技术优化后,只需要经过3次拷贝(内核态->内核态->网卡),无需任何系统调用,大大提高发送效率。

可控的消息传递语义:

at most once:生产者在给消费者发送消息后就返回,这种情况下消费者可能成功接收到消息,也可能丢失。

at least once:生产者在给消费者发送消息后需要等待确认,如没确认则重新发送消息,这种情况下能保证消费者接收,但可能重复接收。

exactly once:消费者会且只会处理一次处理过的消息。

10、保证数据时序性

Broker能保证同一topic下的同一partition内数据有序,无法保证partition之间的数据全局有序。

1)所以应该把要保证时序性的数据放在同一partition内。

2)topic只有一个partition,保证了这个topic中所有数据有序。

内容来源书籍:《大数据技术体系详解 原理、架构与实践》 --董西成

Kafka原理笔记的更多相关文章

  1. kafka学习笔记(一)消息队列和kafka入门

    概述 学习和使用kafka不知不觉已经将近5年了,觉得应该总结整理一下之前的知识更好,所以决定写一系列kafka学习笔记,在总结的基础上希望自己的知识更上一层楼.写的不对的地方请大家不吝指正,感激万分 ...

  2. Kakfa揭秘 Day1 Kafka原理内幕

    Spark Streaming揭秘 Day32 Kafka原理内幕 今天开始,会有几天的时间,和大家研究下Kafka.在大数据处理体系中,kafka的重要性不亚于SparkStreaming.可以认为 ...

  3. kafka 入门笔记 #1

    kafka 入门笔记(#1) 单机测试 下载版本,解压 tar -xzf kafka_2.11-0.10.1.1.tgz cd kafka_2.11-0.10.1.1 启动服务 Kafka用到了Zoo ...

  4. kafka原理和实践(一)原理:10分钟入门

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  5. kafka原理和实践(二)spring-kafka简单实践

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  6. kafka原理和实践(六)总结升华

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  7. kafka原理简介并且与RabbitMQ的选择

    kafka原理简介并且与RabbitMQ的选择 kafka原理简介,rabbitMQ介绍,大致说一下区别 Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和 ...

  8. kafka原理和实践(三)spring-kafka生产者源码

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  9. kafka原理和实践(四)spring-kafka消费者源码

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

随机推荐

  1. 关于PHP导出数据超时的优化

    一般情况下,导出超时可能都是以下三种情况: 一.sql语句复杂,查询时间过长: 二.处理查询后数据逻辑冗余: 三.数据量过大导致响应超时. 接下来分别给出这三种情况的优化建议. 一.sql语句复杂,查 ...

  2. JPA事务中的异常最后不也抛出了,为什么没被catch到而导致回滚?

    上周,我们通过这篇文章<为什么catch了异常,但事务还是回滚了?>来解释了,之前test4为什么会回滚的原因. 但还是收到了很多没有理解的反馈,主要是根据前文给出的线索去跟踪,是获得到了 ...

  3. 整理!企业选择好用的CRM系统的要点(上)

    随着市场经济的发展,对任何行业的企业来说,客户都是非常重要的一个部分.CRM系统帮助企业做到以客户为中心,它可以根据客户的具体要求进行跟进和反馈,在很大程度上提高公司的客户服务水平和客户满意度,进而提 ...

  4. IDA PRO:庆祝成立创新 30 周年

    今天,IDA 已经三十岁了.为了纪念周年纪念,我们将描述史诗旅程的开始和主要里程碑. 背景 在 1990 年代初期,DOS 是最流行的 PC 操作系统,主要是 8086,偶尔有 80286(80386 ...

  5. Leetcode No.27 Remove Element(c++实现)

    1. 题目 1.1 英文题目 Given an integer array nums and an integer val, remove all occurrences of val in nums ...

  6. konga的初步使用

    目录 1. 设置连接 2. konga的重要功能 Dashboard Snapshots Settings 3. 通过konga 实现kong api配置 前言: 在上篇文章中,我们已经创建了一个到k ...

  7. Linux必备命令 - 常用命令集

    默认进入系统,我们会看到这样的字符: [root@localhost ~]#,其中#代表当前是root用户登录,如果是$表示当前为普通用户.cd 命令 cd  /home  :解析:进入/home目录 ...

  8. Spring Boot(二):Spring Boot中的配置参数

    Spring Boot 配置参数 Spring Boot 帮助我们完成了许许多多的自动化配置 如果我们需要根据自己的需求修改配置 也是可以的 可以使用.properties 和 .yml 格式配置 这 ...

  9. C语言:整数取值范转及溢出

    short.int.long 是C语言中常用的三种整数类型,分别称为短整型.整型.长整型.在现代操作系统中,short.int.long 的长度分别是 2.4.4 或者 8,它们只能存储有限的数值,当 ...

  10. SpringBoot 构造器注入、Setter方法注入和Field注入对比

    0. 引入 今天在看项目代码的时候发现在依赖注入的时候使用了构造器注入,之前使用过 Field 注入和 Setter 方法注入,对构造器注入不是很了解.经过查阅资料看到,Spring 推荐使用构造器注 ...