【2023】kafka入门学习与使用(kafka-2)

目录💻

  • 一、基本介绍
    • 1、产生背景
    • 2、 消息队列介绍
      • 2.1、消息队列的本质作用
      • 2.2、消息队列的使用场景
      • 2.3、消息队列的两种模式
      • 2.4、消息队列选型:
  • 二、kafka组件
    • 1、核心组件概念
    • 2、架构
    • 3、基本使用
      • 3.1、消费消息
      • 3.2、单播和多播消息的实现
    • 4、主题和分区
      • 4.1、主题Topic
      • 4. 2、分区partition
      • 4.3、集群、副本、分区和topic的关联
      • 4.4、关于分区消费组消费者的细节
      • 4.5、kafka集群中的controller、rebalance、HW
  • 三、Kafka问题与优化方案
    • 1、如何防止消息丢失
    • 2、如何防止重复消费
    • 3、如何做到顺序消费
    • 4、解决消息积压问题
    • 5、实现延迟队列的效果

一、基本介绍

Kafka 是由 Linkedin 公司开发的,它是一个分布式的,支持多分区、多副本,基于 Zookeeper 的分布式消息流平台(2.8版本以后可以不需要依赖)。目前已经成为 Apache 软件基金会的顶级项目。它被设计用于处理大规模的实时数据流,并具有高吞吐量、低延迟、高可靠性和可扩展性等特点。

kafka如果还没安装的可以看下面的文章
🍅kafka-linux和docker安装

1、产生背景

Apache Kafka 的产生背景可以追溯到 LinkedIn 公司在处理大规模实时数据流时遇到的挑战。在过去,LinkedIn 需要处理大量的实时数据,例如用户活动、网站指标、日志记录等。为了应对这些数据的高吞吐量和低延迟需求,LinkedIn 开发了 Kafka 来解决以下几个主要问题:

  • 数据管道:LinkedIn 需要一种可靠的方式来收集和传输实时数据流,以支持各种数据处理和分析任务。

  • 数据持久性:对于一些重要的数据,LinkedIn 需要一种持久性存储方案,以便即使在系统故障或重启后,数据也不会丢失。

  • 扩展性:LinkedIn 面临着数据量不断增长的挑战,因此需要一种能够水平扩展的数据处理系统,以满足不断增长的需求。

  • 实时性:对于某些业务场景,LinkedIn 需要能够实时地处理和分析数据流,以及及时地发现和响应问题。

2、 消息队列介绍

2.1、消息队列的本质作用

消息队列:用于存放消息的一个组件

  • 消息队列最主要的作用其实是用于帮我们解决通信问题,通过内部封装,定义规范帮我们实现简单异步通信;
  • 消息队列一般也被用作临时处理信息的一个组件;

2.2、消息队列的使用场景

  1. 系统解藕:降低两个系统之间的直接耦合度
  2. 流量削峰:大量大流量到来通过消息队列循序渐进的取出,避免这些流量全部直接到达数据库
  3. 日志处理(大数据领域常用)
  4. 异步处理:相对于同步通行来说,异步的发生,可以让上游快速成功,极大提高了系统的吞吐量。而且在分布式系统中,通过下游多个服务的分布式事务的保障,也能保障业务执行之后的最终一致性
    在这里插入图片描述

2.3、消息队列的两种模式

分类方式一:

  • 点对点模式
    • 一对一
  • 发布订阅模式
    • 一个生产者生产消息,多个订阅该主题的消费者可以获取到消息

分类方式二:

  • 有Broker:
    • 重Topic:Kafka、RocketMQ、ActiveMQ
      • 整个broker,依据topic来进行消息的中转,在重topic的消息队列里必然需要topic来实现
    • 轻Topic:RabbitMQ
      • topic只是一种中转模式
  • 无Broker:
    • 在生产者和消费者之间没有broker,例如zeroMQ,直接使用socket进行通信
      在这里插入图片描述

