Kafka学习笔记1(千峰教育)

Kafka学习笔记1(千峰教育)

  • 一、为什么使用消息队列
    • 1.使用同步的通信方式来解决多个服务之间的通信
    • 2.使用异步的通信方式
  • 二、消息队列的流派
    • 1.有broker
    • 2.无broker
  • 三、Kafka的基本知识
    • 1.Kafk2a的安装
    • 2.Kafka中的一些基本概念
    • 3.创建topic
    • 4.发送消息
    • 5.消费消息
    • 6.关于消息的细节
    • 7.单播消息
    • 8.多播消息
    • 9.查看消费组的详细信息
  • 四、Kafka中主题和分区的概念
    • 1.主题Topic
    • 2.分区Partition
      • 1)分区的概念
      • 2)创建多分区的主题
    • 3.kafka中消息日志文件中保存的内容
  • 五、Kafka集群操作
    • 1.搭建kafka集群(三个broker)
    • 2.副本的概念
    • 3.关于集群消费
      • 1)向集群发送消息
      • 2)从集群消费消息
      • 3)指定消费组来消费消息
      • 4)分区分消费组的集群消费中的细节

一、为什么使用消息队列

1.使用同步的通信方式来解决多个服务之间的通信

在这里插入图片描述

同步的通信方式会存在性能和稳定性的问题。

2.使用异步的通信方式

在这里插入图片描述

针对于同步的通信方式来说,异步的方式,可以让上游快速成功,极大提高了系统的吞吐量。而且在分布式系统中,通过下游多个服务的分布式事务的保障,也能保障业务执行之后的最终一致性。

消息队列解决具体的是什么问题——通信问题。

二、消息队列的流派

目前消息队列的中间件选型有很多种:

  • rabbitMQ:内部的可玩性(功能性)是非常强的
  • rocketMQ:阿里内部一个大神,根据kafka的内部执行原理,手写的一个消息队列中间件。性能是与kafka比肩,除此之外,在功能上封装了更多的功能。
  • kafka:全球消息处理性能最快的一款MQ
  • zeroMQ

这些消息队列中间件有什么区别?

1.有broker

  • 重topic:kafka、RocketMQ、ActiveMQ

    整个broker,依据topic来进行消息的中转。在重topic的消息队列里必然需要topic的存在。

  • 轻topic:RabbitMQ

    topic只是一种中转模式。

2.无broker

在生产者和消费者之间没有使用broker,例如zeroMQ,直接使用socket进行通信。

三、Kafka的基本知识

1.Kafk2a的安装

  • 部署一台zookeeper服务器

  • 安装jdk

  • 下载kafka的安装包:https://kafka.apache.org/downloads

  • 上传kafka到服务器上:/user/local/kafka

  • 解压缩压缩包

  • 进入到config目录内,修改server.properties

    #broker.id属性在kafka集群中必须是要唯一
    broker.id=0
    #kafka部署的机器ip和提供服务的端口号
    listeners=PLAINTEXT://服务器IP:9092
    #kafka的消息存储文件
    log.dir=/usr/local/data/kafka-logs
    #kafka连接zookeeper的地址
    zookeeper.connect=服务器IP:2181
    
  • 进入到bin目录内,执行以下命令来启动kafka服务器(带着配置文件)

    ./kafka-server-start.sh -daemon ../config/server.properties
    
  • 校验kafka是否启动成功:

    进入到zk内查看是否有kafka的节点:brokers/ids/0

2.Kafka中的一些基本概念

kafka中有这么些复杂的概念

在这里插入图片描述

名称解释
Broker消息中间件处理节点,一个Kafka节点就是一个broker,一个或多个Broker可以组成一个Kafka集群
TopicKafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个topic
Producer消息生产者:向Broker发送消息的客户端
Consumer消息消费者:从Broker读取消息的客户端

3.创建topic

  • 通过kafka命令向zk中创建一个主题

    ./kafka-topics.sh --create --zookeeper ip:2181 --replication-factor 1 --partitions 1 --topic test
    
  • 查看当前zk中所有的主题

    ./kafka-topics.sh --list --zookeeper ip:2181
    test
    

4.发送消息

把消息发送给broker中的某个topic,打开一个kafka发送消息的客户端,然后开始用客户端向kafka服务器发送消息

