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.hqwc.cn/news/171131.html

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

相关文章

ubuntu16.04 交叉编译 mbedtls

在为客户交叉编译项目时需要依赖 mbedtls, 客户的机器是 arm64 的 ubuntu 16.04, 交叉编译过程中遇到几个问题。 首先, mbedtls 需要依赖 python, 在 cmake 的过程中, 如果不是使用系统默认的 cmake 可能会导致,mbedt…

【JavaEE】Servlet(创建Maven、引入依赖、创建目录、编写及打包、部署和验证、smart Tomcat)

一、什么是Servlet? Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app 1.1 Servlet能干什么? 🚕允许程序猿注册一个类, 在 Tomcat 收到某个特定的 HTTP 请求的时候, 执行这个类…

炸裂!Sklearn 的 10 个宝藏级使用方法!

大家好,本次给大家介绍10个Sklearn方法,比较小众但非常好用。 1️.FunctionTransformer 虽然Sklearn中有很多内置的预处理操作可以放进pipeline管道,但很多时候并不能满足我们的需求。 如果是比较简单并且通过一个函数可以实现需求的情况&…

CCLink转Modbus TCP网关_CCLINK参数配置

CCLink转Modbus TCP网关(XD-ETHCL20),具有CCLINK主从站功能。主要用途是将各种MODBUS-TCP设备接入到CCLINK总线中。它可以作为从站连接到CCLINK总线上,也可以作为主站或从站连接到MODBUS-MTP总线上。 1、 配置网关的CCLINK参数&am…

WebSphere Liberty 8.5.5.9 (一)

WebSphere Liberty 8.5.5.9 (一) 安装 1. 从官网下载 WebSphere Liberty 8.5.5.9 2. 解压 解压到 D:\wlp-webProfile7-java8-8.5.5.93. 启动 D:\wlp-webProfile7-java8-8.5.5.9\wlp\bin>server start 正在启动服务器 defaultServer。 服务器 defaultServer 已启动。4. …

【Linux】虚拟机连不上外网 (ping www.baidu.com不通)

进入linux系统,打开终端,ping www.baidu.com 发现ping不通 首先我连接的是nat模式 查看是否连接上自己本机的网 切换root用户 使用 ifconfig 命令查看是eth0 还是 ens33 vi /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTOstatic ONBOOTyes …

大厂设计师必备的8款Sketch插件

每个设计师都渴望有一个高效的插件来提高他们的设计能力。设计插件有助于自动化工作流程,快速组织设计文件或简化内容创建。Sketch可以说是设计师知名的设计工具,特别是其资源社区拥有丰富的Sketch插件,大大提高了设计师的工作效率。本文让设…

notes_质谱蛋白组学数据分析基础知识

目录 1. 蛋白组学方法学1.1 液相-质谱法1) 基本原理2) bottom-up策略的基本流程 1.2 PEA/Olink 2. 质谱数据分析2.1 原始数据格式2.2 分析过程1)鉴定搜索引擎(质谱组学)重难点/潜在的研究方向 2)定量3)预处理 2.3 下游…

Apache RocketMQ - 概述

2022年,RocketMQ 5.0的正式版发布,相比于4.0版本而言,架构走向云原生化,并且覆盖了更多的业务场景。 如何从互联网时代演进到云时代? 1. 消息队列演进史 操作系统、数据库、中间件是基础软件的三驾马车,…

win环境Jenkins高级配置各种插件和启动jar包

今天分享Jenkins高级配置各种插件,在看此篇之前必须先了解上一篇博客内容,因为此篇是在上篇的基础上完善的: 一、git仓库的多分支选择 想要多分支选择部署,需要全局安装Git parameter 插件 1、点击入口 来到 2、点击进入 安装一…

5. HTML常用标签

5.1 标签语义 学习标签是有技巧的&#xff0c;重点是记住每个标签的语义。简单理解就是指标签的含义。即这个标签是用来干嘛的。 根据标签的语义&#xff0c;在合适的地方给一个最为合理的标签。可以让页面结构给清晰。 5.2 标题标签 <h1>-<h6>(重要) HTML提供了…

Git详解及常用命令

前言 Git 是一个分布式版本控制系统&#xff0c;用于跟踪和管理项目的代码变化。它由Linus Torvalds在2005年创建&#xff0c;现在是开源社区中最流行的版本控制工具之一。 国内码云地址&#xff1a;工作台 - Gitee.com 版本控制系统 (VCS)&#xff1a;Git 用于跟踪文件和目录…