Kafka:浅谈对Kafka的认识

news2024/9/22 7:27:15

Kafka 是一种高吞吐量、分布式、基于发布/订阅的消息系统,最初由 LinkedIn 公司开发,使用Scala 语言编写,目前是 Apache 的开源项目。
在这里插入图片描述

一、Kafka的相关概念

1、Topic

每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic,类似于数据库的表名。

物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个Broker上,但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处。

2、Partition

Topic中的数据分割为一个或多个Partition。每个Topic至少有一个Partition。每个Partition中的数据使用多个segment文件存储。Partition中的数据是有序的,不同Partition间的数据丢失了数据的顺序。如果Topic有多个Partition,消费数据时就不能保证数据的顺序。在需要严格保证消息的消费顺序的场景下,需要将Partition数目设为1。

3、Broker

Kafka 集群包含一个或多个服务器,服务器节点称为Broker,Broker存储Topic的数据。

  • 如果某Topic有N个Partition,集群有N个Broker,那么每个Broker存储该Topic的一个Partition。
  • 如果某Topic有N个Partition,集群有(N+M)个Broker,那么其中有N个Broker存储该Topic的一个Partition,剩下的M个broker不存储该Topic的Partition数据。
  • 如果某Topic有N个Partition,集群中Broker数目少于N个,那么一个Broker存储该Topic的一个或多个Partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。

4、Producer

生产者即数据的发布者,该角色将消息发布到Kafka的Topic中。Broker接收到生产者发送的消息后,Broker将该消息追加到当前用于追加数据的Segment文件中。生产者发送的消息,存储到一个Partition中,生产者也可以指定数据存储的Partition。

5、Consumer

消费者可以从Broker中读取数据。一个消费者可以消费多个Topic中的数据。

6、ConsumerGroup

每个Consumer属于一个特定的ConsumerGroup。可以为每个Consumer指定GroupName,若不指定GroupName则属于默认的Group。

ConsumerGroup是Kafka用来实现一个Topic消息的广播(发给所有的Consumer)和单播(发给任意一个Consumer)的手段。

一个Topic可以有多个ConsumerGroup,Topic的消息会复制到Consumer。如果需要实现广播,只要每个Consumer有一个独立的ConsumerGroup就可以了;要实现单播只要所有的Consumer在同一个ConsumerGroup。

用ConsumerGroup还可以将Consumer进行自由的分组而不需要多次发送消息到不同的Topic。

7、Leader

每个Partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责数据的读写的Partition。

8、Follower

Follower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower,Follower与Leader保持数据同步。如果Leader失效,则从Follower中选举出一个新的Leader。当Follower与Leader挂掉、卡住或者同步太慢,Leader会把这个Follower从“in sync replicas”(ISR)列表中删除,重新创建一个Follower。

9、Offset

Kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000。

二、Kafka的ACK机制

ack有3个可选值,分别是1,0,-1。

1、ack=0

表示生产者在生产过程中的消息丢失。简单来说就是,Producer发送一次就不再发送了,不管是否发送成功。

2、ack=1

标识Broker在故障后的消息丢失。简单来说就是,Producer只要收到一个分区副本成功写入的通知就认为推送消息成功了。这里有一个地方需要注意,这个副本必须是Leader副本。只有Leader副本成功写入了,producer才会认为消息发送成功。

注意:ack的默认值就是1。这个默认值其实就是吞吐量与可靠性的一个折中方案。生产上我们可以根据实际情况进行调整,比如如果你要追求高吞吐量,那么就要放弃可靠性。

3、ack=-1

表示生产侧和存储侧不会丢失数据。简单来说就是,Producer只有收到分区内所有副本的成功写入的通知才认为推送消息成功了。

三、Kafka的Offset机制

Kafka消费者有三种消费语义:

  • at-most-once:最多一次,可能丢数据。
  • at-least-once:最少一次,可能重复消费数据。
  • exact-once message:精确一次。

四、Kafka是Pull模式,还是Push模式

Kafka最初考虑的问题是,Customer应该从Brokers拉取消息还是Brokers将消息推送到Consumer,也就是Pull还Push。

消息系统都致力于让Consumer以最大的速率最快速的消费消息,一些消息系统比如Scribe和Apache Flume采用了Push模式,将消息推送到下游的Consumer。这样做有好处也有坏处:由Broker决定消息推送的速率,但当Broker推送的速率远大于Consumer消费的速率时,Consumer恐怕就要崩溃了。

