kafka topic 一段时间不消费_全网最通俗易懂的 Kafka 入门

众所周知,消息队列的产品有好几种,这里我选择学习Kafka的原因,无他,公司在用。

我司使用的是Kafka和自研的消息队列(Kafka和RocketMQ)改版,于是我就想学学Kafka这款消息队列啦。本篇文章对Kafka入门,希望对大家有所帮助。

本文知识点提前预览:

eb32c330fbdea941c3c8c16306d6cf4c.png

这篇文章花了我很长时间画图,目的是希望以最通俗易懂的方式带大家入门,如果觉得不错,希望能给我点个赞

一、什么是Kafka?

首先我们得去官网看看是怎么介绍Kafka的:

  • https://kafka.apache.org/intro

在收集资料学习的时候,已经发现有不少的前辈对官网的介绍进行翻译和总结了,所以我这里就不重复了,贴下地址大家自行去学习啦:

  • https://scala.cool/2018/03/learning-kafka-1/

  • https://colobu.com/2014/08/06/kafka-quickstart/

要做一个消息队列可能要考虑到以下的问题:

  • 使用消息队列不可能是单机的(必然是分布式or集群)

  • 数据写到消息队列,可能会存在数据丢失问题,数据在消息队列需要持久化(磁盘?数据库?Redis?分布式文件系统?)

  • 想要保证消息(数据)是有序的,怎么做?

  • 为什么在消息队列中重复消费了数据

下面我以Kafka为例对这些问题进行简单的解答,进而入门Kafka。

1.1 Kafka入门

众所周知,Kafka是一个消息队列,把消息放到队列里边的叫生产者,从队列里边消费的叫消费者

1e6a6dafd89a3b4cc9463b871ece5f78.png

一个消息中间件,队列不单单只有一个,我们往往会有多个队列,而我们生产者和消费者就得知道:把数据丢给哪个队列,从哪个队列消息。我们需要给队列取名字,叫做topic(相当于数据库里边的概念)

83ad8f3e7282efe78c6b1a2c45cf628d.png

现在我们给队列取了名字以后,生产者就知道往哪个队列丢数据了,消费者也知道往哪个队列拿数据了。我们可以有多个生产者往同一个队列(topic)丢数据,多个消费者往同一个队列(topic)拿数据

97234c9c556242716343dfdf6480e06d.png

为了提高一个队列(topic)的吞吐量,Kafka会把topic进行分区(Partition)

0cc8df45fab3de4f23223beac69194c5.png

所以,生产者实际上是往一个topic名为Java3y中的分区(Partition)丢数据,消费者实际上是往一个topic名为Java3y的分区(Partition)取数据

c1cd996e8ec6f7d133ab6c7533531715.png

一台Kafka服务器叫做Broker,Kafka集群就是多台Kafka服务器:

4d41a5ad7cd9384aa2e72f1d9c6a2af2.png

一个topic会分为多个partition,实际上partition会分布在不同的broker中,举个例子:

0ed13ab5387eb2a4198fd1a433671a82.png

由此得知:Kafka是天然分布式的

现在我们已经知道了往topic里边丢数据,实际上这些数据会分到不同的partition上,这些partition存在不同的broker上。分布式肯定会带来问题:“万一其中一台broker(Kafka服务器)出现网络抖动或者挂了,怎么办?”

Kafka是这样做的:我们数据存在不同的partition上,那kafka就把这些partition做备份。比如,现在我们有三个partition,分别存在三台broker上。每个partition都会备份,这些备份散落在不同的broker上。

a779b83767098cb84cba50e7e6e431da.png

红色块的partition代表的是分区,紫色的partition块代表的是备份分区。生产者往topic丢数据,是与分区交互,消费者消费topic的数据,也是与主分区交互。

备份分区仅仅用作于备份,不做读写。如果某个Broker挂了,那就会选举出其他Broker的partition来作为主分区,这就实现了高可用

另外值得一提的是:当生产者把数据丢进topic时,我们知道是写在partition上的,那partition是怎么将其持久化的呢?(不持久化如果Broker中途挂了,那肯定会丢数据嘛)。

