kafka基础

文章目录

  • 一、Kafka入门
    • 1.1、JMS
    • 1.2、生产者-消费者模式
    • 1.3、ZooKeeper
  • 二、kafka基础架构
    • 2.1、producer
    • 2.2、kafka cluster
      • 2.2.1、broker
      • 2.2.2、Controller
      • 2.2.3、Topic
      • 2.2.4、Partition
      • 2.2.5、Replication
      • 2.2.6、Leader & Follower
    • 2.3、consumer

一、Kafka入门

  Kafka是一个由Scala和Java语言开发的,经典高吞吐量的分布式消息发布和订阅系统,也是大数据技术领域中用作数据交换的核心组件之一。以高吞吐、可持久化、可水平扩展、支持流数据处理等特性,备受广大技术组织的喜爱。

1.1、JMS

  JMS(Java Message Service)是Java平台的消息中间件通用规范,定义了主要用于消息中间件的标准接口。如果不是很理解这个概念,可以简单地将JMS类比为Java和数据库之间的JDBC规范。Java应用程序根据JDBC规范中的接口访问关系型数据库,而每个关系型数据库厂商可以根据JDBC接口来实现具体的访问规则。JMS定义的就是系统和系统之间传输消息的接口。

  JMS支持两种消息发送和接收模型:一种是P2P(Peer-to-Peer)点对点模型,另外一种是发布/订阅(Publish/Subscribe)模型。

  1. P2P模型
      P2P模型是基于队列的,消息生产者将数据发送到消息队列中,消息消费者从消息队列中接收消息。因为队列的存在,消息的异步传输成为可能。P2P模型的规定就是每一个消息数据,只有一个消费者,当发送者发送消息以后,不管接收者有没有运行都不影响消息发布到队列中。接收者在成功接收消息后会向发送者发送接收成功的消息。
  2. 发布 / 订阅模型
      所谓的发布订阅模型就是事先将传输的数据进行分类,我们管这个数据的分类称之为主题(Topic)。也就是说,生产者发送消息时,会根据主题进行发送。比如咱们的消息中有一个分类是NBA,那么生产者在生产消息时,就可以将NBA篮球消息数据发送到NBA主题中,这样,对NBA消息主题感兴趣的消费者就可以申请订阅NBA主题,然后从该主题中获取消息。这样,也就是说一个消息,是允许被多个消费者同时消费的。这里生产者发送消息,我们称之为发布消息,而消费者从主题中获取消息,我们就称之为订阅消息。Kafka采用就是这种模型

1.2、生产者-消费者模式

  生产者-消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通信,而通过阻塞队列来进行通信,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个消息缓冲区,平衡了生产者和消费者的处理能力。在数据传输过程中,起到了一个削弱峰值的作用,也就是我们经常说到的削峰。

在这里插入图片描述  图形中的缓冲区就是用来给生产者和消费者解耦的。在单点环境中,我们一般会采用阻塞式队列实现这个缓冲区。而在分布式环境中,一般会采用第三方软件实现缓冲区,这个第三方软件我们一般称之为中间件。纵观大多数应用场景,解耦合最常用的方式就是增加中间件。

  遵循JMS规范的消息传输软件(RabbitMQ、ActiveMQ、Kafka、RocketMQ),我们一般就称之为消息中间件。使用软件的目的本质上也就是为了降低消息生产者和消费者之间的耦合性。提升消息的传输效率。

1.3、ZooKeeper

  ZooKeeper是一个开放源码的分布式应用程序协调服务软件。在当前的Web软件开发中,多节点分布式的架构设计已经成为必然,那么如何保证架构中不同的节点所运行的环境,系统配置是相同的,就是一个非常重要的话题。一般情况下,我们会采用独立的第三方软件保存分布式系统中的全局环境信息以及系统配置信息,这样系统中的每一个节点在运行时就可以从第三方软件中获取一致的数据。也就是说通过这个第三方软件来协调分布式各个节点之间的环境以及配置信息。Kafka软件是一个分布式事件流处理平台系统,底层采用分布式的架构设计,就是说,也存在多个服务节点,多个节点之间Kafka就是采用ZooKeeper来实现协调调度的。Kafka软件中就内置了ZooKeeper的客户端,用于进行ZooKeeper的连接和通信。

  其实,Kafka作为一个独立的分布式消息传输系统,还需要第三方软件进行节点间的协调调度,不能实现自我管理,无形中就导致Kafka和其他软件之间形成了耦合性,制约了Kafka软件的发展,所以从Kafka 2.8.X版本开始,Kafka就尝试增加了Raft算法实现节点间的协调管理,来代替ZooKeeper。不过Kafka官方不推荐此方式应用在生产环境中,计划在Kafka 4.X版本中完全移除ZooKeeper,让我们拭目以待。

