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的简介以及原理,企业在实际使用中还会有很多新的挑战

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

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

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

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

相关文章

k8s-docker二进制(1.28)的搭建

二进制文件-docker方式 1、准备的服务器 角色ip组件k8s-master1192.168.11.111kube-apiserver,kube-controller-manager,kube-scheduler,etcdk8s-master2192.168.11.112kube-apiserver,kube-controller-manager,kube-scheduler,etcdk8s-node1192.168.11.113kubelet,kube-prox…

Presentation Prompter 5.4.2(mac屏幕提词器)

Presentation Prompter是一款演讲辅助屏幕提词器软件,旨在帮助演讲者在公共演讲、主持活动或录制视频时更加流畅地进行演讲。以下是Presentation Prompter的一些特色功能: 提供滚动或分页显示:可以将演讲稿以滚动或分页的形式显示在屏幕上&a…

client-go controller-runtime kubebuilder

背景 这半年一直做k8s相关的工作,一直接触client-go controller-runtime kubebuilder,但是很少有文章将这三个的区别说明白,直接用框架是简单,但是出了问题就是黑盒,这不符合我的理念,所以这篇文章从头说起…

【Android】画面卡顿优化列表流畅度三之RecyclerView刷新机制notifyItemRangeInserted

经过长达一个多星期的反复渲染耗时记录,大致上有以下几个方面的地方可以优化: 列表组件RecyclerView刷新机制由notifyDataSetChanged()优化为notifyItemRangeInserted(),后期有必要也会使用notifyItemRangeRemoved、n…

uniapp发行web页面在老版本浏览器打开一片空白

uniapp发行的web页面(菜单->发行->网站-PC Web或手机H5),对于一些老的浏览器(或内核),打开一片空白; 而在新版本的浏览器中打开却正常。这是因为那些版本较低的浏览器不支持ES6的语法和新…

mapboxGL中的底图切换

概述 底图切换,这么简单的功能还要写一篇文章?值得的,为什么这么说呢?因为mapboxGL的矢量底图有上百个,不同的底图用的样式、图层的名称、图层的内容、字体库、图标库都不一样,尤其是当地图上已经叠加了很…

vue 使用js new Map()优化多个if else 执行方法

前言 在实际开发中根据业务需求我们经常要判断情况,一个if 我们科技直接使用ES6就可以解决 经常会出现根据不同的条件执行不同的方法,这是就会有多个if else 看起不太美观也费劲 js new map ()就可以解决这个问题,它…

linux下搭建gperftools工具分析程序瓶颈

1. 先安装 unwind //使用root wget https://github.com/libunwind/libunwind/archive/v0.99.tar.gz tar -xvf v0.99.tar.gz cd libunwind-0.99 autoreconf --force -v --install ./configure make sudo make install2. 安装gperftools wget https://github.com/gp…

【无标题(PC+WAP)花卉租赁盆栽绿植类pbootcms站模板

(PCWAP)花卉租赁盆栽绿植类pbootcms网站模板 PbootCMS内核开发的网站模板,该模板适用于盆栽绿植网站等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可; PCWAP,同一个后台,数据即时同步&…

纯c语言模拟栈和队列(初学必看)

一、栈(Stack) 1.栈的概念及其结构 栈是一种特殊的线性表,在栈这个结构里,越先存进去的数据越难取出来。 这个结构就像是一个只有一端有打开的容器,越先放进去的球越在底部,想要把底部的球拿出来,就必须先把前面的求…

【Pytest】跳过执行之@pytest.mark.skip()详解

一、skip介绍及运用 在我们自动化测试过程中,经常会遇到功能阻塞、功能未实现、环境等一系列外部因素问题导致的一些用例执行不了,这时我们就可以用到跳过skip用例,如果我们注释掉或删除掉,后面还要进行恢复操作。 1、skip跳过成…

Spring IOC - Bean的生命周期之实例化

在Spring启动流程文章中讲到,容器的初始化是从refresh方法开始的,其在初始化的过程中会调用finishBeanFactoryInitialization方法。 而在该方法中则会调用DefaultListableBeanFactory#preInstantiateSingletons方法,该方法的核心作用是初始化…

元核云亮相金博会,智能质检助力金融合规

11月初,第五届中新(苏州)数字金融应用博览会|2023金融科技大会在苏州国际博览中心举办,围绕金融科技发展热点领域及金融行业信息科技领域重点工作,分享优秀实践经验,探讨数字化转型路径与未来发…

蓝桥杯每日一题2023.11.8

题目描述 题目分析 对于输入的abc我们可以以a为年也可以以c为年,将abc,cab,cba这三种情况进行判断合法性即可,注意需要排序去重,所以考虑使用set 此处为纯模拟的写法,但使用循环代码会更加简洁。 方法一: #include&…

物联网AI MicroPython学习之语法 network网络配置模块

学物联网,来万物简单IoT物联网!! network介绍 模块功能: 用于管理Wi-Fi和以太网的网络模块参考用法: import network import time nic network.WLAN(network.STA_IF) nic.active(True) if not nic.isconnected():…

SplayTree高分测试用例

测试用例结果展示 覆盖率 变异得分 测试注意点 从SplayTree测起,然后再测SubSplayTree,因为前者调用后者。SplaySubTree的remove方法大部分内容需要通过反射才能测到。value和index在SplayTree当中都不是唯一的。一个index可能对应多个value。 不足之…

【Maven教程】(十):使用 Hudson 进行持续集成—— 从Hudson的安装到任务创建 ~

Maven 使用 Hudson 进行持续集成 1️⃣ 持续集成的作用、过程和优势2️⃣ Hudson 简介与安装3️⃣ 准备 Subversion 仓库4️⃣ Hudson 的基本系统设置5️⃣ 创建 Hudson 任务5.1 Hudson 任务的基本配置5.2 Hudson 任务的源码仓库配置5.3 Hudson 任务的构建触发配置5.4 Hudson …

代码随想录 Day43 动态规划11 LeetCode T309 买卖股票的最佳时期含冷冻期 T714买卖股票的最佳时机含手续费

LeetCode T309 买卖股票的最佳时机含冷冻期 题目链接:309. 买卖股票的最佳时机含冷冻期 - 力扣(LeetCode) 题目思路: 这题其实就是将卖出的状态拆分成三个状态 1.前两天就卖出并一直保持卖出的状态 2.今天卖出的状态 3.今天是冷冻期的状态 当然还有一个…

Sprint Boot 学习路线 6

测试 Spring提供了一组测试工具,可以轻松地测试Spring应用程序的各个组件,包括控制器、服务、存储库和其他组件。它具有丰富的测试注释、实用程序类和其他功能,以帮助进行单元测试、集成测试等。 JPA测试 Spring JPA(Java Pers…

DBever连接PG库

一、简介 DBeaver是一种通用数据库管理工具,适用于需要以专业方式使用数据的每个人;适用于开发人员,数据库管理员,分析师和所有需要使用数据库的人员的 免费(DBeaver Community) 的多平台数据库工具,支持 Windows、Li…