探究Kafka原理-1.初识Kafka

  • 👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家
  • 📕系列专栏:Spring源码、JUC源码、Kafka原理
  • 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
  • 🍂博主正在努力完成2023计划中:源码溯源,一探究竟
  • 📝联系方式:nhs19990716,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬👀

文章目录

  • 基本概念
    • 什么是kafka?
    • kafka的特点
    • kafka 系统的架构

基本概念

什么是kafka?

Kafka 最初是由 LinkedIn 即领英公司基于 Scala 和 Java 语言开发的分布式消息发布-订阅系统,现
已捐献给 Apache 软件基金会。其具有高吞吐、低延迟的特性,许多大数据实时流式处理系统比如
Storm、Spark、Flink 等都能很好地与之集成。

kafka简单的说就是一个消息系统,类似的有rabbitmq等,但是kafka不能严格的称之为消息队列,只能说是消息中间件。

下面简述消息队列,是一个数据的存储 和 中转系统吧。

在这里插入图片描述

队列的特点,先进先出。

在javaee中,消息队列的场景非常的多。

比如秒杀,或者站内消息等,都是借助消息队列来实现的。类似的消息队列有很多,如ActiveMQ、RabbitMQ、RocketMQ。各有特点,但是总体上来说,功能和应用都是一样的。

第一个是数据的先进先出,第二个就是数据的严格有序(不是按照大小严格有序,是按照数据写入的时间)

实时流式计算:

有一个数据源,实时源源不断的产生数据,然后我们要用一个计算系统去源源不断的处理这个数据,但是如果要让计算系统去对接数据源会产生一点问题。

在这里插入图片描述

1.这两个系统必然形成一个耦合

比如计算系统去调用这个数据源的方法,去拿到这个数据,这是一种方案,去源源不断的去拿,这就是一种耦合,那么就会出现一个问题,将来计算系统要升级,那么计算系统 和 数据源的对接可能就失效了,或者数据源要升级也一样。

2.速度不匹配

数据源产生数据的速度是由数据源里面的属性特性去决定的,加入数据源产生的是用户的行为日志,那么行为日志显然就跟此时此刻公司的业务系统上面在线的用户数量以及用户的活跃程度有关。

在这里插入图片描述

app用户不是固定的,那么就会导致用户行为日志是会不断地变化的。也就是产生数据的速度 和 规模,是不可预期的。但是数据计算处理的速度是恒定的,确切的是速度上限是有限的,因为计算的资源有限,配备的计算系统的硬件的配置、节点的数量都是一个固定的,所以导致处理数据的上限是恒定的。而一旦数据源在某一个瞬间产生数据的速度超越了处理数据的上限,那么这两个之间就一定会出问题,因为这两个是耦合在一起的,一个慢了或者快了都会对双方造成影响,那么速度不匹配就会造成数据丢失、app用户发送日志阻塞等等,这样就完全不能适应我们生产上的需求了。

那么应该怎么做呢?比如说在这中间加入一个缓存。缓存还可以容纳一定容量的数据。

在这里插入图片描述

那么也就是数据源先存入缓存系统中,然后数据计算从缓存系统中取出去计算。

如果数据源产生数据的速度,比计算速度慢,那么产生过来的数据会及时的第一时间的被消费过去,那么在缓存中是没有数据的积压的,只是当作一个简单的中转。也就是将两个系统(数据源、数据计算)解耦。

可是一旦,数据源在某段时间产生速度的速率超过了计算的速率,那么也不至于像前面一样产生不可阻挡的问题,数据源依然可以正常的消费数据,数据计算依然的可以正常的去计算。只不过速度不一致,会在缓存系统中存在积压。但是只要累计的量不超过缓存系统总的存储量,那么这个系统还是能正常的工作。

缓存系统的要求:

  • 吞吐量要大
  • 读写要快
  • 轻量级(轻量级 和 吞吐量、读写速度成反比,不需要做额外的操作)

能够一想到的就是redis,但是redis的存储量小,而且很难控制数据的读写顺序,不能保证读写顺序的一致性。

实时计算中,基本计算模式是,数据源持续不断生成数据,计算系统持续不断处理数据(也就代表着数据源写入数据的顺序,要与计算系统读取数据的顺序保持一致)

