Kafka架构组成及相关内容

news2024/9/21 12:34:15

        • 0. 主要参考:
        • 1. Kafka基础架构组成:
        • 2. Kafka的一些操作命令:
        • 3. Kafka 生产者消息发送流程:
        • 4. Kafka 的ack机制:
        • 5. Kafka 生产者消息发送模式(同步/异步):
        • 6. Kafka发送消息的分区策略:
        • 7. Kafka消息发送可靠性保证(消息不丢失):
        • 8. Kafka消息发送去重:
          • 8.1. 幂等性:
          • 8.2. 生产者事务:
        • 9. Kafka的有序消息保证:
        • 10. Kafka提高生产者吞吐量:

主流的消息队列有:ActiveMQ、RabbitMQ、RocketMQ、Kafka;主要应用场景是解耦、异步、消峰;可以参考链接

0. 主要参考:

 https://www.bilibili.com/video/BV1vr4y1677k

1. Kafka基础架构组成:

主要由生产者(组)、Broke、消费者(组)、Topic主题、Partition分区 、Replica副本(Leader副本、Follower副本)

在这里插入图片描述

【架构组成】:

  • Broker:一台 Kafka 服务器就是一个 broker,Kafka集群就会有多个 broker
  • Producer:消息生产者,就是向 broker 发消息的客户端
  • Consumer:消息消费者,就是向 broker 取消息的客户端
  • Topic:每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic
  • Partition:一个 Topic 可以分为多个 partition分区,每个 partition 是一个有序的队列,可以分布到多个 broker上
  • Replica:每个分区有多个副本,每个分区都有一个Leader副本和若干Follower副本
    `

【消费者组-主题关系】:

  • 消费者组由多个消费者组成,每一个消费者订阅的同一个Topic
  • 一个消费者可以消费多个分区但一个分区只能被一个消费者组的消费者消费,此外消费者组之间互不影响;
    `

【Topic主题-Partition分区-Replica副本关系】:

  • 一个Topic有多个Partition,每个分区有多个副本,如上图,一个TopicA有2个分区,三个副本,其中Broke1的分区0是主副本,其他的为从副本

2. Kafka的一些操作命令:

2.1.【启动】

  • sh kafka-server-start.sh -daemon …/config/server.properties
    ·

2.2.【创建Topic】

  • bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --partitions 1 --replication-factor 1 --topic first
    ·
    选项说明:
    – topic 定义 topic 名
    –replication-factor 定义副本
    –partitions 定义分区数

    ·

2.3.【启动生产者】

  • bin/kafka-console-producer.sh --bootstrap-server 192.169.182.128:9092 --topic first
    ·

2.4.【启动消费者者消费主题】

  • bin/kafka-console-consumer.sh --bootstrap-server 192.169.182.128:9092 --topic first
    ·

2.5.【启动消费者者消费主题,包括历史数据】

  • bin/kafka-console-consumer.sh --bootstrap-server 192.169.182.128:9092 --from-beginning --topic first
    ·

