当前位置: 首页 > news >正文

Kafka基础/1

Kafka

概念

Kafka 是一个分布式的流媒体平台。

应用:消息系统、日志收集、用户行为追踪、流式处理

特点:高吞吐量、消息持久化、高可靠性、高扩展性

术语

  • broker:Kafka 的服务器,Kafka 当中每一台服务器,我们称其为broker

  • Zookeeper:管理集群(Kafka 内置的 Zookeeper)

  • Topic:点对点(很像阻塞队列),发布订阅模式(Kafka采用的。生产者把消息放到某个位置,然后很多个消费者同时关注这个位置,订阅这个位置,然后读取消息,这个时候这个消息可以被多个消费者同时读到或者先后读到,相当于一个文件夹,存放消息的位置)

  • Partition:分区,是对主题这个位置的一个分区,可以把主题分为n个区域,然后就可以采用多线程的方式同时向这n个分区里面写数据,增强并发能力。每一个它是从前往后按照顺序往队尾里追加数据的,然后按照索引顺序读取数据。

  • offset:这个消息在这个分区内存放的这个索引序列

  • Leader Replica:主副本,当想从分区中读取数据的时候,主副本可以给出数据,处理请求

  • Follower Replica:从副本,只是备份,只是从主副本备份数据,不负责做响应。当主副本挂掉,集群就会从从副本中选一个新的作为主副本

具体使用:

创建主题:
在这里插入图片描述

Kafka 默认端口90922

生产者:
在这里插入图片描述

消费者:
在这里插入图片描述

Spring 整合 Kafka

配置的时候:

  • server:项目中的 server 只有一个
  • 消费者的组
  • 是否自动提交
  • 自动提交的频率

Kafka 小样例:

一、首先定义一个对象,对事件进行封装

package com.conquer.community.entity;import java.util.HashMap;
import java.util.Map;public class Event {private String topic;  //主题/事件的类型private int userId;  //事件触发的人private int entityType;  //事件发生在哪个实体(帖子、点赞、评论)private int entityId;  //实体的 IDprivate int EntityUserId;   //实体的作者private Map<String, Object> data = new HashMap<>();  //把其它的额外的数据全都存到这个 map 中,这样就具有了一定的扩展性public int getEntityId() {return entityId;}public Event setEntityId(int entityId) {this.entityId = entityId;return this;  //有了一些改动,好处:当用了 set 方法之后,当我 set 了 topic 我当然还要 set 其它的属性,当我set了这个属性之后,又返回这个对象,我又可以调用当前对象的其它 set 方法,所以我们写的时候可以 event.setTopic().setUserId.set...(链式编程) 就比较方便}public String getTopic() {return topic;}public Event setTopic(String topic) {this.topic = topic;return this;}public int getUserId() {return userId;}public Event setUserId(int userId) {this.userId = userId;return this;}public int getEntityType() {return entityType;}public Event setEntityType(int entityType) {this.entityType = entityType;return this;}public int getEntityUserId() {return EntityUserId;}public Event setEntityUserId(int entityUserId) {EntityUserId = entityUserId;return this;}public Map<String, Object> getData() {return data;}public Event setData(String key, Object value) {this.data.put(key, value);return this;   //这样的话一次传一个值,还想传的话继续点就可以}
}

Kafka 零拷贝原理

在实际应用中,如果我们需要把磁盘中的某个文件内容发送到远程服务器上,那么它必须要经过这样几个拷贝过程
在这里插入图片描述

1、从磁盘中读取目标文件内容拷贝到内核缓冲区

2、CPU 控制器再把内核缓冲区的数据复制到用户空间的缓冲区中

3、在应用程序中,调用 write() 方法,把用户空间缓冲区中的数据拷贝到内核下的 Socket Buffer 中

4、把在内核模式下的 SocketBuffer 中的数据复制到网卡缓冲区,网卡缓冲区再把数据传输到目标服务器上

这这个过程中我们可以发现,数据从磁盘到最终发送出去,要经历四次拷贝,而这四次拷贝过程中,有两次拷贝是浪费的。分别是:

  • 从内核空间复制到用户空间
  • 从用户空间再次复制到内核空间

除此之外,由于用户空间和内核空间的切换,会带来上下文的一个切换,对 CPU 的一个性能也会造成一些影响。而零拷贝就是把这两次多余的拷贝省略掉,应用程序可以直接把磁盘中的数据从内核直接传送到 Socket,而不再需要经过应用程序所在的用户空间。

