探究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。

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

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

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

相关文章

Postman API Enterprise 10.18.1 Crack

适合您企业的 Postman API 平台 掌控您的 API 环境。构建更好的 API。加快产品开发。 无论您处于 API 之旅的哪个阶段,Postman 都会为您提供帮助 想让您团队的 API 更容易被发现吗?希望减少开发和质量检查之间的滞后时间?想要更快地让新开发…

在Spring Boot中使用ECharts绘制数据图表

使用ECharts来完成一些花里胡哨的图表吧,一般这种需求我们在我们的客户端不太常见,但是,我们在后端进行各种数据统计的时候就会发现ECharts的优点了,比如我们常常做的柱状图,折线图,雷达图等可视化形式&…

Mac M1 安装Docker打包arm64的python项目的镜像包

1、首先安装Docker,到官网下载,选择apple chip版 Docker中文网 官网 2、双击下载的dmg文件,在弹出框中之间拖拽到右边 3、打开docker,修改国内镜像源,位置在配置-DockerEngine "registry-mirrors": ["…

『亚马逊云科技产品测评』活动征文|AWS 数据库产品类别及其适用场景详细说明

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 目录 前言、AWS 数据库产品类别 01、Amazon Aurora 02、Amazon Docum…

基于STM32的手势识别算法研究与应用

基于STM32的手势识别算法在人机交互和智能设备控制中具有重要的应用价值。本文将介绍基于STM32的手势识别算法的研究原理和实现步骤,并提供相应的代码示例。 1. 手势识别概述 手势识别是一种通过分析人体的手部动作和姿势来识别和理解人的意图的技术。基于STM32的…

【PHP】PHP生成全年日历

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

5-8输出水仙花数

#include<stdio.h> int main(){int i,j,k;int n;for(n100;n<1000;n){in/100;jn/10-i*10;kn%10;if(ni*i*ij*j*jk*k*k)printf("%d ",n);}printf("\n");return 0; }

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

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

section header

section header table 是一个section header的集合&#xff0c;每个section header是一个描述section的结构体。在同一个ELF文件中&#xff0c;每个section header大小是相同的。 每个section都有一个section header描述它&#xff0c;但是一个section header可能在文件中没有…

云计算实验如何结合AI来提高效率!

随着AI助手的流行&#xff0c;我们现在无论是学习还是工作都会带着一个他/她&#xff0c;如何让AI助手提高我们的工作效率是我们需要进化的方向。下面结合“云计算实验”来分享一下如何让AI帮助我们学得更快学得更好。 一、学习某个软件或复杂命令 比如在学习RockyLinux9.2中…

Android Spannable 使用​注意事项

1、当前示例中间的 "评论"&#xff0c;使用SpannableStringBuilder实现&#xff0c;点击评论会有高亮效果加粗&#xff0c;但再点击其它Bar时无法恢复默认样式。 2、因为SpannableString或SpannableStringBuilder中的效果是叠加的&#xff0c;恢复默认样式需要先移除…

基于SSM的济南旅游网站设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

汽车级全保护型六路半桥驱动器NCV7708FDWR2G 原理、参数及应用

NCV7708FDWR2G 是一款全保护型六路半桥驱动器&#xff0c;特别适用于汽车和工业运动控制应用。六个高压侧和低压侧驱动器可自由配置&#xff0c;也可单独控制。因此可实现高压侧、低压侧和 H 桥控制。H 桥控制提供正向、逆向、制动和高阻抗状态。驱动器通过标准 SPI 接口进行控…

【Pytorch】Visualization of Fature Maps(2)

学习参考来自 使用CNN在MNIST上实现简单的攻击样本https://github.com/wmn7/ML_Practice/blob/master/2019_06_03/CNN_MNIST%E5%8F%AF%E8%A7%86%E5%8C%96.ipynb 文章目录 在 MNIST 上实现简单的攻击样本1 训练一个数字分类网络2 控制输出的概率, 看输入是什么3 让正确的图片分…

分类预测 | Matlab实现基于DBN-SVM深度置信网络-支持向量机的数据分类预测

分类预测 | Matlab实现基于DBN-SVM深度置信网络-支持向量机的数据分类预测 目录 分类预测 | Matlab实现基于DBN-SVM深度置信网络-支持向量机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.利用DBN进行特征提取&#xff0c;将提取后的特征放入SVM进行分类…

Cookie与Session

文章目录 Cookie的介绍Cookie的由来什么是CookieCookie原理Cookie覆盖浏览器查看Cookie 在Django中操作Cookie设置Cookie查询浏览器携带的Cookie删除Cookie Cookie校验登录session Cookie的介绍 Cookie的由来 首先我们都应该明白HTTP协议是无连接的。 无状态的意思是每次请求…

CSS特效016:天窗扬起合上的效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

虹科Pico汽车示波器 | 汽车免拆检修 | 2017款东风本田XR-V车转向助力左右不一致

一、故障现象 一辆2017款东风本田XR-V车&#xff0c;搭载R18ZA发动机&#xff0c;累计行驶里程约为4万km。车主反映&#xff0c;车辆行驶或静止时&#xff0c;向右侧转向比向左侧转向沉重。 二、故障诊断 接车后试车&#xff0c;起动发动机&#xff0c;组合仪表上无故障灯点亮&…

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

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

frp内网穿透配置以及相关端口、过程解释

介绍 假设现有外网笔记本、云服务器、内网工作站三台设备&#xff0c;希望使用外网笔记本通过云服务器转发&#xff0c;访问内网工作站&#xff1b;这里使用frp进行内网穿透。 云服务器端配置 登录腾讯轻量型云服务器控制台&#xff0c;开放转发端口、bind_port以及deshboad…