(其它消息队列的缺点,对比kafka — 吞吐量)

kafka 为什么不直接叫做一个消息队列呢?

因为kafka是一个分布式的,必然会导致数据读写顺序的一个不完美。

数据写在kafka不是写在单机上,而是写在很多机器上,那么消费者去读的时候,无法保证读的顺序和写入的顺序是严格一致的。无法百分百确保数据读写的先后顺序是严格一致的。但是可以保证分区内的数据读写一致

在有些计算中,要保证全局的一致性是必须的选项,但是很多时候并不需要你的读写顺序完全一致。

如果真的要保证全局的一致的话,那么kafka有满足不了你的要求了。

主要要分数据类型,绝大多数任务都是统计,所以对数据的顺序一致性没那么关注。

换句话说,当需要绝对顺序一致性的情况,不需要考虑kafka。

如果非要保证绝对顺序一致性,那就将分布式的系统,退化成一个单机系统。把数据的分区数设置为1。

而一旦这样退化,还不如用RabbitMQ、RocketMQ呢(术业有专攻)

总的来讲,Kafka 通常具有 3 重角色:

**存储系统: **通常消息队列会把消息持久化到磁盘,防止消息丢失,保证消息可靠性。Kafka 的消息持久化机制和多副本机制使其能够作为通用数据存储系统来使用。

消息系统: Kafka 和传统的消息队列比如 RabbitMQ、RocketMQ、ActiveMQ 类似,支持流量削锋、服务解耦、异步通信等核心功能。

流处理平台: Kafka 不仅能够与大多数流式计算框架完美整合,并且自身也提供了一个完整的流式处理库,即 Kafka Streaming。Kafka Streaming 提供了类似 Flink 中的窗口、聚合、变换、连接等功能。

一句话概括:Kafka 是一个分布式的基于发布/订阅模式的消息中间件,在业界主要应用于大数据实时流式计算领域,起缓冲和削峰填谷的作用。

kafka的特点

**高吞吐量、低延迟: **kafka 每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个 topic 可以分多个 partition, 由多个 consumer group 对 partition

可扩展性: kafka 集群支持热扩展(系统部署上去了,将来发现数据源产生的速度已经超越了你之前部署的kafka所能容纳的最大的缓存量,这个时候还不想把整个系统停掉,那就在线扩容。)

大数据系统可以进行热扩容,加机器就好了。

但是像mysql,是不能动态的进行热扩容的,比如之前只有一台MySQL,发现不够,需要先停掉,修改配置,还需要进行分库分表,此时服务器1 和 服务器2互相不知道。需要上层的应用代码自己去搞定要查的数据在哪一个服务器,自己去路由选择查那个服务器。一旦这么写死了,将来又要扩容了,那么就会比较麻烦一点。

所以mysql本身是不能够去扩容的,一切都要人工去操作。人工分库分表放在不同的服务器上。很难去实现动态扩容。

而大数据设计出来就是分布式的

比如HBase里面,加机器后,将配置文件同步好,从节点会自动通知master,然后master会去做负载均衡,然后自己去做region的迁移,而且发生的变化对于上层的应用来说是完全无感的。数据在那个机器上不需要人工去做任何的调整,内部都会自动去协调。

持久性、可靠性: 消息被持久化到本地磁盘,并且支持数据备份防止数据丢失

容错性: 允许集群中有节点失败本质上就是会生成很多的task,如果task失败,允许重试)(若副本数量为 n,则允许 n-1 个节点失败)

高并发: 支持数千个客户端同时读写

kafka 系统的架构

在这里插入图片描述

首先kafka是用来存数据的,现实世界有数据分类,所以存储系统也应该有数据分类管理功能,如mysql的表、kafka有topic。如一个topic的数据全部交给一台Server存储和管理,则读写吞吐量有限,所以,一个 topic 的数据应该可以分成多个部分(partition)分别交给多台 server 存储和管理。如一台 server 宕机,这台 server 负责的 partition 将不可用,所以,一个 partition应该有多个副本(可以支撑高的数据吞吐量和数据的高可靠性。

比如说有一堆的生产者 和 消费者去读取topic,如果你的topic都在一台机器上,那么显然吞吐量不够,所以分割了很多的partition,放在不同的机器上,这样大量的生产者 和 消费者就可以去选择读取那个 partition,当你们读的是不同的partition的时候,相当于并行度就提高了。)

