Kafka的相关知识

news2025/1/16 5:59:56

一. Kafka基本介绍

Kafka是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统。具有:高吞吐量低延迟可扩展性持久性可靠性容错性高并发等特性。常见的应用场景有:日志收集消息系统流式处理等。

二. Kafka的基本架构

在这里插入图片描述

  • Producer:生产者,也就是发送消息的一方。生产者负责创建消息,然后将其发送到 Kafka。
  • Consumer:消费者,也就是接受消息的一方。消费者连接到 Kafka 上并接收消息,进而进行相应的业务逻辑处理。
  • Consumer Group:一个消费者组可以包含一个或多个消费者。使用多分区 + 多消费者方式可以极大提高数据下游的处理速度,同一消费组中的消费者不会重复消费消息,同样的,不同消费组中的消费者消息消息时互不影响。Kafka 就是通过消费组的方式来实现消息 P2P 模式和广播模式。
  • Broker:服务代理节点。Broker 是 Kafka 的服务节点,即 Kafka 的服务器。
  • Topic:Kafka 中的消息以 Topic 为单位进行划分,生产者将消息发送到特定的 Topic,而消费者负责订阅 Topic 的消息并进行消费。
  • Partition:Topic 是一个逻辑的概念,它可以细分为多个分区,每个分区只属于单个主题。同一个主题下不同分区包含的消息是不同的,分区在存储层面可以看作一个可追加的日志(Log)文件,消息在被追加到分区日志文件的时候都会分配一个特定的偏移量(offset)。
  • Offset:offset 是消息在分区中的唯一标识,Kafka 通过它来保证消息在分区内的顺序性,不过 offset 并不跨越分区,也就是说,Kafka 保证的是分区有序性而不是主题有序性。
  • Replication:副本,是 Kafka 保证数据高可用的方式,Kafka 同一 Partition 的数据可以在多 Broker 上存在多个副本,通常只有主副本对外提供读写服务,当主副本所在 broker 崩溃或发生网络一场,Kafka 会在 Controller 的管理下会重新选择新的 Leader 副本对外提供读写服务。
  • Record:实际写入 Kafka 中并可以被读取的消息记录。每个 record 包含了 key、value 和 timestamp。

三. Kafka如何保证消息顺序消费

Kafka 在 Topic 级别本身是无序的,只有 partition 上才有序,所以为了保证处理顺序,可以自定义分区器,将需顺序处理的数据发送到同一个 partition。自定义分区器需要实现接口 Partitioner接口并实现 3 个方法:partition,close,configure,在partition 方法中返回分区号即可。
Kafka 中发送 1 条消息的时候,可以指定(topic, partition, key) 3 个参数,partitonkey 是可选的。
Kafka 分布式的单位是 partition,同一个 partition 用一个 write ahead log 组织,所以可以保证FIFO 的顺序。不同 partition 之间不能保证顺序。因此你可以指定 partition,将相应的消息发往同 1个 partition,并且在消费端,Kafka 保证1 个 partition 只能被1 个 consumer 消费,就可以实现这些消息的顺序消费。
另外,也可以指定 key(比如 order id),具有同 1 个 key 的所有消息,会发往同 1 个partition,那这样也实现了消息的顺序消息。

四. Kafka发送消息选择分区的逻辑

Kafka在数据生产的时候,有一个数据分发策略。默认的情况使用org.apache.kafka.clients.producer.internals.DefaultPartitioner类,这个类中就是定义数据分发的策略。默认策略为:

  1. 如果在发消息的时候指定了分区,则消息投递到指定的分区
  2. 如果没有指定分区,但是消息的key不为空,则基于key的哈希值来选择一个分区
  3. 如果既没有指定分区,且消息的key也是空,则用轮询的方式选择一个分区

五. Kafka如何避免消息丢失

