Kafka入门-程序员宅基地

技术标签: 自动化测试  kafka  软件测试  功能测试  职场和发展  分布式  程序人生  

kafka无疑是当今互联网公司使用最广泛的分布式实时消息流系统,它的高吞吐量,高可靠等特点为并发下的大批量实时请求处理提供了可靠保障。很多同学在项目中都用到过kafka,但是对kafka的设计原理以及处理机制并不是十分清楚。为了知其然知其所以然,本文主要从三个方面介绍kafka,第一,kafka简介以及适用场景,第二,kafka设计原理,三,常见问题及思考。

一、kafka简介及适用场景

**kafka官网上对 kafka 的定义:**一个分布式发布-订阅消息传递系统。主要特点包括高吞吐量、持久化(消息持久化到磁盘,支持批量和实时处理)、可扩展性、容错性。

kafka 相关术语:

Message(消息):基本数据单元(key-value形式)。为了提高效率,消息被分批次写入 kafka。批次就是一组消息,这些消息属于同一个Topic和Partition。

Topic(主题):每条消息都有一个类别,这个类别被称为 Topic。Topic类似于数据库的表或者一个文件夹,物理上不同 Topic 的消息分开存储。

Partition(分区):每个 Topic 包含一个或多个 Partition。Partition是物理概念,通常,一个Topic的消息被均匀地分发到每个partition,以追加的方式写入,先入先出的顺序读取。注:由于一个主题一般包含几个分区,因此无法在整个主题范围内保证消息的顺序,但可以保证消息在单个分区的顺序。

Offst(偏移量):单个分区中的每一条消息都被分配一个 Offset,它是一个单调递增的整型数,可用来作为分区中消息的唯一标识符。

Broker(缓存代理):kafka 集群包含一个或多个服务器,这种服务器被称为 broker。不维护任何消息的状态。

Producer(生产者):负责发布消息到 kafka broker。

Consumer(消费者):消息消费者,向 kafka broker 读取消息的客户端。

Consumer Group(消费组):每个 Consumer 属于一个特定的 Consumer Group。注:一个分区消息只能被一个Consumer Group中的一个Consumer消费。一个Consumer可以消费多个Topic的消息。每个Group中Consumer消息消费独立。具体理解见下图,第三部分的常见问题2给出了解释。

kafka使用场景

1)push发送

2)高吞吐量

3)可以作为大缓冲区使用

4)Hadoop或传统的数据仓库中存储消息用于离线分析

5)nginx日志收集

二、kafka设计原理

一个简单的kafka集群架构如下图所示

从图中可以看到,生产者将数据发送(push)到Broker代理,Broker代理有多个topic,消费者主动从Broker获取(pull)数据。为什么采取Broker拉去数据的方式,下面的思考问题会给出答案。在发送,拉去过程中kafka的一些机制如下。

1、Message-partition的分配机制

1)Key不为空时:对key进行hash后对分区数量取余运算,保证了同一个key会被分到同一个分区。

2)key为空,则进行轮询发送。

2、kafka 默认的消息保留策略

要么保留一段时间,要么保留到到消息达到一定大小的字节数。

**3、kafka消息处理机制 **

1) 发送到partitions中的消息将会按照它接收的顺序追加到日志中。

2)对于消费者而言,它们消费消息的顺序和日志中消息顺序一致。

3)如果Topic的“replication factor”(复制因子)为N,那么允许N-1个kafka实例失效,比如3副本的设置允许2个副本失效。

4)kafka提供at-least-once(至少一次) delivery,即当consumer宕机后,有些消息可能会被重复delivery。

5)因每个partition只会被consumer group内的一个consumer消费,故kafka保证每个partition内的消息会被顺序的消费。

6)ack校验,当消费者消费成功,返回ack信息。

三、常见问题及思考

1、为什么Broker为什么不主动推送消息,然后保存消息状态为已消费?