./kafka-console-producer.sh --broker-list ip:9092 --topic test

5.消费消息

打开一个消费消息的客户端,向kafka服务器的某个主题消费信息

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

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

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

6.关于消息的细节

在这里插入图片描述

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

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

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

7.单播消息

在一个kafka的topic中,启动两个消费者,一个生产者。问:生产者发送消息,这条消息是否同时会被两个消费者消费?

如果多个消费者在同一个消费组,那么只有一个消费者可以收到订阅的topic中的消息。换言之,同一个消费组中只能有一个消费者收到一个topic中的消息。

./kafka-console-consumer.sh --bootstrap-server ip:9092 --consumer-property gropu.id=testGroup --topic test

8.多播消息

不同的消费组订阅同一个topic,那么不同的消费组中只有一个消费者能收到消息。实际上也是多个消费组中的多个消费者收到了同一个消息。

#消费组testGroup1
./kafka-console-consumer.sh --bootstrap-server ip:9092 --consumer-property gropu.id=testGroup1 --topic test
#消费组testGroup2
./kafka-console-consumer.sh --bootstrap-server ip:9092 --consumer-property gropu.id=testGroup2 --topic test

在这里插入图片描述

9.查看消费组的详细信息

通过以下命令可以查看到消费组的详细信息:

./kafka-consumer-groups.sh --bootstrap-server ip:9092 --describe --group testGroup

重点关注以下几个信息:

  • Currennt-offset:当前消费组的已消费偏移量
  • Log-end-offset:主题对应分区消息的结束偏移量(HW)
  • Lag:当前消费组未消费的消息数

四、Kafka中主题和分区的概念

1.主题Topic

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

但是有一个问题,如果说这个topic中的消息非常非常多,多到需要几T来存,因为消息是会保存到log日志文件中的。为了解决这个文件过大的问题,kafka提出了Partition分区的概念。

2.分区Partition

1)分区的概念

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

  • 分区存储,可以解决统一存储文件过大的问题。

  • 提供了读写的吞吐量,读和写可以同时在多个分区中进行。

    在这里插入图片描述

2)创建多分区的主题

./kafka-topics.sh --create --zookeeper ip:2181 --replication-factor 1 --partitions 2 --topic test1

3.kafka中消息日志文件中保存的内容

  • 00000.log:这个文件中保存的就是消息。

  • _consumer_offsets-49

    kafka内部自己创建了_consumer_offset主题包含了50个分区。这个主题用来存放消费者消费某个主题的偏移量,因为每个消费者都会自己维护消费的主题的偏移量,也就是说每个消费者会把消费的主题的偏移量自主上报给kafka中的默认主题:consumer_offsets。因为kafka为了提升这个主题的并发性,默认设置了50个分区。

    • 提交到哪个分区:通过hash函数确定:hash(consumerGroupId)%_consumer_offsets主题的分区数。
    • 提交到该主题中的内容是:key是consumerGroupId+topic+分区号,value就说当前offset的值。
  • 文件中保存的消息,默认保存7天,7天到后消息会被删除。

五、Kafka集群操作

1.搭建kafka集群(三个broker)

  • 创建三个server.properties文件

    # 0 1 2
    broker.id=2
    # 9092 9093 9094
    listeners=PLAINTEXT://192.168.65.60:9004
    # kafka-logs kafka-logs-1 kafka-logs-2
    log.dir=/usr/local/data/kafka-logs-2
    
  • 通过命令来启动三台broker

    ./kafka-server-start.sh -daemon ../config/server.properties
    ./kafka-server-start.sh -daemon ../config/server1.properties
    ./kafka-server-start.sh -daemon ../config/server2.properties
    
  • 校验是否启动成功

    进入到zk中查看/brokers/ids中是否有3个znode(0,1,2)

2.副本的概念

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

副本是为了给主题中的分区创建多个备份,多个副本在kafka集群的多个broker中,会有一个副本作为leader,其他是follower。

在这里插入图片描述

  • leader:kafka的写和读的操作都发生在leader上。leader负责把数据同步给follower。当leader挂了,经过主从 选举,从多个follower中选举产生一个新的leader。
  • follower:接受leader同步的数据。
  • isr:可以同步和已同步的节点会被存入到isr集合中。细节:如果isr中的节点性能比较差,会被踢出isr集合。