Kafka是将partition的数据写在磁盘的(消息日志),不过Kafka只允许追加写入(顺序访问),避免缓慢的随机 I/O 操作。

  • Kafka也不是partition一有数据就立马将数据写到磁盘上,它会先缓存一部分,等到足够多数据量或等待一定的时间再批量写入(flush)

上面balabala地都是讲生产者把数据丢进topic是怎么样的,下面来讲讲消费者是怎么消费的。既然数据是保存在partition中的,那么消费者实际上也是从partition中取数据。

5bcada866901fee57bf0cce036153ab2.png

生产者可以有多个,消费者也可以有多个。像上面图的情况,是一个消费者消费三个分区的数据。多个消费者可以组成一个消费者组

8e174d4a3e7974373b52032e81d99b7a.png

本来是一个消费者消费三个分区的,现在我们有消费者组,就可以每个消费者去消费一个分区(也是为了提高吞吐量)

649a09c906ee80dbbdd4d65029577656.png

按图上所示的情况,这里想要说明的是:

  • 如果消费者组中的某个消费者挂了,那么其中一个消费者可能就要消费两个partition了

  • 如果只有三个partition,而消费者组有4个消费者,那么一个消费者会空闲

  • 如果多加入一个消费者组,无论是新增的消费者组还是原本的消费者组,都能消费topic的全部数据。(消费者组之间从逻辑上它们是独立的)

前面讲解到了生产者往topic里丢数据是存在partition上的,而partition持久化到磁盘是IO顺序访问的,并且是先写缓存,隔一段时间或者数据量足够大的时候才批量写入磁盘的。

消费者在读的时候也很有讲究:正常的读磁盘数据是需要将内核态数据拷贝到用户态的,而Kafka 通过调用sendfile直接从内核空间(DMA的)到内核空间(Socket的),少做了一步拷贝的操作。

aa839a861708386b67b72c895a37061f.png

有的同学可能会产生疑问:消费者是怎么知道自己消费到哪里的呀?Kafka不是支持回溯吗?那是怎么做的呀?

  • 比如上面也提到:如果一个消费者组中的某个消费者挂了,那挂掉的消费者所消费的分区可能就由存活的消费者消费。那存活的消费者是需要知道挂掉的消费者消费到哪了,不然怎么玩。

这里要引出offset了,Kafka就是用offset来表示消费者的消费进度到哪了,每个消费者会都有自己的offset。说白了offset就是表示消费者的消费进度

在以前版本的Kafka,这个offset是由Zookeeper来管理的,后来Kafka开发者认为Zookeeper不合适大量的删改操作,于是把offset在broker以内部topic(__consumer_offsets)的方式来保存起来。

每次消费者消费的时候,都会提交这个offset,Kafka可以让你选择是自动提交还是手动提交。

既然提到了Zookeeper,那就多说一句。Zookeeper虽然在新版的Kafka中没有用作于保存客户端的offset,但是Zookeeper是Kafka一个重要的依赖。

  • 探测broker和consumer的添加或移除。

  • 负责维护所有partition的领导者/从属者关系(主分区和备份分区),如果主分区挂了,需要选举出备份分区作为主分区。

  • 维护topic、partition等元配置信息

  • ….

bb277aec50bae1c506da5d2762db9596.png

最后

通过这篇文章,文章开头那几个问题估计多多少少都懂一些啦。我来简要回答一下:

使用消息队列不可能是单机的(必然是分布式or集群)

Kafka天然是分布式的,往一个topic丢数据,实际上就是往多个broker的partition存储数据

数据写到消息队列,可能会存在数据丢失问题,数据在消息队列需要持久化(磁盘?数据库?Redis?分布式文件系统?)

Kafka会将partition以消息日志的方式(落磁盘)存储起来,通过 顺序访问IO和缓存(等到一定的量或时间)才真正把数据写到磁盘上,来提高速度。

想要保证消息(数据)是有序的,怎么做?

Kafka会将数据写到partition,单个partition的写入是有顺序的。如果要保证全局有序,那只能写入一个partition中。如果要消费也有序,消费者也只能有一个。

为什么在消息队列中重复消费了数据