2.6. 【查看当前服务器中的所有 Topic】

  • bin/kafka-topics.sh --bootstrap-server 192.169.182.128:9092 --list
    `

2.7. 【查看 first 主题的详情】

  • bin/kafka-topics.sh --bootstrap-server 192.169.182.128:9092 --describe --topic first
    ·

2.8.【修改分区数(注意:分区数只能增加,不能减少)】

  • bin/kafka-topics.sh --bootstrap-server 192.169.182.128:9092 --alter --topic first --partitions 3
    ·

2.9. 【删除 topic】

  • bin/kafka-topics.sh --bootstrap-server 192.169.182.128:9092 --delete --topic first

3. Kafka 生产者消息发送流程:

在这里插入图片描述

【发送原理】

  • 1)生产者实例Producer调用send方法发送消息
  • 2)先经过一层拦截器处理,在经过kafka的序列化器兑key和value进行序列化,然后经过分区器选择消息发送的分区
  • 3)消息会先发到RecordAccumulator缓存区,默认32M,由生产者配置buffer.memory 设置
  •  3.1)首先根据分区,创建队列Deque<ProducerBatch>,然后将消息追到队列批次ProducerBatch
  •  3.2)批次大小默认16K,由生产者配置batch.size设置
  • 4)队列批次已满或者经过linger.ms等待时间(默认0ms),就唤醒sender线程进行消息发送到broker
  •  4.1)会先判断RecordAccumulator缓存区是否满足发送条件:达到batch.size或linger.ms
  •  4.2)发送时会先过滤出可发送的broke节点,然后进行封装成ClientRequest请求,通过selector发送到broker
     4.3)发送时broker可以缓存最近的5个请求
  • 5)请求发送到集群后,Kafka集群会返回对应的acks应答,发送成功则区移除缓存区的队列批次
  •  5.1)如果失败并允许重试(配置retries重试次数),则会进行重试发送;不管最终成功还是失败都要移除队列批次

在这里插入图片描述

4. Kafka 的ack机制:

 Kafka 的ack机制是指生产者的消息发送确认机制,有0,1,-1可选值,不同的值会影响消息发送的吞吐量和可靠性

  • 通过acks进行配置properties.put(ProducerConfig.ACKS_CONFIG,“1”);
  • 0:生产者发送过来的数据,不需要等数据落盘应答,可靠性差(消息没落盘,leader挂了,消息丢失),但效率高。
  • 1:生产者发送过来的数据,Leader收到数据落盘后应答,可靠性和效率都适中
  • -1(all):生产者发送过来的数据,Leader+和isr队列里面的所有节点收齐数据后应答,可靠性高,效率低。
  • 一般acks=0很少使用;acks=1,一般用于传输普通日志,允许丢个别数据;acks=-1,一般用对可靠性要求比较高的场景,比如转账。

在这里插入图片描述

5. Kafka 生产者消息发送模式(同步/异步):

【普通异步发送】:

  • 异步:消息发送不需要等broke落盘确认,便可以继续发送,数据会一直先发到RecordAccumulator缓存区;
  • kafkaProducer.send(new ProducerRecord<>(“first”,“aaaa”));
  • ·

【普通异步回调发送】:

  • 异步回调可以知道生产者发送异步消息有没有异常,如果有异常exception不为null,可以进行再处理

  • 在这里插入图片描述

【同步发送】:

  • 同步:消息发送需要等broke落盘确认,才可以继续发送,再确认之前,下一批数据不会发到RecordAccumulator缓存区;
  • kafkaProducer.send(new ProducerRecord<>(“first”,“aaaa”)).get();

6. Kafka发送消息的分区策略:

kafkaProducer.send(new ProducerRecord<>(“first”, 1,“”,“hello”)

在这里插入图片描述

7. Kafka消息发送可靠性保证(消息不丢失):

在这里插入图片描述

  • 数据完全可靠条件 = ACK级别设置为-1 + 分区副本大于等于2 + ISR里应答的最小副本数量大于等于2
  • 但会存在数据重复落盘的情况:即消息都落盘后,leader挂了,然后选举新的leader,消息重试,重复落盘

8. Kafka消息发送去重:

Kafka默认是开启幂等性的,即enable.idempotence 默认为 true

8.1. 幂等性:

幂等性就是指Producer不论向Broker发送多少次重复数据,Broker端都只会持久化一条,保证了不重复。

  • 重复数据的判断标准:具有<PID, Partition, SeqNumber>相同主键的消息提交时,Broker只会持久化一条。
  • 比如上述ack=-1,消息重试时,SeqNumber是一致的,就不能落盘
8.2. 生产者事务:

【事务原理】:
在这里插入图片描述

【发送代码】:
在这里插入图片描述
·

9. Kafka的有序消息保证:

【有序】:在同一个分区是有序的,但在多个分区是无法保证有序的
·
【有序消息保证】:

  • 如果要保证某一类业务有序,可以通过自定义分区器(实现Partitioner接口),根据某一唯一key,进行发送到指定broker分区
  • 如果不区分业务,要保证强有序,只能使用一个分区;但性能会大大降低

·
【重试乱序问题】:

  • 往同一分区发送abcdef六个消息,生产者配置是重试(retries),比如c异常重试,理论上会造成乱序abdefc;
  • 【解决】:开启幂等性(enable.idempotence=true),broke缓存请求max.in.flight.requests.per.connection需要设置小于等于5
  • 【原理】:缓存请求5个时:ab无异常,正常broke数据落盘;c异常重试,def正常发送,由于幂等性,def还在内存中并不会落盘,等c重试时,在broke重新排序,最后cdef落盘
  • 如果c一直重试失败,最后被异常,那是不是cdef都发送失败??

在这里插入图片描述

10. Kafka提高生产者吞吐量:

可以增大缓冲区、批次大小,或者稍微调大批次等待时间linger.ms,以及对批次消息压缩

    // 缓冲区大小 ,默认32M
    properties.put(ProducerConfig.BUFFER_MEMORY_CONFIG,33554432);

    // 批次大小,默认16K
    properties.put(ProducerConfig.BATCH_SIZE_CONFIG,16384);

    // linger.ms,默认0ms
    properties.put(ProducerConfig.LINGER_MS_CONFIG, 1);

    // 压缩,默认不压缩
    properties.put(ProducerConfig.COMPRESSION_TYPE_CONFIG,"snappy");

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

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

相关文章

元宇宙之声:nspace

nspace 行政总裁为我们介绍他在元宇宙中的最新创作以及对 2023 年的愿景。 本期节目我们邀请了 nspace 行政总裁 Ethan Liu 分享他的 The Sandbox 之旅以及他们的最新创作。 可以告诉我们更多关于 nspace 的信息吗&#xff1f; nspace 是一家专注于开发新的元宇宙商业模式的初创…

html 拖拽事件详解

为了使元素可拖拽&#xff0c;需要在标签上设置draggabletrue属性。 文本、图片和链接是默认可以拖放的&#xff0c;它们的draggable属性自动被设置成了true。 图片和链接按住鼠标左键选中&#xff0c;就可以拖放。 文本只有在被选中的情况下才能拖放。如果显示设置文本的dr…

LinkedIn工具-领英精灵参数怎么设置?

前言&#xff1a; 领英精灵是高端技术人员针对领英平台研发的工具。具有好友分组、备注&#xff0c;一键批量加-好友&#xff0c;批量撤-回邀请&#xff0c;批量群-发消息&#xff0c;批量导出好友资料&#xff0c;批量点-赞、Groups管理七大功能。通过领英精灵可提高领英开发…

Java集合进阶 | Collection接口

本专栏主要是记录学习完本专栏主要是记录学习Java中的知识点&#xff0c;如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 JavaWeb&#xff1a;&#x1f525;JavaWeb Java入门篇&#xff1a; &#x1f525;Java基础学习篇 Java进阶学习篇&#xff08;持续更新中&#xff0…

Three.js入门以及案例(全方位解析)

下载three.js 压缩包 github链接查看所有版本 threejs&#xff1a;https://github.com/mrdoob/three.js/releases 下载即可 常用的文件目录 three.js-文件包 └───build——three.js相关库&#xff0c;可以引入你的.html文件中。│ └───docs——Three.js API文档文件│…

【机器学习算法】模型评估 “神经网络,聚类,向量机,关联规则”算法模型的评估。

模型评估* 数据集的切割 训练-测试数据的方式、交叉验证的方式 我们通常会把数据集切割为训练数据集或者测试数据集&#xff0c;训练数据集用来训练模型用&#xff0c;测试数据集我们一般用来测试模式的实际效能怎么样。 我们在将数据分为训练和测试数据集的时候我们会使用…

go-zero使用consul作为注册中心

目录 在rpc服务中添加配置 导入包&#xff1a; 在rpc服务中添加配置&#xff1a; 引入 Consul config 配置项 user.yml 文件 修改 user.go,将 rpc注册到consul rpc的发现 在api服务中添加配置&#xff1a; 修改api/etc/user.yam 文件 修改 user.yml 修改api/user.go …

@Import的用法

官方定义: https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#spring-core Using the ImportAnnotation Much as the <import/> element is used within Spring XML files to aid in modularizing configurations, the Import annotat…

一文详解ARP报文格式及工作原理

ARP&#xff08;地址解析协议&#xff09;作用&#xff1a;将目的IP解析为目的MAC&#xff0c;用于二层帧结构的目标MAC封装&#xff0c;数据必须封装为帧才能够被网卡发送出去&#xff0c;帧中必须包含MAC。报文格式&#xff1a;ARP报文不能穿越路由器&#xff0c;不能被转发到…

基于飞桨实现钢铁企业废钢判级迈入智能化道路

目前&#xff0c;国家“双碳”战略与“数据智能”环境正驱动着钢铁企业废钢判级迈入智能化道路。针对生产过程中带来高能耗和高污染问题&#xff0c;企业通过使用飞桨用友废钢智能判级系统&#xff0c;助力提升自身经济效益和安全生产水平。 建设背景 目前&#xff0c;国家“双…

如何在IDEA中创建Web项目

&#x1f44c; 棒棒有言&#xff1a;也许我一直照着别人的方向飞&#xff0c;可是这次&#xff0c;我想要用我的方式飞翔一次&#xff01;人生&#xff0c;既要淡&#xff0c;又要有味。凡事不必太在意&#xff0c;一切随缘&#xff0c;缘深多聚聚&#xff0c;缘浅随它去。凡事…

QT入门Buttons之QToolButton

目录 一、界面布局介绍 1、布局器中的位置及使用 2、控件的界面属性 2.1对象名称和大小设置 2.2对象文本设置和鼠标箭头更改 2.3、扁平化样式 二、属性功能介绍 1、显示箭头属性 2、按钮风格 3、添加默认action属性 三、Demo展示 此文为作者原创&#xff0c;转载请标…

Web前端:提高React Native应用程序性能的技巧

不可否认&#xff0c;React Native是开发混合应用的未来。它提供了可扩展性、灵活性、速度、敏捷性、成本效益和卓越的性能。难怪这么多成功的公司依赖React Native来构建他们的应用程序。毕竟&#xff0c;在互联网时代&#xff0c;每个企业都需要一个高性能的应用程序来满足客…

PCB如何进行阻抗设计经验总结

&#x1f3e1;《总目录》 目录1&#xff0c; 什么是阻抗匹配2&#xff0c;为何要阻抗匹配3&#xff0c;阻抗设计经验1&#xff0c; 什么是阻抗匹配 阻抗是指电路中两点间电阻&#xff0c;电感和电容的总称。而阻抗匹配是指&#xff0c;传输线及传输线两端的电子元器件的输入或输…

Canvas(HTML 5 元素)之绘制曲线图形

文章目录参考描述模板圆形圆形半圆形互补弧形arc()arcTo()二次贝塞尔曲线三次贝塞尔曲线参考 项目描述搜索引擎BingCanvas 中文网CanvasRenderingContext2DW3schoolHTML Canvas 参考手册从 0 到 1&#xff1a;HTML 5 Canvas 动画开发莫振杰 描述 项目描述Edge109.0.1518.70 (…

1.Java基础入门

目录 一.java概述 1.1 java语言发展史 1.2 为什么用Java 1.3 Java能做什么 1.4 Java技术体系 二.Java快速入门 2.1 如何使用Java 2.2 JVM&#xff0c;JRE&#xff0c;JDK 2.2.1 JVM 2.2.2 JRE 2.2.3 JDK 2.3 JDK的下载和安装 2.3.1 JDK的下载 2.3.2 JDK的安装 2.3.3 如何验证JD…

git版本回滚详解

写在前面&#xff1a;本文图片中出现的git st, git co分别是git status和git checkout的简写&#xff0c;使用中可以自行设置git config --global alias.st statusgit config --global alias.co checkout查看git配置文件 vim ~/.gitconfig1 工作区内的回滚操作当工作区的文件发…

Android 传感器概述(二)

Android 传感器概述&#xff08;二&#xff09;Android 传感器概述&#xff08;二&#xff09;运动传感器使用重力传感器使用线性加速度计使用旋转矢量传感器使用有效运动传感器使用计步器传感器使用步测器传感器使用原始数据使用加速度计使用陀螺仪使用未经校准的陀螺仪Androi…

【数据结构】动图详解单向链表

目录 1.什么是链表 1.问题引入 2. 链表的概念及结构 3. 问题解决 2.单向链表接口的实现 1.接口1&#xff0c;2---头插&#xff0c;尾插 2. 接口3&#xff0c;4---头删&#xff0c;尾删 3. 接口5---查找 4. 接口6&#xff0c;7---插入&#xff0c;删除 5. 接口8---打印 6. 注意…

CVE-2021-36934提权复现

CVE-2021-369342021年7 月 20 日&#xff0c;微软确认了一个新的本地提权漏洞(CVE-2021-36934)&#xff0c;被称为HiveNightmare。该漏洞由于Windows中多个系统文件的访问控制表(ACL)过于宽松&#xff0c;使得任何标准用户都可以从系统卷影副本中读取包括SAM、SYSETM、SECURITY…