二、kafka基础架构

在这里插入图片描述

2.1、producer

生产者,也就是发送消息的一方。生产者负责创建消息,然后将其推送(push)到kafka中。

2.2、kafka cluster

2.2.1、broker

  使用Kafka前,我们都会启动Kafka服务进程,这里的Kafka服务进程我们一般会称之为Kafka Broker或Kafka Server。因为Kafka是分布式消息系统,所以在实际的生产环境中,是需要多个服务进程形成集群提供消息服务的。所以每一个服务节点都是一个broker,而且在Kafka集群中,为了区分不同的服务节点,每一个broker都应该有一个不重复的全局ID,称之为broker.id,这个ID可以在kafka软件的配置文件server.properties中进行配置。

2.2.2、Controller

  Kafka是分布式消息传输系统,所以存在多个Broker服务节点,但是它的软件架构采用的是分布式系统中比较常见的主从架构(Master - Slave),也就是说需要从多个Broker中找到一个用于管理整个Kafka集群的Master节点,这个节点,我们就称之为Controller。它的主要作用是在Zookeeper的帮助下管理和协调控制整个Kafka集群。如果在运行过程中,Controller节点出现了故障,那么Kafka会依托于ZooKeeper软件选举其他的节点作为新的Controller,让Kafka集群实现高可用。

2.2.3、Topic

  Kafka是分布式消息传输系统,采用的数据传输方式为发布-订阅模式,也就是说由消息的生产者发布消息,消费者订阅消息后获取数据。为了对消费者订阅的消息进行区分,所以对消息在逻辑上进行了分类,这个分类我们称之为主题:Topic。消息的生产者必须将消息数据发送到某一个主题,而消费者必须从某一个主题中获取消息,并且消费者可以同时消费一个或多个主题的数据。Kafka集群中可以存放多个主题的消息数据。

  为了防止主题的名称和监控指标的名称产生冲突,官方推荐主题的名称中不要同时包含下划线和点。

在这里插入图片描述

2.2.4、Partition

  Kafka消息传输采用发布-订阅模式,所以消息生产者必须将数据发送到一个主题,假如发送给这个主题的数据非常多,那么主题所在broker节点的负载和吞吐量(IO性能)就会受到极大的考验,甚至有可能因为热点问题引起broker节点故障,导致服务不可用。一个好的方案就是将一个主题从物理上分成几块,然后将不同的数据块均匀地分配到不同的broker节点上,这样就可以缓解单节点的负载问题。这个主题的分块我们称之为:分区partition。默认情况下,topic主题创建时分区数量为1,也就是一块分区,可以指定参数--partitions改变。Kafka的分区解决了单一主题topic线性扩展的问题,也解决了负载均衡的问题。

  topic主题的每个分区都会用一个编号进行标记,一般是从0开始的连续整数数字。Partition分区是物理上的概念,也就意味着会以数据文件的方式真实存在。每个topic包含一个或多个partition,每个partition都是一个有序的队列。partition中每条消息都会分配一个有序的ID,称之为偏移量:offset。

  offset是消息在分区中的唯一标识,Kafka通过它来保证消息在分区内的顺序性,不过offset并不跨越分区,也就是说,Kafka保证的是分区有序而不是主题有序

在这里插入图片描述

2.2.5、Replication

  分布式系统出现错误是比较常见的,只要保证集群内部依然存在可用的服务节点即可,当然效率会有所降低,不过只要能保证系统可用就可以了。咱们Kafka的topic也存在类似的问题,也就是说,如果一个topic划分了多个分区partition,那么这些分区就会均匀地分布在不同的broker节点上,一旦某一个broker节点出现了问题,那么在这个节点上的分区就会出现问题,那么Topic的数据就不完整了。所以一般情况下,为了防止出现数据丢失的情况,我们会给分区数据设定多个备份,这里的备份,我们称之为:副本Replication。

  Kafka支持多副本,使得主题topic可以做到更多容错性,牺牲性能与空间去换取更高的可靠性。一般来说,副本数量不要超过broker数量。

在这里插入图片描述