**零拷贝通过 DMA 技术把文件内容复制到内核空间的 Read Buffer,接着,把包含数据位置和长度信息的文件描述符加载到 Socket Buffer 中,DMA 引擎直接把数据从内核空间传递给网卡设备。**在这样的一个流程中,数据只经历了两次拷贝就发送到了网卡中,并且减少了两次 CPU 的上下文切换,极大的提高了效率。

结论:

所谓零拷贝,并不是完全没有数据复制,只是相对于用户空间来说,不再需要进行数据拷贝。对于前面说的整个流程来说,零拷贝只是减少了不必要的拷贝次数而已。

实现零拷贝:
  • 在 Linux 中,零拷贝技术依赖于低层的 sendfile() 方法实现

  • 在 Java 中,FileChannal.transferTo() 方法的底层实现就是 sendfile() 方法

  • mmap 文件映射机制:原理 —— 将磁盘文件映射到内存,用户通过修改内存就能修改磁盘文件。使用这种方式可以获取很大的 I/O 提升,省去了用户空间到内核空间复制的开销。

ISR 机制

ISR 机制是 Kafka 保障数据可靠性的关键概念之一。从三个方面来说:

1、ISR 的概念

ISR 代表着一组与 Topic 分区 Leader 保持同步的 Follower 分区的副本

2、ISR 的工作原理

ISR 列表中的副本会定期向 Leader 同步数据,确保数据的一致性。只有 ISR 列表中的副本才会参与数据的同步操作,如果某个副本无法及时同步,那么它将会从 ISR 列表中移除。

3、ISR 的重要性

ISR 机制对于数据的可靠性非常重要,当某个副本无法及时同步或者发生故障的时候,Kafka 会从 ISR 列表中去选择另外一个副本作为 Leader,确保高可用性和数据的一致性。

总的来说,Kafka 的 ISR 机制是确保数据可靠性和一致性的关键概念,它通过维护与 Leader 同步的副本列表去确保数据的及时同步和可靠性。

Kafka 快在哪里

Kafka 是一个分布式流处理组件,它设计之初,就是用在一些高吞吐量的数据流应用和数据管道上,所以在早期很多互联网企业对于一些高吞吐量需求的场景清一色采用了 Kafka,在早期很多场景中,大部分用的是 ActiveMQ,发现性能是在满足不了需求,就直接切到 Kafka 上。

有几个比较好的设计:

1、数据的分片存储:Kafka 采用了 partition 的物理存储机制,把一个 topic 中的消息,分成多个数据分片,类似于分库分表逻辑

2、消息的持久化存储方案中,Kafka 的消息都是顺序追加的方式存储到磁盘上的。利用了磁盘的数据写入,减少了磁盘寻道的时间;再结合批量刷盘的操作,节省了磁盘的 IO 次数。

3、Kafka 使用操作系统的零拷贝机制来优化数据传输。这意味着再将消息从磁盘发送到网络接口的时候,可以减少数据的拷贝次数

4、Kafka 整体架构的可扩展性很强。它可以再不停机的情况下进行水平扩容,我们可以动态地添加更多的 Kafka Broker 以及分区来处理更高的负载

5、Kafka 为每个分区维护了一套简洁高效的索引。使得即使在非常大的数据量下,也能快速定位和检索消息。

这些特性共同工作使得 Kafka 在消息传输方面非常高效,特别适合需要处理大量数据流的场景。比如说日志搜集、事件源、实时分析、监控系统等

Kafka 中的 Partition 分区副本的 Leader 选举算法

Kafka 首先会选择一个具有最新数据的副本作为新的 Leader,也就是 ISR 集合的副本。其中 ISR 集合指的是与 Leader 同步的副本集合,也就是说,它们的数据同步状态与 Leader 最接近,并且它们与 Leader 副本的网络通信的延迟是最小的。

如果 ISR 集合没有可用副本,Kafka 会从所有副本中去选择一个具有最新数据的副本作为新的 Leader。在这种情况下选举出来的 Leader 由于和原来老的节点的数据存在较大的延迟,所以可能会造成一部分的数据丢失的情况。

所以 Kafka 设计者把这个功能开关的选择交给了开发人员,如果愿意接受这种情况,可以通过 unclean.leader.election.enable 这样一个参数来设置,开启之后虽然会造成数据丢失,但是至少可以保证依然能够对外提供服务,保证可用性。

MQ 如何保证消费顺序性

这个问题我想从两个方面来回答,一个是 Kafka 为什么会存在无序消费,第二个是 Kafka 如何保证有序消费

Kafka 为什么会存在无序消费