但是一个 partition 有多个副本,则副本间的数据一致性难以保证,因此要有一个 leader 统领读写,一个 leader 万一挂掉,则该 partition 又不可用,因此还要有 leader 的动态选举机制。

集群有哪些 topic,topic 有哪几个分区,server 在线情况,等等元信息和状态信息需要在集群内部及客户端之间共享,则引入了 zookeeper。

客户端在读取数据时,往往需要知道自己所读取到的位置,因而要引入消息偏移量维护机制。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java集合拓展01

1、List,Set,Map三者的区别 List:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和…

【Web】preg_match绕过相关例题wp

目录 ①[FBCTF 2019]rceservice ②[ctfshow]web130 ③[ctfshow]web131 ④[NISACTF 2022]middlerce 简单回顾一下基础 参考文章 p牛神文 preg_match绕过总的来讲就三块可利用 数组绕过、PCRE回溯次数限制、换行符 ①[FBCTF 2019]rceservice 先贴出附件给的源码 &l…

关于用css设置input输入框hover的时候的样式以及当input为disabled的时候,不要让hover样式生效

效果如果&#xff1a; 编辑状态下的时候&#xff1a; 只读状态下的时候&#xff1a; 代码如图&#xff1a; <input type"text" name"dataForm.exportCode" id"exportCodeItem" required :disabled"editDisabled" />input:not(…

SQL知多少?这篇文章让你从小白到入门

个人网站 本文首发公众号小肖学数据分析 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理和处理关系型数据库的编程语言。 对于想要成为数据分析师、数据库管理员或者Web开发人员的小白来说&#xff0c;学习SQL是一个很好的起点。 本文将为你提供一个…

实时错误’-2147217887‘多步OLB DB 操作产生错误。如果可能,请检查OLE DB状态值

目录 背景问题问题分析问题解决 错误解决与定位技巧总结 背景 仍旧是学生信息管理系统的问题&#xff0c;当时做的时候没发现这么多问题呢&#xff0c;只能说明一件事&#xff0c;做的时候没有站在用户的角度考虑需求&#xff0c;设置了什么内容&#xff0c;就按照设置好的去测…

【libGDX】使用Mesh绘制圆形

1 前言 使用Mesh绘制三角形 中介绍了绘制三角形的方法&#xff0c;使用Mesh绘制矩形 中介绍了绘制矩形的方法&#xff0c;本文将介绍绘制圆形的方法。 libGDX 以点、线段、三角形为图元&#xff0c;没有提供绘制圆形的接口。要绘制圆形边框&#xff0c;必须通过割圆法逼近圆形&…

防止恶意攻击,服务器DDoS防御软件科普

作为一种恶意的攻击方式&#xff0c;DDoS攻击正以超出服务器承受能力的流量淹没网站&#xff0c;让网站变得不可用。近几年&#xff0c;这种攻击持续增多&#xff0c;由此优秀服务器DDoS防御软件的需求也随之增长。那么如何选择服务器DDoS防御软件&#xff0c;从根本上根除DDoS…

八、ffmpeg录制视频为yuv文件

前言 测试环境&#xff1a; ffmpeg的4.3.2自行编译版本windows环境qt5.12 图片的一些重要知识&#xff1a; RGB图片 位深度&#xff1a;每一个像素都会使用n个二进制位来存储颜色信息。每一个像素的颜色都是由红&#xff08;Red&#xff09;、绿&#xff08;Green&#xff0…

系统移植-交叉编译工具链

不同架构的机器码 与 汇编语言 都不可移植&#xff0c; 且二者一一对应 c语言中三种成分&#xff1a; 1.分号结尾的叫做语句 语句可以让CPU执行&#xff0c;可以进行预处理&#xff0c;编译等生成机器码 2.#开头的为预处理指令 不带分号 CPU无法执行 3.注释&#xff0c;…

Dubbo从入门到上天系列第十八篇:Dubbo引入注册中心简介以及DubboAdmin简要介绍,为后续详解Dubbo各种注册中心做铺垫!