凡是分布式就无法避免网络抖动/机器宕机等问题的发生,很有可能消费者A读取了数据,还没来得及消费,就挂掉了。Zookeeper发现消费者A挂了,让消费者B去消费原本消费者A的分区,等消费者A重连的时候,发现已经重复消费同一条数据了。(各种各样的情况,消费者超时等等都有可能…)

如果业务上不允许重复消费的问题,最好消费者那端做业务上的校验(如果已经消费过了,就不消费了)

这篇文章主要是Kafka入门,Kafka还涉及到别的概念,以及还有别的东西。在我感觉中,很多的面试题都跟配置有关,所以在解决某些问题的时候,先看看能不能通过现有配置解决掉(学多了框架,你就会发现很多官方的就已经支持解决了,你做的可能改改配置/参数就完事了)

【END】

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

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

相关文章

微型计算机技术及应用 考试,陕西理工学院微型计算机技术及应用考试试卷(5份)...

内容简介:陕西理工学院微型计算机技术及应用考试试卷1一、单项选择题。1、微型计算机中主要包括有( )。A、微处理器、存储器和I/O接口 B、微处理器、运算器和存储器C、控制器、运算器和寄存器组 D、微处理器、运算器和寄存器2、指令( )的源操作数的寻址方式为直接寻…

cups源码下载 linux_【正点原子FPGA连载】第九章Linux显示设备的使用-领航者ZYNQ之linux开发指南...

1)实验平台:正点原子领航者ZYNQ开发板2)平台购买地址:https://item.taobao.com/item.htm?&id6061601087613)全套实验源码手册视频下载地址:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.htm…

河北微型计算机原理专接本,河北省专接本(微机原理与接口技术知识点总结)

它们的差别在于对负数的表示。第一章概述(1)原码一、计算机中的数制定义:1、无符号数的表示方法:符号位:0 表示正,1 表示负;(1)十进制计数的表示法数值位:真值的绝对值。特点:以十为底&#xff…

java程序启动后就进行了7次younggc_程序员如何优化 Java GC

本文由CrowHawk翻译Sangmin Lee发表在Cubrid上的”Become a Java GC Expert”系列文章的第三篇《How to Tune Java Garbage Collection》,本文的作者是韩国人,写在JDK 1.8发布之前,虽然有些地方有些许过时,但整体内容还是非常有价值的。译者此…

html标签名都是小写,到底啥是w3c标准(示例代码)

W3C标准从两年前接触前端的时候,听说了 w3c 标准 ,是w3c(World Wide Web Consortium-世界万维网联盟)组织提出的web标准,印象中这个标准就是,行为(js)、样式(css)、结构(html),相分离。。。仅此而已一直也就是这么以为…

自加一运算_C语言i++、++i混合运算老手未必全掌握,看了你就明白了