在 Kafka 的整个架构里面,用到了 Partition 的分区机制 实现消息的物理存储。也就是说在同一个 topic 里面可以维护多个 Partition 来去实现消息的一个分片。那么生产者在发送消息的时候会根据消息的 key 来进行取模,来决定把当前的消息存储到哪一个 Partition 里面。

而且消息是按照先后有序的去存储在 Partition 里面。假设一个 topic 里面有三个 Partition,而消息正好被路由到三个独立的 Partition 里面,然后消费端有三个消费者去通过 balance 的一个机制去分别指派了对应的消费分区,因为消费者是完全独立的网络节点,所以可能会出现消息的消费顺序不是按照发送顺序来实现的,从而导致消息的消息乱序的一个问题。

解决方法

自定义消息分区的一个路由算法,然后把指定的 key 都发送到同一个 Partition 里面,然后我们去指定一个消费者专门去消费某一个分区的数据,这样的话就保证了消息的顺序消费了。

另外在有些设计方案里面,在消费端会采用异步线程的方式来消费数据,以提高消息的处理效率。在这样的情况下,因为每个线程的消息处理效率是不同的。所以即便是采用单个分区的存储和消费也可能会出现无序访问的一个问题。对这样的问题的解决方法就是在消息消费端采用一个阻塞队列,把获取到的消息,先保存到阻塞队列里面,然后采用异步线程从阻塞队列里面去获取消息来进行消费。

参考 by B站 跟着Mic 学架构

相关文章:

Kafka基础/1

Kafka 概念 Kafka 是一个分布式的流媒体平台。 应用&#xff1a;消息系统、日志收集、用户行为追踪、流式处理 特点&#xff1a;高吞吐量、消息持久化、高可靠性、高扩展性 术语&#xff1a; broker&#xff1a;Kafka 的服务器&#xff0c;Kafka 当中每一台服务器&#xf…...

Jupyter Notebook中常见的快捷键

Jupyter Notebook的快捷键主要分为两种模式&#xff1a;命令模式和编辑模式。 在命令模式下&#xff0c;键盘输入用于运行程序命令&#xff0c;此时单元格框线是蓝色的&#xff1b; 在编辑模式下&#xff0c;可以往单元格中键入代码或文本&#xff0c;此时单元格框线是绿色的…...

《前端面试题》- JS基础 - call()、apply()、bind() 的区别

call 、bind 、 apply 这三个函数的功能都是改变this的指向问题&#xff0c;但是也存在一定的区别。 call 的参数是直接放进去的&#xff0c;第二第三第 n 个参数全都用逗号分隔,apply 的所有参数都必须放在一个数组里面传进去bind 除了返回是函数以外&#xff0c;它 的参数和…...

开源软件技术社区方案

开源软件技术社区是一个由开发者、贡献者、用户和维护者组成的共享平台&#xff0c;主要目的是打造技术、软件产品良性互动、开源技术安全可控的软件生态环境&#xff0c;实现可复用应用或服务的快速部署与使用、完成资源与能力的高度共享、促进社区成员的共建共赢&#xff0c;…...

【开源书籍】深入讲解内核网络、Kubernetes、ServiceMesh、容器等云原生相关技术。

项目地址&#xff1a;GitHub - isno/theByteBook: ⭐ 【开源书籍】深入讲解内核网络、Kubernetes、ServiceMesh、容器等云原生相关技术。经历实践检验的 DevOps、SRE指南。如发现错误&#xff0c;谢谢提issue 深入架构原理与实践 这是什么&#xff1f; 这是一本关于架构设计…...

【C语言】“vid”Microsoft Visual Studio安装及应用(检验内存泄露)

文章目录 前言安装包获取配置VLD完成 前言 我们在写代码时往往容易存在内存泄漏的情况&#xff0c;所以存在这样一个名为VLD的工具用来检验内存泄漏&#xff0c;现在我来教大家安装一下 安装包获取 vld下载网址&#xff1a;https://github.com/KindDragon/vld/releases/tag/…...

Accuracy准确率,Precision精确率,Recall召回率,F1 score

真正例和真反例是被正确预测的数据&#xff0c;假正例和假反例是被错误预测的数据。然后我们需要理解这四个值的具体含义&#xff1a; TP&#xff08;True Positive&#xff09;&#xff1a;被正确预测的正例。即该数据的真实值为正例&#xff0c;预测值也为正例的情况&#xf…...

系统架构最佳实践 -- 智慧图书管理系统架构设计