最终Kafka还是选取了传统的Pull模式,Producer将消息推送到Broker,Consumer从Broker拉取消息。

Push模式必须在不知道下游Consumer消费能力和消费策略的情况下决定是立即推送每条消息还是缓存之后批量推送。
如果为了避免Consumer崩溃而采用较低的推送速率,将可能导致一次只推送较少的消息而造成浪费。Pull模式下,Consumer就可以根据自己的消费能力去决定这些策略,自主决定是否批量的从Broker拉取数据。

Pull有个缺点是,如果Broker没有可供消费的消息,将导致Consumer不断在循环中轮询,直到新消息到达。为了避免这点,Kafka有个参数可以让Consumer阻塞知道新消息到达(当然也可以阻塞知道消息的数量达到某个特定的量这样就可以批量发)。

五、Kafka中ZooKeeper的作用

Kafka中使用了ZookKeper的分布式锁、分布式配置及统一命名的分布式协调解决方案。

  • 在Kafka的Broker集群中的Controller的选择,是通过zk的临时节点争抢获得的。
  • BrokerID等如果自增的话也是通过zk的节点version实现的全局唯一。
  • Kafka中Broker中的状态数据也是存储在zk中。

补充:新旧版本变化中,就把曾经的offset从zk中迁移出了zk。

六、Kafka中高性能如何保障

首先,性能的最大瓶颈依然是IO,这个是不能逾越的鸿沟。

虽然,Broker在持久化数据的时候已经最大努力的使用了磁盘的顺序读写;更进一步的性能优化是零拷贝的使用,也就是从磁盘日志到消费者客户端的数据传递,因为Kafka是MQ,对于msg不具备加工处理,所以得以实现。

然后就是大多数分布式系统一样,总要做tradeoff,在速度与可用性/可靠性中挣扎。ACK的0,1,-1级别就是在性能和可靠中权衡。

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

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

相关文章

宝藏!《联盟自控强化班洗髓题库》(青龙篇) 1-9章:甄选部分

本文内容,全部选自自动化考研联盟的:初试《自控强化班洗髓题库》(青龙篇)。 目录 Part1:资料封面&目录 Part2:资料各个章节具体内容 第1章 自动控制的一般概念 第2章 控制系统的数学模型 第3章 线性系统的时域分析 第4…

QT计算圆的面积

今天实践一下刚学的qt知识,那么我们使用QT最重要的就是信号与槽的使用,那么今天我们就来实践一下。 计算圆的面积 1.创建项目 这个就不用多说了,大家就正常创建一个QWidget的项目就好了 2.编辑UI文件 我们这样创建一个我们的UI项目文件&a…

Nginx部署前端vue项目操作步骤和方法~小皮

部署前端Vue.js项目到Nginx上,是开发流程中至关重要的一步,它意味着将静态文件托管在Web服务器上,使应用程序能够被用户访问和交互。下面将详细介绍如何使用Nginx部署前端Vue项目的操作步骤和方法: 准备构建Vue项目 安装Node.js和…

视联动力数字科技新成果闪耀2024数博会

在2024年的8月28日至30日,贵阳举办的中国国际大数据产业博览会上,视联动力带来了一系列引人注目的技术和创新应用。 这场为期三天的展览会展示了公司在数字经济发展领域的最新成就,特别是国产通信协议技术方面的进展。 视联动力重点展出了算…

html+css网页设计 合十文化2个页面

htmlcss网页设计 合十文化2个页面 ui还原度90% 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 …

AI图像放大工具,图片放大无所不能

AI图像放大工具,如ESRGAN,对于提高由Stable Diffusion生成的AI图像质量至关重要。它们被广泛使用,以至于许多Stable Diffusion的图形用户界面(GUI)都内置了支持。 在这里,我们将学习什么是图像放大器&…

《Class-Agnostic Counting》CVPR2018

概述 摘要:这篇论文提出了一种用于对象计数的模型,该模型能够计算任何类别的对象,而不需要针对特定对象类别进行设计。作者将计数问题表述为一个匹配问题,利用图像中自然存在的自相似性属性。论文的贡献包括:提出了一…

无人机+应用综合实训室解决方案