2.2.6、Leader & Follower

  假设我们有一份文件,一般情况下,我们对副本的理解应该是有一个正式的完整文件,然后这个文件的备份,我们称之为副本。但是在Kafka中,不是这样的,所有的文件都称之为副本,只不过会选择其中的一个文件作为主文件,称之为:Leader(主导)副本,其他的文件作为备份文件,称之为:Follower(追随)副本。在Kafka中,这里的文件就是分区,每一个分区都可以存在1个或多个副本,只有Leader副本才能进行数据的读写,Follower副本只做备份使用

  当leader副本出现故障时,从follower副本中重新选举新的leader副本对外提供服务。生产者和消费者只与leader副本进行交互,而follower副本只负责消息的同步,很多时候follower副本中的消息相对于leader副本而言会有一定的滞后。

在这里插入图片描述
  分区中的所有副本统称为AR(assigned Replicas),所有与leader副本保持一定程度同步的副本(包括leader副本)在内组成ISR(In-Sync Replicas)集合,是AR集合中的一个子集。消息会先发送到leader副本,然后follower副本才能从leader副本中拉取消息进行同步,同步期间内follower副本相对于leader副本而言会有一定程度的滞后,前面所说的一定程度的同步是指可忍受的滞后范围,这个范围可以通过参数进行配置,与leader副本同步滞后过多的副本(不包括leader副本)组成OSR(Out-of-Sync Replicas),由此可见,AR=ISR+OSR

2.3、consumer

  消费者,也就是接受消息的一方。消费者连接到kafka上并接收消息,进而进行相应的业务逻辑处理。kafka消费端也具备一定的容灾能力,consumer使用拉(pull)模式,从服务端拉取消息并且保存消息的具体位置。当消费者宕机后恢复上线时,可以根据之前保存的消费位置重新拉取需要的消息进行消费,这样就不会造成消息丢失。
 

总结:
一个kafka集群有多个broker,一个broker有多个topic,一个topic有多个分区,一个分区有多个副本。让leader副本在所有broker上均匀分配(理想情况下kafka是要均匀分配的,但是主题是一个一个创建的,kafka并不知道要创建多少个,以及对应的分区和副本数量,所以从实际结果来看可能不是均匀分配的,我们在创建topic时可以指定副本分配策略,或者使用kafka的默认分配策略)。

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

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

相关文章

PMP–一、二、三模、冲刺–分类--5.范围管理--技巧--需求跟踪矩阵

文章目录 技巧一模反例不选“需求跟踪矩阵”4.整合管理86、 [单选] 项目经理加入一个项目,但项目经理在该项目所涉及的行业经验有限,在该项目的整个生命周期中,项目经理精心记录每个差距、问题和不一致性。但是,无论项目经理如何记…

掌握Golang中的数据竞争检测:runtime/race包全面教程

掌握Golang中的数据竞争检测:runtime/race包全面教程 引言数据竞争问题概述数据竞争的定义数据竞争对程序的影响常见数据竞争场景 Golang runtime/race包概述runtime/race包简介启用数据竞争检测使用 go run使用 go build使用 go test 基本用法与示例单元测试中的使…

ThreadLocal父子线程、线程池数据传递解决

多线程并发数据访问,确保数据安全至关重要,常用保证数据安全的方法有对代码synchronized锁、Lock锁,以及基于CAS的原子类,这些都是通过数据共享保障数据安全的,今天聊一聊另一种方案ThreadLocal线程副本,实…

Docker 从入门到精通全攻略

一、Docker 初印象 Docker 诞生于 2013 年,由 dotCloud 公司发起,最初是一个公司内部项目。其诞生背景源于程序员们苦于应用部署环境的复杂性,开发、测试、部署过程中各种库的依赖纷繁复杂,版本差异以及测试环境与部署环境不一致等…

WordPress设置自动更新CSS版本号

WordPress 通常会在引用 CSS 文件时添加版本号参数(?verx.x.x)。如果版本号未更新,浏览器可能继续加载旧的文件。 解决方法:确保你在 functions.php 文件中正确加载了 CSS 文件,并动态更新版本号。例如在functions.p…

达梦 DG

监视器 switchover 关于达梦DG switchover的细节,以下是一些关键步骤和注意事项: • 切换前检查确认: • 确认数据库版本和DG架构,包括IP信息及切换角色前后的情况。 • 检查DG切换方式,是switch over还是fail ove…

c#基本数据类型占用字节长度/取值范围/对应.net类型