2.4、消息队列选型:

  • rabbitMQ:内部的可玩性(功能性)是非常强的,但不是分布式的消息队列
  • rocketMQ:阿里出品,根据kafka的内部执行原理,手写的一个消息中间件,性能可以和kafka相比肩
  • kafka:全球消息处理性能最快的一款MQ
  • zeroMQ:ZeroMQ 是一款更加轻量级和灵活,适用于构建简单而高效的分布式和并发应用程序,无需中心化的消息代理。

二、kafka组件

1、核心组件概念

名称解释
Broker(节点)消息中间件处理节点,一个kafka节点就是一个broker,一个或者多个Broker可以组成一个kafka集群
Topic(主题)kafka根据topic对消息归类,发布到kafka集群的每条消息都需要指定一个topic
Producer(生产者)消息生产者,向Broker发送消息的客户端
Consumer(消费者)消息消费者,从Broker读取消息的客户端
ConsumerGroup每个consumer属于一个特定的Consumer Group,一条消息可以被多个不同的Consumer Group消费,但是一个Consumer Group中只能有一个Consumer能够消费该消息(最后连接的那一个Consumer)
Partition(分区)物理上的概念,一个topic可以分为多个partition,每个partition内部消息是有序的
offset(偏移量)消费者消费到的下标位置

基础组件图
在这里插入图片描述

2、架构

Kafka 的架构主要由以下几个核心组件组成:

  • Producer(生产者):负责将消息发布到 Kafka 集群中的主题(topic)。
  • Broker(代理):Kafka 集群中的每个节点都是一个代理,用于存储和管理消息。
  • Topic(主题):消息被发布到特定的主题中,每个主题可以分成多个分区(partition)。
  • Partition(分区):每个主题可以分成多个分区,每个分区在物理上都是一个独立的日志文件。
  • Consumer Group(消费者组):消费者组由一组消费者组成,每个消费者都从特定的分区中读取消息。
  • ZooKeeper:Kafka 使用 ZooKeeper 进行集群管理和协调,用于领导者选举、存储集群元数据等。

3、基本使用

3.1、消费消息

  • 方式一:从当前主题中的最后一条消息的offset(偏移量位置)+1开始消费

    ./kafka-console-consumer.sh --bootstrap-server ip:port --topic test
    
  • 方式二:从当前主题中的第一条消息开始消费

    ./kafka-console-consumer.sh --bootstrap-server ip:port --from-beginning --topic test
    

物理层面存储流程图
在这里插入图片描述

物理存储消费流程

  • 生产者将消息发送给broker,broker会将消息保存在本地的日志文件中

    • kafka-logs/主题-分区/00000000.log
  • 消息的保存是有序的,通过offset偏移量来描述消息的有序性

  • 消费者消费消息时也是通过offset来描述当前要消费的那条消息的位置

3.2、单播和多播消息的实现

  • 单播消息:在一个kafka中一个topic只有一个消费组订阅
  • 多播消息:在一个kafka中一个topic中有多个消费组订阅

在这里插入图片描述

4、主题和分区

4.1、主题Topic

主题-topic44在kafka中是一个逻辑的概念,kafka通过topic将消息就行分类。不同的topic会被订阅该topic的消费者消费。

所以就会出现一个问题,消息可能会非常多,多到需要几T来存,因为消息是会被保存到log日志文件中的,为了解决这个文件过大的问题,kafka提出了partition分区的概念

4. 2、分区partition

  1. 分区的概念

通过partition将一个topic中的消息分区来存储。这样的好处有:

  • 分区存储,可以解决统一存储文件过大的问题
  • 提供了读写的吞吐量:读和写可以同时在多个分区进行(并行读写)

在这里插入图片描述

  1. 创建多分区的主题
./kafka-topics.sh --create --zookeeper 192.168.8.62:3333 --replication-factor 1 --partitions 2 --topic my-replicated-topic2
  1. kafka中消息日志文件中保存的内容
  • 00000.log:这个文件中保存的就是消息数据

  • *consumer*offsets-49:

    kafka内部自己创建了*consumer*offsets主题包含了50个分区。这个主题用来存放消费者消费某个主题的偏移量。因为每个消费者都会自己维护着消费的主题的偏移量,也就是说每个消费者会把消费的主题的偏移量自主上报给kafka的默认主题:

    *consumer_*offsets。为了提高并发性设置了50个主题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.3、集群、副本、分区和topic的关联