一&#xff1a;Dubbo注册中心引言 1&#xff1a;什么是Dubbo的注册中心&#xff1f; Dubbo注册中心是Dubbo服务治理中极其重要的一个概念。它主要是用于对Rpc集群应用实例进行管理。 对于我们的Dubbo服务来讲&#xff0c;至少有两部分构成&#xff0c;一部分是Provider一部分是…

专业pdf编辑工具PDF Expert mac中文版特点介绍

PDF Expert mac是一款专业的PDF编辑和阅读工具。它可以帮助用户在Mac、iPad和iPhone等设备上查看、注释、编辑、填写和签署PDF文档。 PDF Expert mac软件特点 PDF编辑&#xff1a;PDF Expert提供了丰富的PDF编辑功能&#xff0c;包括添加、删除、移动、旋转、缩放、裁剪等操作…

云原生入门系列(背景和驱动力)

做任何一件事&#xff0c;或者学习、应用一个领域的技术&#xff0c;莫过于先要想好阶段的目标和理解、学习它的意义是什么&#xff1f;解决了什么问题&#xff1f; 这部分&#xff0c;就尝试来探讨下这个阶段需要理解并达成的目标以及践行云原生的意义在哪里。 1.历程 任何阶…

Python 自动化测试如何动态的选择用例执行

问题 在做自动化测试时&#xff0c;往往需要根据任务的不同选择不同的用例集来执行。怎么优雅的来解决这个问题呢&#xff1f; 答案就是&#xff1a;pytest 框架的标记功能。 使用方法如下&#xff1a; 1. 注册标记 在项目根目录下创建 pytest.ini&#xff0c;在其中注册标…

nodejs微信小程序+python+PHP-储能电站运营管理系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

SSM之Mybatis框架

1 概述 1.1 什么是Mybayis 它是一款半自动的ORM持久层框架&#xff0c;具有较高的SQL灵活性&#xff0c;支持高级映射(一对一&#xff0c;一对多)&#xff0c;动态SQL&#xff0c;延迟加载和缓存等特性&#xff0c;但它的数据库无关性较低。 1.2 什么是ORM ORM&#xff08;…

《C++ Primer》第9章 顺序容器(三)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 9.5 额外的string操作&#xff08;P320&#xff09; 9.5.1 构造string的其他方法 const char *cp "hello, world!"; char arr[] { h,\0,i,\0 }; string s1(cp); // s1 "hello, world!…

基于STM32的数字图像处理与模式识别算法优化

基于STM32的数字图像处理与模式识别算法优化是一项涉及图像处理和机器学习领域的研究任务&#xff0c;旨在实现高效的图像处理和模式识别算法在STM32微控制器上的运行。本文将介绍基于STM32的数字图像处理与模式识别算法优化的原理和实现步骤&#xff0c;并提供相应的代码示例。…

网络运维与网络安全 学习笔记2023.11.22

网络运维与网络安全 学习笔记 第二十三天 今日目标 VLAN间通信之交换机、VLAN间通信综合案例、浮动路由 VRRP原理与配置、VRRP链路跟踪、VRRP安全认证 VLAN间通信之交换机 单臂路由的缺陷 在内网的VLAN数量增多时&#xff0c;单臂链路容易成为网络瓶颈 三层交换机 具备…

Linux 进程等待

在2号手册里查wait&#xff08;&#xff09;。wait()等待任意一个子进程的状态。 wait&#xff08;&#xff09;等待成功会返回该子进程的id,返回失败会返回-1&#xff1a; 小实验 子进程的退出码 子进程执行work()&#xff0c;父进程wait子进程。 子进程跑完5秒之后就e…

AIGC前沿技术与数字创新应用合作交流和论坛发布活动圆满落幕

2023年11月17日下午&#xff0c;AIGC前沿技术与数字创新应用合作交流和论坛发布活动在北京市海淀区牡丹科技楼B座B1报告厅成功举办。 在这个以技术为驱动力的时代&#xff0c;AIGC等这些前沿技术正以惊人的速度改变着我们的生活和产业格局。利用新兴技术和数字化工具来解决问题…