Java笔记-kafka

news2024/12/23 10:26:38

在这里插入图片描述

修改kafka的server.properties配置

在这里插入图片描述

概念

单播

一个消费组的消费者们只有一个能消费到消息。类似queue队列。

多播

不同的消费组的消费者能重复消费到消息,类似publish-subscribe模式

消费组偏移

kafka和别的消息中间件不一样,不同组可以重复消费,消费过的信息还在。默认不会删除,默认会保存7天,log.retention.hours设置
offset以组为单位。
在这里插入图片描述

topic-partition

topic是个逻辑概念
真的消息队列是partition
在这里插入图片描述
就有了partition,一个partition对应一个文件,可以放在不同机器,搞集群
partition是一个有序的message序列,这些message按照顺序添加到一个commit log文件,每个partition种的消息都有唯一编号offset用来唯一标识某个分区中的message。一个partition的message的offset都是唯一的,不同partition可能相同。
Kafka性能和存储的消息数据量大小无关。
每个consumer基于自己在commit log种消费进度(offset)进行工作,其由consumer自己维护,所以添加减少consumer对Kafka集群和其他消费者影响不大。

topic,partition,broker

topic是一个主题,逻辑概念,比如数据库表中order,user等。
partition是物理存储分区。
broker是每台机器的kafka的消息中间件进程。