Broker推送消息的方式无法很好地保证消费的处理语义。比如当我们已经把消息发送给消费者之后,由于消费进程挂掉或者由于网络原因没有收到这条消息,如果我们在消费代理将其标记为已消费,这个消息就永久丢失了。kafka 采取拉取模型(pull),由自己控制消费速度,以及消费的进度,消费者可以按照任意的偏移量进行消费。比如消费者可以消费已经消费过的消息进行重新处理,或者消费最近的消息。

2、为什么一个分区消息只能被一个消费组中的一个消费者消费?

我们可以假设同一个消费组中的消费者1 已经消费了1-10,那么该分区的消费index 需要移动到10的位置。当同一个消费组中的消费者2希望消费10-20时,index再继续进行移动。

问题1我们已经了解了broker维护消息状态的以及索引的弊端。那么就需要在consumer端进行多个index维护,那么就得引入中心的概念,大家都在中心去获得当前的index,这会增加复杂性。因此,虽然牺牲了分区的分布式消费。但是因为可以有多个分区,也是一个比较合理的方案。

3、为什么发送了消息,接收端确没有收到消息?

a、确认发送方和接收方配置的topic是否一致;

b、确认发送方和接收方配置的kafka集群是否一致(jps命令查看集群是否启动)

c、确认发送方和接收方配置的是不是同一个partition;

d、查看时间戳的方式确认发送方的消息是否落入到kafka的日志中;

d.1没有落入相应partition的kafka日志中(即kafka没有接收到)

1)发送方是否有特殊配置,即一定量的消息才发送到kafka中(批量发送,可设置);

2)消息没有发送成功,消息格式不正确或者kafka发送工具问题;

d.2kafka日志中(即kafka没有接收到)

1)接收端offset设置有误,导致接收不到消息;

2)接收端拉取消息出现问题

四、总结

文本简述了kafka的简介以及原理,企业在实际使用中还会有很多新的挑战

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_71807218/article/details/137597312

智能推荐

Macbook安装Latex工具详细教程_mac安装latex-程序员宅基地

文章浏览阅读3.3k次,点赞6次,收藏23次。Index of /CTAN/systems/mac/mactex/ | 清华大学开源软件镜像站,致力于为国内和校内用户提供高质量的开源软件镜像、Linux 镜像源服务,帮助用户更方便地获取开源软件。Index of /CTAN/systems/mac/mactex/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror。1.安装Mactex用清华镜像安装更快,其中选择下图所示版本。2.安装Sublime Text。,安装后重启Sublime。_mac安装latex

华为云云耀云服务器L实例评测|搭建WordPress网站_云耀服务器可以创建网站吗-程序员宅基地

文章浏览阅读2w次,点赞56次,收藏49次。如今,云计算技术已经让云端建设变得更加容易,不再是高级技术人员的专利。通过本文所述的步骤,您可以轻松地在云服务器上搭建自己的网站或应用程序,而且成本非常低廉。从设置服务器密码到安装WordPress,每一步都是为了让您更好地利用云计算的便利性。所以,不要犹豫,开始您的云计算之旅吧!无论是个人博客、在线商店还是其他项目,云计算都可以为您提供可扩展、安全和高效的解决方案。让云端成为您的创意空间,让数字世界更加精彩。_云耀服务器可以创建网站吗

shell正则_shell 遍历路径正则-程序员宅基地

文章浏览阅读300次。http://blog.chinaunix.net/uid-25120309-id-3349691.html_shell 遍历路径正则

ffmpeg获取设备支持的分辨率_FFmpeg 基础知识-程序员宅基地

文章浏览阅读632次。FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用 LGPL 或 GPL 许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库 libavcodec。官方网站:http://www.ffmpeg.org/项目组成libavformat封装模块,封装了Protocol层和Demuxer、Muxer层,使得协议和格式对于..._ffmpeg读取分辨的库

OpenWRT编译 -- 静态编译驱动到内核中的方法_openwrt中添加驱动编译进内核-程序员宅基地

