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

开始学习 Kafka,一文掌握基本概念|Kafka 系列 一

如果你还不了解 Kafka,或者也打算深入探索、系统学习,那么欢迎有同样目标的小伙伴可以加群交流,让学习之路不再孤独。

一个人可能走的很快,但是一群人会走的更远。(后台回复:加群

点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达

为什么学习 Kafka

Kafka 在当下求职市场中可以说是应聘的必备条件之一,想要应聘高薪岗位,就需要熟练掌握这款优秀的消息引擎。

对于当下环境来说,各个公司尤其是互联网公司的数据量越来越大,需要存储和处理大量的数据,但是计算机的瞬时处理能力是有限的,这就需要一款消息引擎来帮助我们缓解流量激增的问题,平滑将数据传导到下游系统中。

消息引擎系统是一组规范:企业利用这组规范在不同系统之间传递语义准确的消息,实现松耦合的异步式数据传递。

ec39e4fde907614b8e63b9f279dc885e.png

作为一款消息引擎,它主要有以下使用场景。

  • 异步处理:同步调用转换成异步消息通知,在消费者种实现对应的业务处理。比如在一个交易场景中,系统的调用链路很长,订单创建完成后需要检查商品的库存、扣库存、发短信、App 通知等功能,如果都放在一个接口同步调用,接口响应时间会变得很长。但是如果把这些逻辑都利用消息引擎做异步处理逻辑将变得很轻量级。

  • 应用解耦:减少应用直接的强依赖,利用消息队列通信,从而变成一种松耦合的结构。比如如果用户注册系统和红包系统利用接口同步通信,红包系统挂掉用户将无法注册,造成巨大损失。但是如果用户注册后发出一条注册消息,红包系统恢复后慢慢去消费,则可以解耦,提高系统的可用性。

  • 削峰填谷:利用消息中间件缓冲上游生产者大量流量,从而使消费者消费流量整体平滑。对于消息生产能力很强的上游系统,如果没有消息中间件的保护,下游系统可能会直接被压垮导致全链路服务雪崩。比如秒杀业务场景,上游业务发起下单请求,下游业务执行秒杀业务(库存检查,库存冻结,余额冻结,生成订单等等),下游业务处理的逻辑是相当复杂的,并发能力有限,如果上游服务不做限流策略,瞬时可能把下游服务压垮。针对此场景,我们可以利用 MQ 来做削峰填谷,让高峰流量填充低谷空闲资源,达到系统资源的合理利用。

综合以上场景,这就要求一款消息引擎需要具备高可靠、高性能的特点,Kafka 就满足这样的要求。

设计消息系统应该注意什么?

消息系统的不同成员之间需要利用消息进行信息的传递,这就涉及到两个重要的内容:

  1. 消息传递的格式是什么?

  2. 消息是如何传递的,协议是什么?

aaf20838b749307465c277d89f7d13ef.png

消息传递的格式选择有很多,比如 JSON、XML、Protobuf 等,对于 Kafka 来说,他使用的是纯二进制的字节序列,当然消息还是结构化的,只是在使用之前都要将其转换成二进制的字节序列。

消息系统中,有两种常用的传输协议,点对点模型和发布订阅模型。这两种协议,Kafka 都支持。

  1. 点对点模型:也叫消息队列模型。一个系统发送方发送的消息只能被指定接收方接收,其他任何系统都不能再读取 发送的消息。

5be501d7505f341c72bbad039f6bd82b.png
  1. 发布 / 订阅模型:有一个主题(Topic)的概念,发送方也称为发布者(Publisher),接收方称为订阅者(Subscriber)。和点对点模型不同的是,这个模型可能存在多个发布者向相同的主题发送消息,而订阅者也可能存在多个,它们都能接收到相同主题的消息。举个例子,杂志订阅就是一种典型的发布 / 订阅模型,不同的居民可以订阅相同的杂志。

4748646e1abca207952e865ef5806829.png

Kafka 的基本概念和结构

生产者和消费者

学习 kafka 首先要明白其涉及的概念和术语,这是进入 Kafka 世界的门票。

作为一款消息系统,Kafka 提供了完整的消息发布和订阅解决方案。与其他消息系统一样,在这个系统中会有生产者和消费者以及 Topic 的角色。

  • 消息(Record):信息传递的载体。

  • 生产者(Producer):向一个或多个 Topic 发布消息的应用程序。

  • 消费者(Consumer):订阅一个或多个 Topic 接收消息的应用程序。

  • 主题(Topic):发布订阅的主题,同类型消息存储在同样的主题中,是一个逻辑上的划分,区分不同的业务。

消费者和生产者都是客户端(Clients),既然有客户端就有服务端。

Broker 服务端

服务实例(Broker):Kafka 的服务器端由被称为 Broker 的服务进程构成,一个 Kafka 集群由多个 Broker 组成。

Broker 负责接收和处理客户端发送过来的请求,以及对消息进行持久化。Broker 通常分散运行在不同的机器上,这样如果集群中某一台机器宕机,其他机器上的 Broker 也可以对外提供服务。这种多个 Broker 部署方式的方式保证了 Kafka 的高可用。44477980b4547311d354018547b9c243.png

分片和副本

分区or 分片(Partition):。kafka 将 一个Topic 中的消息分成多份,分别存储在不同的 Broker 里,这每一段消息被 kafka 称为 Partition。每个 Partition 都一个有序不变的消息序列,每个 Topic 下可以有多个 Partition。多个分片满足可扩展性和负载均衡。

fba48423ec41ab9700afce30dcc30225.png

为什么要有 Partition?因为一个 Topic 中的消息可能非常多,多到一台Broker存不下,因此需要拆分成多段存储在不同的机器里,并且这样做还能提高读写性能。

  • 副本(Replica):Kafka 中同一条消息能够被拷贝多份冗余存储,也就是副本。副本分为领导者副本(Leader Replica)和追随者副本(Follower Replica)。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。(默认分区副本数不得超过kafka节点数),多个副本满足高可用,副本数量越多,可靠性越高。

    • 领导者副本(Leader Replica):只有Leader能对客户端提供服务。生产者总是向领导者副本写消息,消费者总是从领导者副本读消息。

    • 追随者副本(Follower Replica):Follower 只能向领导者副本发送请求,请求领导者把最新生产的消息发给它,这样它能保持与领导者的同步,不对客户端提供服务。

位移

由于 Kafka 中的消息都是增量存储的,所以读取和消费消息都有一个位移的概念。

6efc02902036af021d1b96dceab98a79.png
  • 消息位移(Offset):表示 每个Partition中每条消息的位置信息,是一个单调递增且不会改变的值。

  • 消费者位移(Consumer Offset):表示消费者消费的进度,每个消费者都有自己的消费者位移。

  • 消费者组(Consumer Group):多个消费者实例共同组成的一个消费者组,同时消费多个分区以实现高吞吐量。

最后,欢迎大家提问和交流。

加入讨论群是升职加薪第一步!

回复:加群

d9bcc29f26cccc0dc365b89fd1e1200f.jpeg

点赞是一种美德,如对您有帮助,欢迎评论和分享,感谢阅读!

面试没有分库分表经验,那这篇不能错过!|金三银四系列

2023-06-26

6b9bc91594a60be32b34922dc07d8df8.jpeg

从二叉查找树到B*树,一文搞懂搜索树的演进!|原创

2023-05-23

fdebd04f7d0c6f10e7d5f0f2ad500688.jpeg

程序员,停止焦虑吧!|原创

2023-04-24

5115d091802039b7b210d0c4f2dea918.jpeg

相关文章:

开始学习 Kafka,一文掌握基本概念|Kafka 系列 一

如果你还不了解 Kafka,或者也打算深入探索、系统学习,那么欢迎有同样目标的小伙伴可以加群交流,让学习之路不再孤独。 一个人可能走的很快,但是一群人会走的更远。(后台回复:加群) 点击上方“后…...

Couldn‘t lock the file :/tmp/bbc-filesystem-base_syscache_service

解决方案: 进去带这个目录,然后切换成root用户,将它删除...

vscode 通过mongoose 连接mongodb atlas

了解mongodb 的项目结构 1.代表集群名称 > 2.代表数据库名称>3.代表每个 collection名称 三者范围为从大到小的关系 (一对多)。每个集群有不同的连接地址、用户信息(Database Access)、ip配置信息(Network Acce…...

记录 Vue3 + Ts 类型使用

阅读时长: 10 分钟 本文内容:记录在 Vue3 中使用 ts 时的各种写法. 类型大小写 vue3 ts 项目中,类型一会儿大写一会儿小写。 怎么区分与基础类型使用? String、string、Number、number、Boolean、boolean … 在 js 中, 以 string 与 String…...

主从同步带来的业务问题

目录 一: 目前的业务问题二:如何平衡主从不同步和业务隔离?三:解决方案 一: 目前的业务问题 业务A会跑一些规则, 跑完会把规则结果信息落地(落地到主库), 然后会通过TDM…...

主动带宽控制工具

停机和带宽过度使用是任何组织都无法避免的两个问题。随着企业采用 BYOD 文化,通过网络的流量负载可能很重,导致网络拥塞并使网络容易受到网络攻击。为了解决这个问题,企业需要全面的监控策略来保护网络,当看似大量的流量进入网络…...

数据采集的方法有哪些?

近年来,国家和各大企业都在部署大数据战略。“大数据”这个词也越来越频繁地出现在我们的生活中。当我们在进行网上冲浪时,页面总会跳出我们想要搜索的相关产品或关联事物。大数据,似乎总是能够“算”出我们“心中所想”。那么,大…...

linux重新学习-纪录篇

前言: 正式学习linux的时候,除了那些命令之外,更多的是对于这个系统的重新认知。 linux的身世? 在上世纪90年代,那时候计算机非常的珍贵,配置也很一般般,系统也贵,所以没啥人用,在当…...

为机器人装“大脑” 谷歌发布RT-2大模型

大语言模型不仅能让应用变得更智能,还将让机器人学会举一反三。在谷歌发布RT-1大模型仅半年后,专用于机器人的RT-2大模型于近期面世,它能让机器人学习互联网上的文本和图像,并具备逻辑推理能力。 该模型为机器人智能带来显著升级…...

JavaEE 面试常见问题

一、常见的 ORM 框架有哪些? 1.Mybatis Mybatis 是一种典型的半自动的 ORM 框架,所谓的半自动,是因为还需要手动的写 SQL 语句,再由框架根据 SQL 及 传入数据来组装为要执行的 SQL 。其优点为: 1. 因为由程序员…...

06 HTTP(下)

06 HTTP(下) 介绍服务器如何响应请求报文,并将该报文发送给浏览器端。介绍一些基础API,然后结合流程图和代码对服务器响应请求报文进行详解。 基础API部分,介绍stat、mmap、iovec、writev。 流程图部分,描…...

clickhouse调研报告2

由Distributed表发送分片数据 clickhouse分区目录合并 clickhouse副本协同流程 clickhouse索引查询逻辑 clickhouse一级索引生成逻辑(两主键) clickhouse的data目录下包含如下目录: [root@brfs-stress-01 201403_10_10_0]# ll /data01/clickhouse/data total 4 drwxr-x---…...

TensorRT学习笔记--基于TensorRT部署YoloV3, YoloV5和YoloV8

目录 1--完整项目 2--模型转换 3--编译项目 4--序列化模型 5--推理测试 1--完整项目 以下以 YoloV8 为例进行图片和视频的推理,完整项目地址如下:https://github.com/liujf69/TensorRT-Demo git clone https://github.com/liujf69/TensorRT-Demo.…...

原型链污染,nodejs逃逸例子

文章目录 原型链污染原型链污染原理原型链污染小例子 原型链污染题目解析第一题第二题 Nodejs沙箱逃逸方法一方法二 原型链污染 原型链污染原理 原型链 function test(){this.a test; } b new test;可以看到b在实例化为test对象以后,就可以输出test类中的属性a…...

nlohmann::json 中文乱码解决方案

// UTF8字符串转成GBK字符串 std::string U2G(const std::string& utf8) {int nwLen MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, NULL, 0);wchar_t* pwBuf new wchar_t[nwLen 1];//加1用于截断字符串 memset(pwBuf, 0, nwLen * 2 2);MultiByteToWideChar(CP_U…...

IDEA中maven项目失效,pom.xml文件橙色/橘色

IDEA中maven项目失效,pom.xml文件橙色/橘色 IDEA中Maven项目失效 IDEA中创建的maven项目中的文件夹都变成普通格式,pom.xml变成橙色 右键点击橙色的pom.xml文件,选择add as maven project maven项目开始重新导入相应依赖,恢复…...

【雕爷学编程】MicroPython动手做(28)——物联网之Yeelight 2

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…...

IntelliJ IDEA 2023.2社区版插件汇总

参考插件帝:https://gitee.com/zhengqingya/java-developer-document 突发小技巧:使用插件时要注意插件的版本兼容性,并根据自己的实际需求选择合适的插件。同时,不要过度依赖插件,保持简洁和高效的开发环境才是最重要…...

Sheel编写关于mysqldump实现分库分表备份

编写脚本,使用mysqldump实现分库分表备份。 #编辑脚本文件 [rootlocalhost scripts]# vim bak_tb1.sh#脚本内容: #设置变量,减少代码冗余 mysql_cmd-uroot -p123 exclude_dbDatabase|information_schema|-S|mysql|performance_schema|sys ba…...

Rust的入门篇(上)

Rust的入门篇(上) 最近跟着菜鸟一起入门了比较火的Rust语言,下面整理一下学习的笔记吧。 1. Helloworld程序 fn main(){println!("hello rust") }2. 格式化字符串 fn main(){let a 12;// 格式化字符串println!("a{}", a);println!("a…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

深度解析云存储:概念、架构与应用实践

在数据爆炸式增长的时代,传统本地存储因容量限制、管理复杂等问题,已难以满足企业和个人的需求。云存储凭借灵活扩展、便捷访问等特性,成为数据存储领域的主流解决方案。从个人照片备份到企业核心数据管理,云存储正重塑数据存储与…...

C/Python/Go示例 | Socket Programing与RPC

Socket Programming介绍 Computer networking这个领域围绕着两台电脑或者同一台电脑内的不同进程之间的数据传输和信息交流,会涉及到许多有意思的话题,诸如怎么确保对方能收到信息,怎么应对数据丢失、被污染或者顺序混乱,怎么提高…...

分布式计算框架学习笔记

一、🌐 为什么需要分布式计算框架? 资源受限:单台机器 CPU/GPU 内存有限。 任务复杂:模型训练、数据处理、仿真并发等任务耗时严重。 并行优化:通过任务拆分和并行执行提升效率。 可扩展部署:适配从本地…...

CodeBuddy一腾讯内部已有超过 85% 的程序员正在使用de编程工具

大家好,我是程序员500佰,目前正在前往独立开发路线,我会在这里分享关于编程技术、独立开发、技术资讯以及编程感悟等内容。 如果本文能给你提供启发和帮助,还请留下你的一健三连,给我一些鼓励,谢谢。 本文直…...

leetcode238-除自身以外数组的乘积

leetcode 238 思路 可以在不使用除法的情况下,利用前缀积和后缀积来实现解答 前缀积:对每个位置,计算当前数字左侧的所有数字的乘积后缀积:对每个位置,计算当前数字右侧的所有数字的乘积 结合这两种思想&#xff0…...