在创建主题时,除了指明主题的分区数以外,还指明了福本数,那么副本是一个什么概念?

  • 副本为了为主题中的分区创建多个备份,多个副本在kafka集群中,会有一个副本为leader,其他是follower
  • leader:用作接收发送消息,并且负责把数据同步给follower,当leader挂了之后,会从follower中选举产生一个新的leader
  • follower:普通的partition
  • Isr:可以同步会已经、同步的节点会被存入到isr集合中。如果isr中的节点性能较差,会被剔出isr集合

在这里插入图片描述

4.4、关于分区消费组消费者的细节

在这里插入图片描述

  • 一个partiton只能被一个消费组中的一个消费者消费
  • partition的数量决定了消费组中消费的数量,建议同一个消费组中的消费者的数量不要超过partition的数量,否则多的消费者消费不到消息
  • 如果消费者挂了,那么会触发redalance机制,会让消费组中的其他消费者来消费该分区

4.5、kafka集群中的controller、rebalance、HW

  • controller(控制器):每个brocker启动时会向zk创建一个临时序号节点,获得的序号最小的那个brroker将会作为集群中的controller,负责下面几件事情:

    • 当集群中有一个副本的leader挂掉,需要在集群中选举出一个新的leaber,选举的规则是从isr集合中最左边获得
    • 当集群中有broker新增或者减少,controller会同步信息给其他broker
    • 当集群中有分区新增或者减少,controller会同步信息给其他broker
  • rebalance机制:

    • 前提:消费组中的消费者没有指定分区
    • 触发的条件:当消费组中的消费者和分区的关系发生变化的时候
    • 分区分配的策略:在rebalance之前,分区怎么分配会有这么三种策略
      • range:根据公式计算得到每个消费者消费哪个分区:前面的消费者是分区总数/消费者数量+1最后的消费者是分区总数/消费者数量
      • 轮训:大家轮着来
      • sticky:粘合策略,如果需要rebalance,会在之前已分配的基础上调整,不会改变之前的分配情况。如果这个策略没有开,那么就要进行全部的重新分配。建议开启

    在这里插入图片描述

  • HW和LEO:

    • LEO:LEO是每个副本最后消息的消息位置(log-end-offset)
    • HW:HW是已完成同步的位置,消息在写入broker时,且每个broker完成这条消息的同步后,hw才会发生变化往后移动。在这之前消费者是消费不到LEO位置的消息的,在同步全部完成之后,HW就会更新,更新之后,消费者才能消费到最新的这条消息,这样的目的主要是为了防止消息丢失。

    在这里插入图片描述

三、Kafka问题与优化方案

1、如何防止消息丢失

  • 生产者:
    • 使用同步发送
    • 把ack设置成1或者all,并且设置同步的分区数≥2
  • 消费者:
    • 把自动提交改为手动提交

2、如何防止重复消费

在防止消息丢失的方案中,如果发送者发送完消息后,因为网络抖动,没有收到ack,但实际上broker已经收到了。此时生产者会进行重试,于是broker就会收到多条相同的消息,而造成消费者的重复消费

解决办法:

  • 生产者关闭重试:会造成丢消息(不建议)
  • 消费者解决非幂等性消费问题:
    所谓的幂等性:多次访问的结果是一样的。对于rest的请求(ge(幂等)、post(非幂等)、put(幂等))
    • 在数据库中创建联合主键,防止相同的主键创建出多条记录
    • 使用分布式锁,以业务id为锁保证只有一条记录能够创建成功

在这里插入图片描述

3、如何做到顺序消费

  • 生产者:保证消息按顺序消费,且消息不丢失一一使用同步的发送,ack设置成非0的值。
  • 消费者:主题只能设置一个分区,消费组只能有一个消费者