具体前往:c#基本数据类型占用字节数/取值范围/包装类-各基本类型.net类型,占用bit位数,默认值及取值范围

多品牌NVR管理工具/设备EasyNVR多个NVR同时管理支持RTSP接入

在当今数字化浪潮席卷全球的背景下,视频监控行业正经历着前所未有的变革。传统的本地录像存储模式正逐步向云端集中管理转型,这一技术的飞跃不仅极大地提升了监控效率与安全性,更为各行各业的智能化管理开辟了新路径。在这一转型过程中&#…

初学者指南:知识库问答(KBQA)多跳路径的核心与应用

初学者指南:知识库问答(KBQA)多跳路径的核心与应用 知识库问答(Knowledge Base Question Answering, KBQA)旨在利用结构化知识库(如Wikidata、Freebase)回答自然语言问题。在实际应用中&#x…

利用Python爬虫获取淘宝店铺详情

在数字化时代,数据已成为企业最宝贵的资产之一。对于电商平台,尤其是淘宝这样的大型电商平台,店铺详情数据的获取和分析对于商家来说至关重要。它不仅可以帮助商家了解市场趋势,还可以优化营销策略,提升销售业绩。本文…

卡尔曼滤波学习资料汇总

卡尔曼滤波学习资料汇总 其实,当初的目的,是为了写 MPU6050 的代码的,然后不知不觉学了那么多,也是因为好奇、感兴趣吧 有些还没看完,之后笔记也会同步更新的 学习原始材料 【卡尔曼滤波器】1_递归算法_Recursive P…

【HCIP]——OSPF综合实验

题目 实验需求 根据上图可得,实验需求为: 1.R5作为ISP:其上只能配置IP地址;R4作为企业边界路由器,出口公网地址需要通过PPP协议获取,并进行CHAP认证。(PS:因PPP协议尚未学习&#…

MarkDown笔记记录app——待更新

1,语雀: 容易整理,直接上手,直接导出到csdn或者是github中 2,notion:注意及时清理 平时主要资料整理部分,注意每个page里面包含子page不能超过5MB, 所有的老资料笔记需要导出为htm…

vxe-table 4.9+ 实现在表格列中直接拖拽排序,列拖拽排序

Vxe UI vue vxe-table v4.9 实现在表格列中直接拖拽排序,列拖拽排序 安装 npm install vxe-pc-ui4.3.3 vxe-table4.9.0main.js // ... import VxeUI from vxe-pc-ui import vxe-pc-ui/lib/style.css import VxeUITable from vxe-table import vxe-table/lib/styl…

《勇者斗恶龙3:HD-2D重制版》找幽灵船攻略分享

《勇者斗恶龙3:HD-2D重制版》中的幽灵船是游戏里非常独特的一个区域,而想要找到幽灵船的话还是比较麻烦的,首先是听到关于幽灵船在世界海域上航行的传闻,包括在海盗巢穴中,但幽灵船的出现有一些具体条件。 勇者斗恶龙3…

《通往人工智能深度学习专家之路:全面解析学习路线图》

《通往人工智能深度学习专家之路:全面解析学习路线图》 一、人工智能深度学习简介1.1 人工智能与深度学习的关系1.2 深度学习的应用领域1.3 深度学习的重要性 二、深度学习路线图总览2.1 学习路线图的结构2.2 各阶段学习目标与重点 三、深度学习基础阶段3.1 数学基础…

力扣题解661 图片平滑器

题目(简单) 图像平滑器 是大小为 3 x 3 的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。 每个单元格的 平均灰度 定义为:该单元格自身及其周围的 8 个单元格的平均值&#xff0c…

基于SpringBoot的“致远汽车租赁系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“致远汽车租赁系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 致远汽车租赁系统总体功能模块图 系统首页界面…

DSP28335 DMA 官方例程解析以及拓展(一)

文章目录 概述官方例程1 内部RAM to RAM Example_2833xDMA_ram_to_ram源码解析 要点方法拓展 外部固定地址 TO RAM完整程序: 对DMA 和 DMA有关的API请看这篇文章 DSP28335 DMA API介绍 概述 本篇主要分析官方提供的28335 DMA 有关的例程 在此基础上有一定的拓展 官方例程1 内…

【Java SE】JDBC

JDBC(Java DataBase Connectivity)是一套用于在 Java 中操作关系型数据库的 API。它允许开发者使用统一的 Java 代码来访问不同的关系型数据库。 JDBC 的本质:JDBC 是由官方(Sun 公司)定义的一套接口规范,…