随着无人机技术的飞速发展,其在航拍、农业、环境监测、物流运输等多个领域展现出巨大的应用潜力。为了满足职业院校及企业对无人机应用技术型人才的培养需求,唯众紧跟市场趋势,推出了全面且详尽的《无人机应用综合实训室解决方案》。本方案旨…

springboot中的请求过滤filter与拦截interceptor分析

首先我们要定义一个类,实现标准的过滤器 import lombok.extern.slf4j.Slf4j;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException;WebFilter("/*") Slf4j public class AuthFilter implements Filter {Overr…

Java框架第三课(Spring IOC与Aop)核心

目录 一.关于Spring (1)什么是Spring (2)IOC解释 (3)Aop解释 (4)"一站式"解释 二.Spring框架的搭建(以Hello World为例) ​编辑 三.Spring框架的IOC (1)IOC基于xml配置 (2)基于注解配置 (3)xml文件配置和注解配置的优缺点 四.Spring集成Mybatis (1)Spring集…

作为导师,亲眼目睹带的研究生在实验室打游戏,是种怎样的体验?

作为导师,看到自己的研究生在实验室打游戏,这种体验可能会引发多种情绪和反应,取决于具体的情境和导师的管理风格。以下是几种可能的体验和思考: 失望与不满:如果学生经常在实验室打游戏,而不是专注于科研…

Linux驱动.之驱动开发思维,设备,驱动,总线分析思想,驱动的分类(字符设备,块设备,网络设备)

在stm32,裸机开发时,偏底层,跟寄存器打交道,有些MCU提供了库,库也还是操作寄存器的,通过配置寄存器, 配置各种工作模式,时钟,等等,交换数据等等。 Linux下驱…

什么是串口服务器?

1.什么是串口服务器? 了解串口服务器之前,我们需要先了解什么串口。 串口:又叫串行数据接口,主要是用来表示传递各种的数据的通信接口,通常指COM口。一般分为RS232、RS422、与RS485三种。RS232接口:采用全…

包装类 ---- java

思维导图: 在 Java 中,自动装箱(autoboxing)和拆箱(unboxing)是一种自动将基本数据类型和对应的包装类进行转换的机制。 一:基本数据类型和对应的包装类 二:装箱和拆箱 int i 10;/…

Spring Boot 3.3新特性解析:CDS支持与Base64配置

前言 Spring Boot 3.3.0 已经发布,其中包含对 CDS支持与Base64配置。 CDS(Class Data Sharing)是一项JVM功能,允许在多个JVM实例之间共享类元数据,从而减少应用程序的启动时间和内存占用。Spring Boot 3.3提供了对CD…

Web前端全栈Vue3项目实战:‌从零到一的完整指南

Web前端全栈Vue3项目实战:‌从零到一的完整指南 在当今的前端开发领域,‌Vue.js 凭借其简洁、‌易学且高效的特点,‌成为了众多开发者的首选框架。‌随着 Vue 3 的发布,‌其在性能、‌类型支持以及组合式 API 等方面的提升&#…

Influxdb简介

InfluxDB 是一个开源的、专门为处理时序数据(Time Series Data)设计的数据库管理系统。它由 InfluxData 开发,旨在高效地存储和查询大量的时序数据,如监控数据、传感器数据、日志、指标和事件等。

图论(1)

一、无序对的定义 无序对中的两元素不分先后 无序积是无序对的集合 无序对里面的元素交换位置还是之前的无序对 二、图 三、图的表示 1、图的表示法 有集合表示法、画图表示法、矩阵表示法 集合表示法:把所有边写在一个集合里,所有点写在一个集合里…

C语言:常用技巧汇总

一、字符串存储在数组中 int main() {char* arr[7] {"xiaoming","zhangsan","李四"};printf("%s\n", arr[0]);printf("%s\n", arr[2]);return 0; } 二、scanf()函数用法 2.1 scanf()输入字符串 int main() {char arr[10…

沸点 | LDBC 第18届 TUC 会议召开,专家孙宇熙受邀参加并发表演讲

图数据管理领域国际权威组织LDBC(Linked Data Benchmark Council)于8月30日至31日在广州举办了第18届LDBC TUC会议。作为图数据库领域的创新引领者,嬴图受邀参加此次盛会,国际高性能计算与存储系统专家、大数据专家、图专家及嬴图…