4、解决消息积压问题

  • 消息积压问题的出现
    • 消息的消费者的消费速度远赶不上生产者的生产消息的速度,导致kafka中有大量的数据没有被消费,随着没有被消费的数据堆积越多,消费者寻址的性能会越来越差,最后导致整个kafka对外提供的服务的性能很差,从而造成其他服务也访问速度变慢,造成服务雪崩。
  • 消息挤压的解决方案
    • 在这个消费者中,使用多线程,充分利用机器的性能进行消费消息。
    • 创建多个消费组,多个消费者,部署到其他机器,一起消费,提高消费者的消费速度
    • 创建一个消费者,该消费者在kafka另建一个主题,配上多个分区,多个分区再配上多个消费者。该消费者将poll下来的消息,不进行消费,直接转发到新建的主题上,此时,新的主题的多个分区的多个消费者就开始一起消费了。 ———不常用

在这里插入图片描述

5、实现延迟队列的效果

  • 应用场景

    订单创建后,超过30分钟没有支付,取消订单

  • 具体方案

    1. kafka中创建相应的主题
    2. 消费者消费该主题的消息(轮训)
    3. 消费者消费消息时判断消息的创建时间和当前时间是否超过30分钟(前提是订单没支付)
      1. 如果是:去数据库中修改订单为已取消
      2. 如果否:记录当前消息的offset,并不再继续消费之后的消息。等待1分钟后,再次向kafka拉取该offset及之后的消息,继续进行判断,以此反复

在这里插入图片描述

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

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

相关文章

阿里云2核4G服务器租用价格_30元3个月_165元一年_199元

阿里云2核4G服务器租用优惠价格,轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月,活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图: 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

智慧城市数字孪生,综合治理一屏统览

现代城市作为一个复杂系统,牵一发而动全身,城市化进程中产生新的矛盾和社会问题都会影响整个城市系统的正常运转。智慧城市是应对这些问题的策略之一。城市工作要树立系统思维,从构成城市诸多要素、结构、功能等方面入手,系统推进…

Python面对对象 - 类的反射机制

Python面对对象类的反射机制是面向对象编程语言中比较重要的功能,可以动态获取对象信息以及动态调用对象。通过字符串形式的类名或属性来访问对应类或属性。 一、对象的反射 1. getattr 获取指定字符串名称的对象属性、方法: 当访问的属性不存在时&#…

微服务(基础篇-007-RabbitMQ)

目录 初识MQ(1) 同步通讯(1.1) 异步通讯(1.2) MQ常见框架(1.3) RabbitMQ快速入门(2) RabbitMQ概述和安装(2.1) 常见消息模型(2.2) 快速入门&#xff…

分布式理论:CAP理论 BASE理论

文章目录 1. CAP定理1.1 一致性1.3 分区容错1.4 矛盾 2. BASE理论3. 解决分布式事务的思路4. 扩展 解决分布式事务问题,需要一些分布式系统的基础知识作为理论指导。 1. CAP定理 Consistency(一致性): 用户访问分布式系统中的任意节点,得到的数据必须一…

【opencv】教程代码 —features2D(2)

使用SURF算法检测两幅图关键点后暴力匹配 SURF特征检测 使用SURF(Speeded Up Robust Features)算法来检测两张图像之间的关键点,并使用FLANN(Fast Library for Approximate Nearest Neighbors)基于特征描述符向量进行匹…

Windows中忘记MySQL ROOT密码的解决方法

在需要ROOT身份登录MySQL但又忘记密码时,可以先已管理员身份运行cmd命令窗口,输入以下命令停止MySQL服务 net stop mysql 随后cd到MySQL安装目录下的bin目录下 D: //我的安装在D盘 cd D:\MySQL\bin 使用跳过权限验证的方式起启动MySQL mysqld --console --skip-g…

跨境电商IP防关联是什么?有什么作用?

做跨境电商的朋友应该都知道IP防关联这个词,那么为何IP需要防关联呢?今天为大家来解答这个问题。 跨境电商IP防关联是指在跨境电商运营中,通过采取一系列技术手段,确保每个跨境电商账号使用独立的IP地址,以避免账号之间因为IP地址…

搜索与图论——Kruskal算法求最小生成树

kruskal算法相比prim算法思路简单,不用处理边界问题,不用堆优化,所以一般稀疏图都用Kruskal。 Kruskal算法时间复杂度O(mlogm) 每条边存结构体里,排序需要在结构体里重载小于号 判断a,b点是否连通以及将点假如集合中…