Kafka的消息避免丢失可以从三个方面考虑处理:Producer发送消息避免失败Broker能成功保存接收到的消息Consumer确认消费消息

  1. Producer发送消息避免失败
    想要Produce发送消息不失败,那就得知道发送结果,网络抖动这些情况是无法避免的,只能是发送后获取发送结果,那么最直接的方式就是把Kafka默认的异步发送改为同步发送(Broker收到消息后ack回复确认),这样就能实时知道消息发送的结果,但是这样会让Kafka的发送效率大大降低,因为Kafka在默认的异步发送消息的时候可以批量发送,以此大幅度提高发送效率,因此一般很少使用同步发送的方式,除非消息很重要绝不允许丢失。
    但是我们可以采用添加异步或调函数,监听消息发送的结果,如果失败可以在回调中重试,以此来达到尽可能的发送成功。同时Producer本身提供了一个retries的机制,如果因为网络问题,或者Broker故障 导致发送失败,就是重试。一般这个retries设置3-5次或者更高,同时重试间隔时间也随着次数增长。

  2. Broker能成功保存接收到的消息
    Broker要成功的保存接收到的消息并且不丢失,就需要把接收到的消息保存到磁盘。Kafka为了提高性能采用的是异步批量,存储到磁盘的机制,就是有一定的消息量和时间间隔要求的,刷磁盘的这个动作是操作系统来调度的,如果在刷盘之前系统就崩溃了,就会数据丢失。
    针对这个情况,Kafka采用Partition分区ack机制,Partition分区是指一个Topic下的多个分区,有一个Leader分区,其他的都是Follower分区,Leader分区负责接收和被读取消息,Follower分区会通过Replication机制同步Leader的数据,负责高可用(Kafka在2.4之后,Kafka提供了读写分离,Follower也可以提供读取),当Leader出现故障时会从Follower中选取一个成为新的Leader。那么当一个消息发送到Leader分区之后,Kafka提供了一个 acks的参数,Producer可以设置这个参数,去结合brokerPartition机制来共同保障数据的可靠性,这个参数的值有三个

    • 0,表示Producer不需要等待broker的响应,就认为消息发送成功了(可能存在数据丢失)
    • 1,表示Leader收到消息之后,不等待其他的Follower的同步就给Producer发一个确认,如果LeaderPartition挂了就可能存在数据丢失
    • -1,表示Leader收到消息之后还会等待ISR列表(与Leader保持正常连接的Follwer节点列表)中的Follower同步完成,再给Producer返回一个确认,也就是所有分区节点都确认收到消息,保证数据不丢失
  3. Consumer确认消费消息
    Producer确定发送消息成功并且Broker成功保存消息之后,基本上Consumer就肯定能消费到消息。Kafka在消费者消费时有一个offset机制,代表了当前消费者消费到了Partition的哪一条消息。kafka的Consumer的配置中,默认的enable.auto.commit = true,表示在Consumer 通过poll方法 获取到消息以后,每过5秒(通过配置项可修改)会自动获取poll中得到的最大的offset, 提交给Partition中的offset_consumer(存储 offset 的特定topic)。如果enable.auto.commit = false时,则关闭了自动提交,需要手动的通过应用程序代码进行提交。
    所以在Consumer消费消息时,丢失消息的可能会有两种,比如开启了offset自动提交,但是消息消费失败;或者没有开启自动提交offset,但是在消费消息之前提交了offset。针对这两种情况,可以设置在消息消费完成后手动提交offset。总之Consumer端确认消息消费成功后再提交offset即可保证消息正常消费。

六. Kafka的offset机制

​Kafka中的每个Partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到Partition中。Partition中的每个消息都有一个连续的序号,用于Partition唯一标识一条消息。

七. Kafka性能高的原因

八. Kafka的topic数量到128为什么性能会急剧下降

九. Kafka的Replication机制

十. Kafka的Consumer Group

十一. Kafka的零拷贝

十二. Kafka的HW和LEO

十三. Kafka的ISR

十四. Kafka的Rebalance

十五. Kafak为什么依赖zk,zk在其中的作用是什么

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ(五)常见面试题

目录1. 什么是 RabbitMQ?2.为什么要使用 RabbitMQ?3.使用 RabbitMQ 的场景4.如何确保消息正确地发送至 RabbitMQ?如何确保消息接收方消费了消息?5.如何避免消息重复投递或重复消费?6.消息基于什么传输?7.消…

基于java ssm springboot网上蛋糕商城项目设计和实现

基于java ssm springboot网上蛋糕商城项目设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源…

CAD中还能装ArcGIS?还能加载影像?定义坐标系?

时常我们需要CAD中插入影像 需要CAD数据转换GIS数据 需要CAD加载GIS数据 需要将CAD与GIS数据套库 却被坐标系搞蒙了 今天,我们就来解决以上的问题,介绍一款免费的ArcGIS插件——ArcGIS for AutoCAD。 这个模块插件可以直接访问在线地图。直接在CAD中…

Java实验——定义一个表示学生信息的类Student,要求如下:

一、题目要求 定义一个表示学生信息的类Student,要求如下: (1)类Student的成员变量: sNO 表示学号;sName表示姓名;sSex表示性别;sAge表示年龄;sJava:表示…

测试开发 | 如何模拟真实使用场景?mock 技术来帮你

mock 是一种通过代理修改请求与响应,从而辅助构造更多应用场景的工具。比如在工作中,可能需要 mock 第三方的回调给到测试人员测试的环境,从而更顺利的开展测试工作,也使得测试环境更接近真实的使用场景。Charles 修改请求与响应M…

Android自定义时间选择器

效果图 一、添加NumberPicker开源库 需要添加以下控件 仓库地址: https://github.com/ShawnLin013/NumberPicker implementation io.github.ShawnLin013:number-picker:2.4.13 二、 添加弹出框主题样式 在drawable文件夹下新建一个bg_bottom_dialog.xml&…

jenkins结合gitlable企业集成部署实战

简介 Jenkins是一个开源软件项目,起源于Hudson(Hudson是商用的),是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成 1.0 …