(重点~!)此时,broker、主题、分区、副本这些概念就全部展现了,大家需要把这些概念梳理清除:

集群中有多个broker,创建主题时可以指明主题有多个分区(把消息拆分到不同的分区中存储),可以为分区创建多个副本,不同的副本存放在不同的broker里。

3.关于集群消费

1)向集群发送消息

./kafka-console-producer.sh --broker-list ip1:9092,ip1:9093,ip1:9094 --topic my-replicated-topic

2)从集群消费消息

./kafka-console-consumer.sh --bootstrap-server ip1:9092,ip1:9093,ip1:9094 --from-beginning --topic my-replicated-topic

3)指定消费组来消费消息

./kafka-console-consumer.sh --bootstrap-server ip1:9092,ip1:9093,ip1:9094 --from-beginning --consumer-property group.id=testGroup1 --topic my-replicated-topic

4)分区分消费组的集群消费中的细节

在这里插入图片描述

  • 一个partition只能被一个消费组中的一个消费者消费,目的是为了保证消费的顺序性,但是多个partition的多个消费者消费的总的顺序性是得不到保证的,那怎么做到消费的总顺序性呢?
  • partition的数量决定了消费组中消费者的数量,建议同一个消费组中消费者的数量不要超过partition的数量,否则多个消费者没有消息消费。
  • 如果消费者挂了,那么会触发rebalance机制,会让其他消费者来消费该分区。

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

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

相关文章

通过讯飞 API 接口用 Vue 实现实时语音转写

通过讯飞 API 接口用 Vue 实现实时语音转写 项目地址 前言 本项目中实时语音能够转写的最大时间为 60 s, 这个数据也是由 API 提供方给限制掉的 为什么我会需要这个点击按钮以后能够实现实时语音的转写呢,因为被课程所迫,选了这个方向就必…

百度每天20%新增代码由AI生成,Comate SaaS服务8000家客户 采纳率超40%

12月28日,由深度学习技术及应用国家工程研究中心主办的WAVE SUMMIT深度学习开发者大会2023在北京召开。百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰现场公布了飞桨文心五载十届最新生态成果,文心一言最新用户规模破1亿,截…

Leetcode 763 划分字母区间

题意理解: 要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 输入&#xff…

【头歌实训】kafka-入门篇

文章目录 第1关:kafka - 初体验任务描述相关知识Kafka 简述Kafka 应用场景Kafka 架构组件kafka 常用命令 编程要求测试说明答案代码 第2关:生产者 (Producer ) - 简单模式任务描述相关知识Producer 简单模式Producer 的开发步骤Ka…

VS Code 运行 Python

介绍 Python: 是一种强大的编程语言,具有广泛的应用领域,可以用于开发 Web 应用、数据分析、人工智能、科学计算等多种领域。 VS Code: 是由微软开发的免费开源代码编辑器,可以在多个平台上运行。具有丰富的扩展功能…

每日一题--------求数字的每⼀位之和

大家好今天的每日一题又来了,有啥不对的请在评论区留言哦 文章目录 目录 文章目录 求数字的每⼀位之和 题⽬描述: 输⼊⼀个整数m,求这个整数m的每⼀位之和,并打印。 一、解题思路 我们可以通过不断获取该整数的个位数&#xff0c…

Python+OpenCV 零基础学习笔记(4-5):计算机图形基础+Python相对文件路径+OpenCV图像+OpenCV视频

文章目录 相关链接运行环境前言计算机图形OpenCV简单使用图形读取文件读取可能会出现的问题:路径不对解决方案其它路径问题解决方案 图像显示保存OpenCV视频视频素材如何获取?简单视频读取 相关链接 【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 …

python抽象基类之_subclasshook_方法

Python的鸭子特性(duck typing) Python中自定义的类只要实现了某种特殊的协议,就能赋予那种行为,举一个简单的例子: class A:def __len__(self):return 0 a A() print(len(a)) 如上所示,自己定义了一个类…

如何购买腾讯云的服务器(详解腾讯云服务器购买流程)