kafka集群(针对partition不是机器

尽管只有一台机器,也叫做集群(天生即集群
例子:2个分区,3台kafka机器
在这里插入图片描述
Isr:已同步的副本
不同partition的leader不一样,避免同一台机器挂掉不能写,减压

在这里插入图片描述
再加一个C7也没用不能消费partition了。所以线程并发四个就行。
在这里插入图片描述

Java api

分区是根据key来计算,哈希算法算出散列值,然后对分区数取模
在这里插入图片描述

Java 配置核心参数

producer端

acks

  1. acks = 0:producer不需要等待任何broker确认收到消息的回复就可以继续发送下一条消息,性能最高
  2. acks=1: 需要等leader写入本地log,但是如果follower没备份成功leader挂掉就丢消息,一般用这个
  3. acks=-1/all:min.insync.replicas配置大于等于2,写到副本节点。一般金融级别用,效率最低
    在这里插入图片描述

重试

因为网络抖动发送失败会重试几次。可能会多发,重复了
在这里插入图片描述
重试间隔毫秒
在这里插入图片描述

缓冲区

客户端设置32MB的缓冲区buffer memory,
还有个缓冲区,卡夫卡本地线程从缓冲批量拉取消息,一次一batch16kb。
如果消息没满16kb,设置消息等待时间10ms,也会被发送到broker

在这里插入图片描述
在这里插入图片描述

consumer端(长轮询,一秒内多次拉取。从broker拉取消息

指定消费分区

在这里插入图片描述

指定offset消费

从头消费:
在这里插入图片描述
指定offset
在这里插入图片描述
指定消费和offset提交没有关系。

指定时间消费

从指定时间点开始消费
在这里插入图片描述
在这里插入图片描述

反序列化

在这里插入图片描述

offset

消费者需要提交offset给broker,但是一般不用自动提交,因为消费快了会重复消费,消费慢了挂掉会消费不到需要的数据。一般手动提交
在这里插入图片描述

心跳机制

在这里插入图片描述

消费能力

在这里插入图片描述

auto offset reset config

earliest:单次从头消费
latest:一般这个,每次都消费启动后的消息
在这里插入图片描述

手动同步提交offset(常用

在这里插入图片描述

手动异步提交offset

在这里插入图片描述

log,index,timeindex(稀疏索引)

kafka分segment存储log,有log文件,index文件,timeindex文件。
index存储对应的log文件的offset,以及pointer。查找时通过offset index二分查找得到pointer指向log文件里的位置数据。
在这里插入图片描述
timeindex
存储的时间点和offset。通过时间二分查找到offset,再到index文件通过offset index查找到pointer。得到log 文件具体数据位置

spring boot整合

依赖包
spring-kafka
配置
在这里插入图片描述
spring封装的操作模板类
在这里插入图片描述
在这里插入图片描述
manual和batch比较常用
在这里插入图片描述

controller

kafka集群启动会选择一个broker作为controller管理整个集群,一般是按照先后顺序谁先启动谁就是,但是一般批量启动时都去zookeeper注册,去建立一个/controller临时节点,只能创建一个,所以谁先创建谁就是controller。如果挂掉了则会通过zk的watch机制(其他broker监听这个临时节点,发现临时节点消失了就会再次发起create -e controller)再次选举controller。
每个partition的leader也是controller控制的。
所以很多中间件借助zk来选举
controller监听/broker/ids(都是临时的,挂掉就会消失), /broker/topics
在这里插入图片描述

partition副本选举leader机制

借助controller选举
controller监听zk的/broker/ids,如果有broker挂了,就看该broker上的分区有哪些是leader将会对这些partition再次选举leader。从
Isr列表里(活着并且已经同步leader数据的)按照顺序选举leader。

消费者消费消息的offset记录机制

每个consumer会定期将自己消费分区的offset提交给kafka内部topic__consumer_offsets,提交过去的时候,key是
consumerGroupId+topic+分区号
value就是当前offset的值,kafka会定期清理topic里的消息,最后就保留最新的
那条数据

因为__consumer_offsets可能会接收高并发的请求,kafka默认给其分配50个分区(可以通过
offsets.topic.num.partitions设置),这样可以通过加机器的方式抗大并发

消费者rebalance机制

  1. 消费组里consumer增加减少
  2. 动态给topic增加partition
  3. 消费组订阅了更多的topic

rebalance过程该消费组不能消费消息,晚上做

分区分配策略

partition.assignment.strategy,默认range

range

按照分区序号排序,假设 n=分区数/消费者数量 = 3, m=分区数%消费者数量 = 1,那么前 m 个消费者每个分配 n+1 个分区,后面的(消费者数量-m )个消费者每个分配 n 个分区。
比如分区03给一个consumer,分区46给一个consumer,分区7~9给一个consumer

round-robin轮询分配

分区0、3、6、9给一个consumer,分区1、4、7给一个consumer,分区2、5、
8给一个consumer

sticky

初次分配和round-robin相似,rebalance时保持两原则

  1. 分区均匀
  2. 和上次尽量相同
    比如对于第一种range情况的分配,如果第三个consumer挂了,那么重新用sticky策略分配的结果如下:
    consumer1除了原有的0~3,会再分配一个7
    consumer2除了原有的4~6,会再分配8和9

流程图

kafka和consumer两方都有个coordinator组长,由consumer方制定分区方案,告诉kafka,由kafka下发(通过心跳响应)。
在这里插入图片描述

高水位HW

HW俗称高水位,HighWatermark的缩写,取一个partition对应的ISR中最小的LEO(log-end-offset)作为HW,consumer最多只能消费到HW所在的位置。另外每个replica都有HW,leader和follower各自负责更新自己的HW的状态。对于leader新写入的消息,consumer不能立刻消费,leader会等待该消息被所有ISR中的replicas同步后更新HW,
此时消息才能被consumer消费。这样就保证了如果leader所在的broker失效,该消息仍然可以从新选举的leader中获取。对于来自内部broker的读取请求,没有HW的限制
在这里插入图片描述
Kafka的复制机制既不是完全的同步复制,也不是单纯的异步复制。事实上,同步复制要求所有能工作的follower都复制完,这条消息才会被commit,这种复制方式极大的影响了吞吐率。而异步复制方式下,follower异步的从leader复制数据,数据只要被leader写入log就被认为已经commit,这种情况下如果follower都还没有复制完,落后于leader时,突然leader宕机,则会丢失数据。而Kafka的这种使用ISR的方式则很好的均衡了确保数据不丢失以及吞吐率

kafka线上容量规划

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Grafana监控 Redis Cluster

Grafana监控 Redis Cluster 主要是使用grafana来实现监控,grafana可以对接多种数据源,在官网中可以找到Redis数据源,需要安装redis data source插件。当然也可以利用Prometheus来做数据源,下面分别记录一下这两种数据源的安装配置…

前后端分离------后端创建笔记(04)前后端对接

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论,如有侵权请联系 源码:https://gitee.com/green_vegetables/x-admin-project.git 素材:https://pan.baidu.com/s/…

“MongoDB基础知识【超详细】

"探索MongoDB的无边之境:沉浸式数据库之旅" 欢迎来到MongoDB的精彩世界!在这个博客中,我们将带您进入一个充满创新和无限潜力的数据库领域。无论您是开发者、数据工程师还是技术爱好者,MongoDB都将为您带来一场令人心动…

网络安全威胁与防御策略

第一章:引言 随着数字化时代的快速发展,网络已经成为人们生活和工作中不可或缺的一部分。然而,网络的广泛应用也引发了一系列严峻的网络安全威胁。恶意软件、网络攻击、数据泄露等问题层出不穷,给个人和企业带来了巨大的风险。本文…

UI美工设计岗位的基本职责概述(合集)

UI美工设计岗位的基本职责概述1 1、有良好的美术功底、设计新颖,整体配色及设计创意理念,能够独立完成整个网站页面设计及制作; 2、熟练运用DIV CSS,HTML 设计制作网页 ; 3、熟练运用Photoshop,Dreamweaver,Coreldraw(或Illustrator),Fla…

7-2 计算物体自由下落的距离

一个物体从100米的高空自由落下。编写程序,求它在前3秒内下落的垂直距离。设重力加速度为10米/秒2。 输入格式: 本题目没有输入。 输出格式: 按照下列格式输出 height 垂直距离值结果保留2位小数。 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB …

异常(下)Java常见异常,异常的使用原则

文章目录 前言一、Java常见异常 1.常见异常2.实例展示二、异常的使用原则总结 前言 该文介绍了Java的一些常见异常,并给出对应的例子进行解释。介绍异常的使用原则,即创建,抛出异常的编程规范。 一、Java常见异常 前要:Java API中…

实训五:用户和组账号管理

实训五:用户和组账号管理 2017 年 X 月 X 日 今日公布 四:实训内容 用root用户登录系统,查看用户账号文件/etc/passwd和口令文件/etc/shadow的内容,注意观察其存储格式、各账户所使用的Shell、UID、GID等属性信息。 答&#xf…

ITIL4—度量和报告实践

1. 关于本文 本文为度量和报告实践提供了实用指南,分为五个主要部分,涵盖: 本实践的基本信息本实践相关的流程和活动,及其在服务价值链中的作用参与本实践的组织和人员支持本实践的信息和技术合作伙伴和供应商在本实践中的注意事…

【构造】CF1853D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>using i64 long long;const int N 1e6 10;int ans[N];void solve() {int n;std::cin >> n;std::vector<std::pair<int,int> > a(n 1);for …

如何高效进行项目任务管理?掌握这些神器助你一臂之力

任务管理是项目管理中的重点部分&#xff0c;关系到项目能否顺利的完成。项目经理该如何进行项目任务管理呢&#xff1f; 一、项目任务管理中的挑战 二、项目任务管理指南 三、项目任务管理神器 首先我们需要先清楚当下企业在项目任务管理中遇到的挑战。 一、项目任务管理中的…

【Kafka】2.在SpringBoot中使用官方原生java版Kafka客户端

目 录 1. 新建一个消息生产者2. 新建一个消息消费者3. 测 试 在开始之前&#xff0c;需要先做点准备工作&#xff0c;用 IDEA 新建一个 Maven 项目&#xff0c;取名 kafka-study&#xff0c;然后删掉它的 src 目录&#xff0c;接着在 pom.xml 里面引入下面的依赖。这个项目的作…

HCIP学习--BGP3

目录 前置内容 BGP下一跳的修改问题 BGP的属性 配置 PrefVal权重属性 负载分担 LocPrf 负载分担 NextHop AS-PATH Ogn 配置 MED 配置 BGP选路规则 BGP的社团属性 配置及解释 前置内容 HCIP学习--BGP1_板栗妖怪的博客-CSDN博客 HCIP学习--BGP2_板栗妖怪的博客…

Python 解析c文件并导出到Excel

文章目录 1. 目录结构&#xff1a;2.代码1. test.c2. write_excel.py3. cparser.py4. 模板.xlsx5. output.xlsx 脚本中主要使用 openpyxl cparser 库 1. 目录结构&#xff1a; ast.txt &#xff1a;存放解析 c 文件的语法树&#xff0c;便于查找内容cparser.py &#xff1a;解…

@Param详解

文章目录 背景什么是ParamParam的使用方法使用方法&#xff1a;遇到的问题及因Param解决了什么问题使用与不使用对比 Param是如何进行映射的总结 背景 最近在开发过程中&#xff0c;在写mapper接口是在参数前加了Param注解&#xff0c;但是在运行的时候就会报错&#xff0c;说…

Elasticsearch 8.X 复杂分词搞不定,怎么办?

1、实战问题 球友提问&#xff1a;我想停用所有纯数字的分词 &#xff0c; 官网上的这个方法好像对ik分词器无效&#xff01; 有没有什么别的方法啊&#xff0c; chart gpt 说分词可以用正则匹配 但是测试好像是不行的 我的es版本是 8.5.3。 2、进一步沟通后&#xff0c;得…

若依框架浅浅介绍

由若依官网所给介绍可知 1、文件结构介绍 在ruoyi-admin的pom.xml文件中引入了ruoyi-framework、ruoyi-quartz和ruoyi-generatior模块&#xff0c;在ruoyi-framework的pom.xml文件中引入了ruoyi-system模块。 2、技术栈介绍 前端&#xff1a;Vue、Element UI后端&#xff1a…

Netty:在一个ByteBuf中寻找另外一个ByteBuf出现的位置

说明 利用ByteBufUtil的indexOf(ByteBuf needle, ByteBuf haystack)函数可以在haystack中寻找needle出现的位置。如果没有找到&#xff0c;返回-1。 示例 在一个ByteBuf 中找到了另外一个ByteBuf package com.thb;import io.netty.buffer.ByteBuf; import io.netty.buffer.…

AUTOSAR规范与ECU软件开发(基础篇)2.5 AUTOSAR方法论

前言 AUTOSAR方法论(AUTOSAR Methodology) 中车用控制器软件的开发涉及系统级、 ECU级和软件组件级。 系统级主要考虑系统功能需求、 硬件资源、 系统约束, 然后建立系统架构; ECU级根据抽象后的信息对ECU进行配置; 系统级和ECU级设计的同时, 伴随着软件组件级的开发。 上…

python软件安装包百度云,python软件安装教程2020

大家好&#xff0c;小编为大家解答python软件安装在哪个盘比较好的问题。很多人还不知道python软件安装过程中,customize&#xff0c;现在让我们一起来看看吧&#xff01; 一&#xff1a;python安装 安装软件的路径中不允许出现中文、带空格的字符串、特殊符号、纯数字&#xf…