C语言中的自增自减运算符(i、i--、i、--i)对于新手来说,通常感到困惑,说来容易算来难,如果涉及到混合运算,更是无法理解。甚至有些学了几年的老手,未必全掌握(也许你忽略了这个问题&…

西工大计算机学院交流,2017西工大计算机交流+精贵资料

我是今年考得西北工业大学计算机图像与语音处理方向,这一年的考研路走的实在艰辛西工大今年的专业课和以往有了很大的不同,首先就是名词解释的取消,网络和操作系统的难度增大,但如果你仔细研读了历年期末考试题,都能看…

rstp 转hls_将RTSP流转为浏览器播放

最近在工作中接触到了一个需求,需要在网页上进行摄像头的实施直播。经过研究,决定采用FFmpeg转RTSP为RTMP流,然后通过SRS转发为HLS流供浏览器播放。前提条件Linux服务器一台(用于搭建SRS环境)FFmpeg(用于讲RTSP流转为RTMP流)SRS(用于将RTMP流…

计算机网络运输层的概述,计算机网络_运输层

运输层协议概述从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时,只有位于网络…

ble 连接成功后找不到服务_闷声发大财的BLE芯片龙头

来源:内容由半导体行业观察(ID:icbank)原创,作者:邱丽婷,谢谢。你有多久没使用过蓝牙功能了?随着Wi-Fi和快传软件的普及,蓝牙(Bluethooth)这一每部…

计算机管理关机在哪,电脑点了关机为什么却关不了

近期,一些网友留言说明明电脑已经按照正常步骤关机,但显示屏却关了,但是主机似乎还在运行,这时该怎么办?针对此疑问,下面小编和大家详细说明一下电脑点了关机却关不了的处理方法,感兴趣的用户一…

foreach lambda写法_Java8新特性之forEach+Lambda 表达式遍历Map和List

这是Java8系列的第二篇&#xff0c;今天来说一下Java8中forEach的简单使用。我们使用对比的方式来看应该会看得更加清楚,更能理解&#xff1a;一、遍历MapJava8之前的方式Map items new HashMap<>();items.put("A", 10);items.put("B", 20);items.p…

吉大计算机学院刘淑芬,刘淑芬-吉林大学计算机科学与技术学院

学术论文&#xff1a;主要代表性学术论文&#xff1a;[1]Chi Meng, Liu Shufen, Hu Changhong. Self-adapting routing overlay network for frequently changing application traffic in content-based publish/subscribe system. Mathematical Problems in Engineering,2014 …

python与机械教育初探_Python公开课-机械学习之手写识别

授课讲师讲师尹强职务高级讲师、项目经理多年互联网开发经验与授课经验&#xff0c;曾参与某知名家具电商网站、车友商城、物流系统的开发设计&#xff0c;善于使用多种技术解决技术问题和优化网站的性能和提高网站速度&#xff0c;开发经验丰富。擅长学习方式的培养和锻炼&…

工业计算机远程控制,基于SOCKET技术的计算机远程控制实现

摘要&#xff1a;时至今日&#xff0c;计算机网络已经成为了人类社会生活中必不可少的组成部分&#xff0c;其中计算机的远程控制系统更是为整个社会的进步起到推动作用。除了在工业自动化生产之外&#xff0c;计算机远程控制系统还广泛的应用于办公、技术支持等方面。在本文中…

efi分区咋移动到c盘里_如何移动的EFI系统分区

如何安全找回丢失数据的方法1. 下载并安装B计划数据恢复软件。2. 运行恢复软件&#xff0c;点击“深度扫描”。深度扫描是绕过文件系统直接从硬盘、U盘、SD卡等设备底层恢复数据&#xff0c;因此使用深度恢复能找回更多完整数据。同时我们要搞清楚物理硬盘和逻辑硬盘的区别。物…

东北农业大学考研计算机大纲,东北农业大学(专业学位)计算机技术研究生考试科目和考研参考书目...

考研真题资料优惠价原价选择东北农业大学(专业学位)计算机技术教材&#xff0c;也叫东北农业大学(专业学位)计算机技术考研参考书、指定书目等等&#xff0c;是考验专业课复习过程中最重要的资料。考研是一种针对性很强的考试项目&#xff0c;参考书目由报考院校的研究生院制定…

matlab 功率谱密度 汉宁窗_[振动与测试 2] 什么是PSD(功率谱密度)

上接前章&#xff08;数字信号处理的基本概念&#xff09;&#xff0c;今天给大家介绍下振动测试中最常见的一个概念PSD&#xff0c;即所谓的功率谱密度&#xff08;Power Spectral Density&#xff09;,以及其与Autopower&#xff08;自功率谱&#xff09;的区别。自功率谱现在…

gsm模块网站服务器,gsm模块是什么_gsm模块工作原理_gsm模块的应用

描述gsm模块是什么GSM模块&#xff0c;是将GSM射频芯片、基带处理芯片、存储器、功放器件等集成在一块线路板上&#xff0c;具有独立的操作系统、GSM射频处理、基带处理并提供标准接口的功能模块。GSM模块具有发送SMS短信&#xff0c;语音通话&#xff0c;GPRS数据传输等基于GS…

exec go 重启_如何用 Go 实现热重启

热重启热重启(Zero Downtime)&#xff0c;指新老进程无缝切换&#xff0c;在替换过程中可保持对 client 的服务。原理父进程监听重启信号在收到重启信号后&#xff0c;父进程调用 fork &#xff0c;同时传递 socket 描述符给子进程子进程接收并监听父进程传递的 socket 描述符在…