Linux重点思考(下)--shell脚本使用以及内核开发

Linux重点思考(下)--shell脚本使用和组合拳 shell脚本的基础算法shell脚本写123...n的值,说思路Shell 脚本用于执行服务器性能测试的死循环Shell 脚本备份和定时清理垃圾文件 shell脚本的内核开发正向映射反向映射 shell脚本的基础算法 shell脚本写123……

link 样式表是否会阻塞页面内容的展示?取决于浏览器,edge 和 chrome 会,但 firefox 不会。

经过实测: 在 head 中 link 一个 1M 大小的样式表。设置网络下载时间大概为 10 秒。 edge 和 chrome 只有在下载完样式表后,页面上才会出现内容。而 firefox 可以直接先显示内容,然后等待样式表下载完成后再应用样式。 DOMContentLoaded 事…

vue系统——v-html

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>v-html指令</title> </head> <body&…

OSPF基本原理和概念

文章目录 背景知识OSPF协议概述&#xff1a;OSPF区域的表示OSPF 骨干区域 –区域0OSPF 非骨干区域 -非0区域OSPF的五种区域类型OSPF工作原理OSPF 的报文类型OSPF邻居表中的七个状态 总结 背景知识 一台路由设备如何获取其他网段的路由&#xff0c;并加入到路由表中 直连路由 …

虚拟机 centos 安装后与主机 ip保持一致

1、安装时 网络模式 悬着自动检测 &#xff08;桥接&#xff09; 2、打开网络 这里如果没有打开 就去 编辑 该文件。把ONBOOTno 改为yes 后 vim /etc/sysconfig/network-scripts/ifcfg-ens160 刷新配置 systemctl restart network 再查看addr 与本机 192.168.31.xx 在同…

Java23种常见设计模式汇总

七大原则网站地址&#xff1a;设计模式7大原则&#xff0b;类图关系-CSDN博客 创建型设计模式&#xff1a;创建型设计模式合集-CSDN博客 七大结构型设计模式&#xff1a;7大结构型设计模式-CSDN博客 11种行为型设计模式&#xff1a; 11种行为型模式&#xff08;上&#xff0…

设计模式之装饰模式精讲

概念&#xff1a;动态地给一个对象添加一些额外的职责。 装饰器模式侧重于在不改变接口的前提下动态地给对象添加新功能&#xff0c;保持对象结构的透明性&#xff0c;客户端无感知。 以一个咖啡制作和装饰的例子来帮助大家理解&#xff1a; public interface Coffee {double…

基于单片机GPS轨迹定位和里程统计系统

**单片机设计介绍&#xff0c;基于单片机GPS轨迹定位和里程统计系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机GPS轨迹定位和里程统计系统是一个集成了GPS定位技术、单片机控制以及里程统计功能的综合性系统。该系…

五、postman基础使用案例

postman基础使用 相关案例【传递查询参数】【提交表单数据】【提交JSON数据】 注&#xff1a;postman⼀款⽀持调试和测试的⼯具&#xff0c;开发、测试⼯程师都可以使⽤。方法一般统一为&#xff1a;方法→请求头→请求体→断言 相关案例 【传递查询参数】 访问TPshop搜索商品的…

EXCEL 通过FILES函数获取指定路径中的所有文件名

FILES函数 用途 获取指定文件路径中的所有文件名。 语法 FILES(“路径\*.*”)指定从哪个路径下返回一个文件名。 *.*是通配符&#xff0c;代表所有类型的文件&#xff0c;第一个*是文件名的通配符&#xff0c;第二个* 是文件的后缀名&#xff0c;表示文件类型&#xff0c;如…

【详解】运算放大器工作原理及其在信号处理中的核心作用

什么是运算放大器 运算放大器&#xff08;简称“运放”&#xff09;是一种放大倍数非常高的电路单元。在实际电路中&#xff0c;它常常与反馈网络一起组成一定的功能模块。它是一种带有特殊耦合电路和反馈的放大器。输出信号可以是输入信号的加法、减法、微分和积分等数学运算…