随着数字化时代的到来&#xff0c;智慧图书管理系统在图书馆和机构中扮演着重要的角色。一个优秀的图书管理系统不仅需要满足基本的借阅管理需求&#xff0c;还需要具备高效的性能、良好的扩展性和稳定的安全性。本文将讨论智慧图书管理系统的架构设计与实现&#xff0c;以满足…...

网络基础三——IP协议补充和Mac帧协议

全球网络及网段划分的理解 ​ 根据国家组织地区人口综合评估进行IP地址范围的划分&#xff1b; ​ 假设前8位用来区分不同的国家&#xff0c;国际路由器负责全球数据传输&#xff0c;子网掩码为IP/8&#xff1b;次6位区分不同的省份&#xff0c;国内路由器负责全国数据的传输…...

人工智能——深度学习

4. 深度学习 4.1. 概念 深度学习是一种机器学习的分支&#xff0c;旨在通过构建和训练多层神经网络模型来实现数据的高级特征表达和复杂模式识别。与传统机器学习算法相比&#xff0c;深度学习具有以下特点&#xff1a; 多层表示学习&#xff1a;深度学习使用深层神经网络&a…...

postgresql uuid

示例数据库版本PG16&#xff0c;对于参照官方文档截图&#xff0c;可以在最上方切换到对应版本查看&#xff0c;相差不大。 方法一&#xff1a;自带函数 select gen_random_uuid(); 去掉四个斜杠&#xff0c;简化成32位 select replace(gen_random_uuid()::text, -, ); 官网介绍…...

【azure笔记 1】容器实例管理python sdk封装

容器实例管理python sdk封装 测试结果 说明 这是根据我的需求写的&#xff0c;所以有些参数是写死的&#xff0c;比如cpu核数和内存&#xff0c;你可以根据你的需要自行修改。前置条件&#xff1a; 当前环境已安装python3.8以上版本和azure cli并且已经登陆到你的账户 依赖安…...

Nestjs 中定义既可以捕获错误(Error)和又可以异常(Exception)的过滤器

Nestjs 中,使用基于 HttpException 定义过滤器的话,只能捕获 Http 带状态码(statusCode)的 Exception,不能捕获 throw new Error(‘xxx’) 抛出的错误。 以下是使用实现 ExceptionFilter 接口定义的一个不特定于平台(express 或 fastify,即无论使用这两个web服务框架的…...

GitHub 仓库 (repository) Branch - SSH clone URL - Clone in Desktop - Download ZIP

GitHub 仓库 [repository] Branch - SSH clone URL - Clone in Desktop - Download ZIP 1. Branch2. SSH clone URL3. Clone in Desktop4. Download ZIPReferences 1. Branch 显示当前分支的名称。从这里可以切换仓库内分支&#xff0c;查看其他分支的文件。 2. SSH clo…...

Training - 使用 WandB 配置 可视化 模型训练参数

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/137529140 WandB (Weights&Biases) 是轻量级的在线模型训练可视化工具&#xff0c;类似于 TensorBoard&#xff0c;可以帮助用户跟踪…...

N1922A是德科技N1922A功率传感器

181/2461/8938产品概述&#xff1a; N192XA 传感器是首款通过将直流参考源和开关电路集成到功率传感器中来提供内部调零和校准的传感器。此功能消除了与使用外部校准源相关的多个连接&#xff0c;从而最大限度地减少了连接器磨损、测试时间和测量不确定性。 连接到 DUT 时进行…...

最简洁的Docker环境配置

Docker环境配置 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Mac、Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不…...

Docker内更新Jenkins详细讲解

很多小伙伴在Docker中使用Jenkins时更新遇到困难&#xff0c;本次结合自己的实际经验&#xff0c;详细讲解。根据官网Jenkins了解以下内容&#xff1a; 一、Jenkins 是什么? Jenkins是一款开源 CI&CD 软件&#xff0c;用于自动化各种任务&#xff0c;包括构建、测…...

基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1遗传算法与模拟退火算法简介 4.2 GSAHO算法应用于JSSP 5.完整程序 1.程序功能描述 车间作业调度问题&#xff08;Job Shop Scheduling Problem, JSSP&#xff09;是一种典型的生产调度问…...

Mac 安装 brew brew cask 遇到的问题以及解决办法

安装Homebrew和Homebrew Cask是在Mac上管理软件包的常用方法。虽然大多数情况下安装这两个工具是比较简单的&#xff0c;但有时候也可能遇到一些问题。下面是一些常见的问题以及解决办法&#xff1a; 问题1&#xff1a;无法安装Homebrew 解决办法&#xff1a; 1.确保你的Mac已连…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...