腾讯云服务器购买流程直接在官方秒杀活动上购买比较划算,在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵,但是自定义购买云服务器CPU内存带宽配置选择范围广,活动上购买只能选择固定的活动机,选择范围窄,但是…

YOLOv5-Lite 树莓派4B 15帧教程

【前言】 由于v5Lite仓库遗漏了不少历史问题,最大的问题是毕业后卷起来了,找不到时间更新。 上面是这篇博客的背景,那么先说下结论,使用 v5lite-e 模型,在 树莓派4B(4G内存) 上,有三…

PyTorch 进阶指南,10个必须知道的原则

PyTorch 是一种流行的深度学习框架,它提供了强大的工具和灵活的接口,使得开发者能够搭建和训练各种神经网络模型。这份指南旨在为开发者提供一些有用的原则,以帮助他们在PyTorch中编写高效、可维护和可扩展的代码。 如果你对 Pytorch 还处于…

树莓派界面改成中文

安装完树莓派系统(Raspberry Pi OS with Desktop),第一次启动时,时会有如下面二个图所示,让你选择区域时区和语言。 树莓派默认的语言为英文,如果你在安装时没有选择的话,默认的区域为英国,语言为英国英文&…

Python新手上路:“用Python和Pygame创造你的流星雨”

文章目录 一、前言二、下载安装过程1.官网下载安装包2.安装python过程第一步第二步第三步第四步第五步安装完成 3.简单测试Python3.1 检查 Python 版本号3.2 打开 Python 解释器3.3 输入你的第一个代码3.4 运行 Python 脚本 4.安装Pygame4.1 cmd命令安装Pygame4.2 pip升级4.3 安…

【C语言】程序练习(二)

大家好,这里是争做图书馆扫地僧的小白。 个人主页:争做图书馆扫地僧的小白_-CSDN博客 目标:希望通过学习技术,期待着改变世界。 目录 前言 一、运算符练习 1 算术运算符 1.1 练习题: 2 自加自减运算符 3 关系运…

Python列表数据处理全攻略(三):常用内置方法轻松掌握

文章目录 引言Python列表常用内置方法count()功能介绍语法示例注意事项 index()功能介绍语法示例注意事项: insert()功能介绍语法示例注意事项总结 结束语 引言 亲爱的读者,你好!Python的列表在数据结构中占据着核心地位,对于学习…

机器学习——损失函数

【说明】文章内容来自《机器学习——基于sklearn》,用于学习记录。若有争议联系删除。 1、简介 损失函数(loss function)又称为误差函数(error function),是衡量模型好坏的标准,用于估量模型的预测值与真实值的不一致程度,是一个…

java itext5 生成PDF并填充数据导出

java itext5 生成PDF并填充数据导出 依赖**文本勾选框****页眉**&#xff0c;**页脚****图片**实际图 主要功能有文本勾选框&#xff0c;页眉&#xff0c;页脚&#xff0c;图片等功能。肯定没有专业软件画的好看&#xff0c;只是一点儿方法。仅供参考。 依赖 <!--pdf-->&…

12.18构建哈夫曼树(优先队列),图的存储方式,一些细节(auto,pair用法,结构体指针)

为结构体自身时&#xff0c;用.调用成员变量&#xff1b;为结构体指针时&#xff0c;用->调用成员变量 所以存在结构体数组时&#xff0c;调用数组元素里的成员变量&#xff0c;就是要用. 结构体自身只有在new时才会创建出来&#xff0c;而其指针可以随意创建 在用new时&…

Android Security PIN 相关代码

开发项目遇到一个问题&#xff0c;具体描述及复制步骤如下&#xff1a; 就是开启"Enhanced PIN privacy"(增强的PIN隐私)的时候输入秘密的时候还是会显示数字 如下图&#xff0c;应该是直接是“.” 不应该出现PIN 密码 想要的效果如下图&#xff1a; 设置的步骤如下图…

RabbitMQ 和 Kafka 对比

本文对RabbitMQ 和 Kafka 进行下比较 文章目录 前言RabbitMQ架构队列消费队列生产 Kafka本文小结 前言 开源社区有好多优秀的队列中间件&#xff0c;比如RabbitMQ和Kafka&#xff0c;每个队列都貌似有其特性&#xff0c;在进行工程选择时&#xff0c;往往眼花缭乱&#xff0c;不…