新的跨平台渲染引擎:Ab3d.DXEngine 5.2 Crack

用于 WPF 和 WinForms 的 DirectX 11 3D 渲染引擎 Ab3d.DXEngine 是一种超快的 3D 渲染引擎,可用于 .Net 桌面应用程序。采集 by Ω578867473 Ab3d.DXEngine采用超快的多线程渲染技术,可以充分利用显卡,提供与使用C时几乎相同的极致性能。 该…

javaEE 初阶 — 线程安全的集合类

文章目录1. 多线程环境使用 ArrayList多线程使用队列3. 多线程环境使用哈希表3.1 Hashtable3.2 ConcurrentHashMap4. 相关面试题1. 多线程环境使用 ArrayList java 标准库里的大部分集合类都是 “线程不安全” 的。 多个线程使用同一个集合类对象,很有可能会出问题。…

WebDAV之葫芦儿·派盘+Air Explorer

Air Explorer 支持WebDAV方式连接葫芦儿派盘。 电脑本地硬盘不够,网盘云存储已经成为存储的一种趋势。网盘限额,数据存在多个网盘内,操作麻烦还费事。 Airexplorer可以完美解决这个困扰。Air Explorer是一款非常不错的云存储账户管理软件,常见的在线云存储服务器都支持;还…

六道算法基础题详解

目录 1.力扣第217题:存在重复元素 2.力扣第53题:最大子数组和 3.力扣第1题:两数之和 4.力扣第88题:合并两个有序数组 5.牛客BM1题:反转链表 6.牛客BM2题:链表内指定区间反转 1.力扣第217题&#xff1…

6.1、应用层概述

1、基本概述 应用层是计算机网络体系结构的最顶层\color{red}最顶层最顶层,是设计和建立计算机网络的最终目的\color{red}设计和建立计算机网络的最终目的设计和建立计算机网络的最终目的,也是计算机网络中发展最快的部分。 早期基于文本的应用(电子邮件…

RNNoise:学习噪声抑制

目录 1. RNNoise简介 2. 噪声抑制 3. 深度学习和循环神经网络 4. 一种混合的方法 6. 关于数据集 7. 从python到C语言 8. 其他资源 RNNoise:学习噪声抑制 原文地址:RNNoise: Learning Noise Suppression (jmvalin.ca) 1. RNNoise简介 该例子展示…

共享购深度解析——新玩法解读

共享经济模式以合理配置网络资源、减少销售市场交易费用、推动私营经济强势来袭等优点颠覆性创新地严重影响传统商业模式,根据“自由者”的协同,共享经济模式给供需彼此更自由选择和由上而下的制度变革,提高了经济形势高效率,变成…

Pytorch 环境和分布偏移与错误使用机器学习例子

假设我们训练了一个贷款申请人违约风险模型,用来预测谁将偿还贷款或违约。 这个模型发现申请人的鞋子与违约风险相关(穿牛津鞋申请人会偿还,穿运动鞋申请人会违约)。 此后,这个模型可能倾向于向所有穿着牛津鞋的申请人…

代码随想录算法训练营第十六天二叉树 java : 104.二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

文章目录前言深度是个啥,高度又是啥Leetcode 104.二叉树的最大深度题目讲解Leetcode 111.二叉树的最小深度题目讲解Leetcode 222.完全二叉树的节点个数(优先掌握递归题目讲解总结前言 今天将主要围绕 深度和高度 来展开 复习一下递归三部曲 确定递归函…

已解决微软Office2016 Excel卡顿\缓慢、打开第二个文件加载很慢问题(亲测有效)

已解决微软Office2016 Excel卡顿\缓慢、打开第二个文件加载很慢问题(亲测有效) 文章目录问题描述问题分析解决方法1解决方法2解决方法31) 修改基本设置2)修改配置文件问题描述 我的电脑环境是:Windows 10 Excel 2016版本。 文件…

【前端之旅】Nginx快速入门

一名软件工程专业学生的前端之旅,记录自己对三件套(HTML、CSS、JavaScript)、Jquery、Ajax、Axios、Bootstrap、Node.js、Vue、小程序开发(Uniapp)以及各种UI组件库、前端框架的学习。 【前端之旅】Web基础与开发工具 【前端之旅】手把手教你安装VS Code并附上超实用插件…

【Blender UV映射02】智能UV映射 创建和应用法线纹理

写在前面 前面的学习记录: 【Blende UV映射01】创建UV 使用UV贴图处理纹理 依旧是跟着Blender 2.8 UV Mapping教程,本文是教程的P8-P12的过程记录。 1 一些操作记录 调整滚轮缩放 如果发现Blender缩放过快, 键盘的"/"数字键…

Java并发编程实战 学习笔记 Day7

并发编程是比较进阶的知识,涉及到很多底层的东西,学习起来是比较困难的。并发编程的bug更多的是偶发性的,很难复现,排查起来也很困难,要想快速解决问题,就要理解并发编程的本质,追本溯源&#x…