文章浏览阅读9.6k次。申明:小弟openwrt初学,很多东西都不知道,在偶然的机会用到openwrt,想要将自己写的驱动程序编译进内核中,费了九牛二虎之力,最终还是直接在内核源码中进行增加才搞定,过程尽可能的详细,也是自己的一个学习过程,也是给自己做一个笔记后面遇到可以借鉴。另外,第一次写博客,希望大家不喜勿喷哦,当然文档中有任何问题都欢迎能指出来,而且在过程中遇到了一个问题到现在没有找出为什么,希望大家看到了..._openwrt中添加驱动编译进内核

Unity2D 面向目标方向-程序员宅基地

文章浏览阅读1.7k次。在2d空间上,假设角色的自身的y轴方向为正方向,如果要让角色随时面向一个目标点。这里假设(0,0)点为目标点第一种:Vector3 v = Vector3.zero - transform.position; //首先获得目标方向 v.z = 0; ..._unity 2d中哪个方向是forward

随便推点

PHP中几种常见的超时处理全面总结_除了 file_get_contents 还有哪些能卡死进程-程序员宅基地

文章浏览阅读943次。在PHP开发中工作里非常多使用到超时处理到超时的场合,我说几个场景: 1. 异步获取数据如果某个后端数据源获取不成功则跳过,不影响整个页面展现 2. 为了保证Web服务器不会因为当个页面处理性能差而导致无法访问其他页面,则会对某些页面操作设置 3. 对于某些上传或者不确定处理时间的场合,则需要对整个流程中所有超时设置为无限,否则任何一个环节设置不当,都会导致莫名执行中断 4_除了 file_get_contents 还有哪些能卡死进程

【数学建模】元胞自动机-程序员宅基地

文章浏览阅读3.1k次,点赞55次,收藏63次。【数学建模】元胞自动机_元胞自动机

python 基因序列提取_Python + 生物信息 05 : 提取 CDS 等其他特征序列-程序员宅基地

文章浏览阅读1.4k次。1 介绍在基因结构分析或其他生物功能分析中会时常用到 CDS 序列,以及其他诸如 mRNA 序列,misc RNA序列等具有生物意义的序列片段。而NCBI 的基因库中已经包含有这些的信息,但是只有一部分是整理可下载的。而剩下的一部分可以通过 genbank给出的位点信息来提取,个人能力有限,这里只做抛转之用。下面以提取 CDS 为例,记录提取序列过程,其他特征序列类似。2 结构目录3 Python..._提取dna中cds序列

php 获取 mysql多行数据 存在数组中_mysql 将多行数据添加到数组-程序员宅基地

文章浏览阅读753次。个人习惯使用面向对象的方式来操作mysql。首先定义一个二维数组,用来存储结果。结果集取得一行就是一个数组,因为有多行数据,所以是二维。$data=array();这条代码$result->fetch_assoc()是: 从结果集中取得一行作为关联数组:那么就有:while($row = $result->fetch_assoc()){ array_push($data,$row);}不断从结果集读取数据,并将每行数据加到二维数组data中,直到读取完毕_mysql 将多行数据添加到数组

Python学习系列之zip函数_python in zip-程序员宅基地

文章浏览阅读677次。目录一、zip函数(内建函数)1.1 定义基本语法:参数说明:返回值:示例:1.2 处理列表1.3 处理元组 1.4 处理字典 1.5 处理一个参数和空列表一、zip函数(内建函数)1.1 定义 Python 2:zip() 函数用于将可迭代的对象(字典,列表,元组,集合,字符串等)作为参数,将对象中..._python in zip

探索网络攻防技术:自学之道_网络攻防自学-程序员宅基地

文章浏览阅读383次。网络攻防技术在不断演进,新的威胁和安全措施不断出现。因此,持续学习和跟进是至关重要的。订阅安全博客、参加安全研讨会、阅读最新的安全报告等方式,可以帮助你保持对新技术和趋势的了解。_网络攻防自学

推荐文章

热门文章

相关标签