Kafka问题纪要

1. 取 如何获取 topic 主题的列表

bin/kafka-topics.sh --list --zookeeper localhost:2181

2. 生产者和消费者的命令行是什么?

生产者在主题上发布消息:
bin/kafka-console-producer.sh --broker-list 192.168.43.49:9092 --topicHello-Kafka
注意这里的 IP 是 server.properties 中的 listeners 的配置。接下来每个新行就是输入一条
新消息。
消费者接受消息:
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topicHello-Kafka --from-beginning

3. consumer 是推还是拉?

Kafka 最初考虑的问题是,customer 应该从 brokes 拉取消息还是 brokers 将消息推送到
consumer,也就是 pull 还 push。在这方面,Kafka 遵循了一种大部分消息系统共同的传统
的设计: producer 将消息推送到 broker,consumer 从 broker 拉取消息。
一些消息系统比如 Scribe 和 Apache Flume 采用了 push 模式,将消息推送到下游的
consumer。这样做有好处也有坏处:由 broker 决定消息推送的速率,对于不同消费速率的
consumer 就不太好处理了。消息系统都致力于让 consumer 以最大的速率最快速的消费消
息,但不幸的是,push 模式下,
当 broker 推送的速率远大于 consumer 消费的速率时,consumer 恐怕就要崩溃了。最终
Kafka 还是选取了传统的 pull 模式。
Pull 模式的另外一个好处是 consumer 可以自主决定是否批量的从 broker 拉取数据 。
Push 模式必须在不知道下游 consumer 消费能力和消费策略的情况下决定是立即推送每条
消息还是缓存之后批量推送。如果为了避免 consumer 崩溃而采用较低的推送速率,将可能
导致一次只推送较少的消息而造成浪费。Pull 模式下,consumer 就可以根据自己的消费能
力去决定这些策略。
Pull 有个缺点是,如果 broker 没有可供消费的消息,将导致 consumer 不断在循环中轮询,
直到新消息到 t 达。为了避免这点,Kafka 有个参数可以让 consumer 阻塞知道新消息到达
(当然也可以阻塞知道消息的数量达到某个特定的量这样就可以批量发送)。

4. 讲 讲讲 kafka 维护消费状态跟踪的方法

大部分消息系统在 broker 端的维护消息被消费的记录:一个消息被分发到 consumer 后
broker 就 上进行标记或者等待 customer 的通知后进行标记。这样也可以在消息在消费后
立 就删除以减少空间占用。但是这样会不会有什么问题呢?如果一条消息发送出去之后就
立即被标记为消费过的,旦 consumer 处理消息时失败了(比如程序崩溃)消息就丢失了。
为了解决这个问题,很多消息系统提供了另外一个个功能:当消息被发送出去之后仅仅被标
记为已发送状态,当接到 consumer 已经消费成功的通知后才标记为已被消费的状态。这虽
然解决了消息丢失的问题,但产生了新问题,首先如果 consumer 处理消息成功了但是向
broker 发送响应时失败了,这条消息将被消费两次。第二个问题时,broker 必须维护每条
消息的状态,并且每次都要先锁住消息然后更改状态然后释放锁。这样麻烦又来了,且不说
要维护大量的状态数据,比如如果消息发送出去但没有收到消费成功的通知,这条消息将一
直处于被锁定的状态,Kafka 采用了不同的策略。Topic 被分成了若干分区,每个分区在同
一时间只被一个 consumer 消费。这意味着每个分区被消费的消息在日志中的位置仅仅是一
个简单的整数:offset。这样就很容易标记每个分区消费状态就很容易了,仅仅需要一个整
数而已。这样消费状态的跟踪就很简单了。
这带来了另外一个好处:consumer 可以把 offset 调成一个较老的值,去重新消费老的消息。

5. 讲一下主从同步

Kafka 允许 topic 的分区拥有若干副本,这个数量是可以配置的,你可以为每个 topci 配置副
本的数量。Kafka 会自动在每个个副本上备份数据,所以当一个节点 down 掉时数据依然是
可用的。
Kafka 的副本功能不是必须的,你可以配置只有一个副本,这样其实就相当于只有一份数据。

6. 为什么需要消息系统,mysql 不能满足需求吗?

(1)解耦:
允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
(2)冗余:
消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失 险。
许多消息队列所采用的”插入-获取-删除”范式中,在把一个消息从队列中删除之前,需要
你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使
用完毕。
(3)扩展性:
因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外
增加处理过程即可。
(4)灵活性 & 峰值处理能力:
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常 。如果
为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够
使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
(5)可恢复性:
系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即
使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
(6)顺序保证:
在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保
证数据会按照特定的顺序来处理。(Kafka 保证一个 Partition 内的消息的有序性)
(7)缓冲:
有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情
况。
(8)异步通信:
很多时候,用戶不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用戶把一
个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时
候再去处理它们。

7. Zookeeper 于 对于 Kafka 的作用是什么?

Zookeeper 是一个开放源码的、高性能的协调服务,它用于 Kafka 的分布式应用。
Zookeeper 主要用于在集群中不同节点之间进行通信
在 Kafka 中,它被用于提交偏移量,因此如果节点在任何情况下都失败了,它都可以从之
前提交的偏移量中获取除此之外,它还执行其他活动,如: leader 检测、分布式同步、配置
管理、识别新节点何时离开或连接、集群、节点实时状态等等。

8. 数据传输的事务定义有哪三种?

和 MQ TT 的事务定义一样都是 3 种。
(1)最多一次: 消息不会被重复发送,最多被传输一次,但也有可能一次不传输
(2)最少一次: 消息不会被漏发送,最少被传输一次,但也有可能被重复传输.
(3)精确的一次(Exactly once): 不会漏传输也不会重复传输,每个消息都传输被一次而且
仅仅被传输一次,这是大家所期望的

9. Kafka 判断一个节点是否还活着有那两个条件?

(1)节点必须可以维护和 ZooKeeper 的连接,Zookeeper 通过心跳机制检查每个节点的连

(2)如果节点是个 follower,他必须能及时的同步 leader 的写操作,延时不能太久

10. Kafka 统 与传统 MQ 消息系统之间有三个关键区别

(1).Kafka 持久化日志,这些日志可以被重复读取和无限期保留
(2).Kafka 是一个分布式系统:它以集群的方式运行,可以灵活伸缩,在内部通过复制数据
提升容错能力和高可用性
(3).Kafka 支持实时的流式处理

11. 讲 讲一讲 kafka 的 的 ack 的三种机制

request.required.acks 有三个值 0 1 -1(all)
0:生产者不会等待 broker 的 ack,这个延迟最低但是存储的保证最弱当 server 挂掉的时候
就会丢数据。
1:服务端会等待 ack 值 leader 副本确认接收到消息后发送 ack 但是如果 leader 挂掉后
他不确保是否复制完成新 leader 也会导致数据丢失。
-1(all):服务端会等所有的 follower 的副本受到数据后才会受到 leader 发出的 ack,这样数
据不会丢失

12. 消费者如何不自动提交偏移量,由应用提交?

将 auto.commit.offset 设为 false,然后在处理一批消息后 commitSync() 或者异步提交
commitAsync()

13. 消费者故障,出现活锁问题如何解决?

出现“活锁”的情况,是它持续的发送心跳,但是没有处理。为了预防消费者在这种情况下
一直持有分区,我们使用 max.poll.interval.ms 活跃检测机制。 在此基础上,如果你调用的
poll 的频率大于最大间隔,则客戶端将主动地离开组,以便其他消费者接管该分区。 发生
这种情况时,你会看到 offset 提交失败(调用 commitSync ()引发的 CommitFailedException)。
这是一种安全机制,保障只有活动成员能够提交 offset。所以要留在组中,你必须持续调用
poll。
消费者提供两个配置设置来控制 poll 循环:
max.poll.interval.ms:增大 poll 的间隔,可以为消费者提供更多的时间去处理返回的消息(调
用 poll(long)返回的消息,通常返回的消息都是一批)。缺点是此值越大将会延迟组重新平衡。
max.poll.records:此设置限制每次调用 poll 返回的消息数,这样可以更容易的预测每次 poll
间隔要处理的最大值。通过调整此值,可以减少 poll 间隔,减少重新平衡分组的
对于消息处理时间不可预测地的情况,这些选项是不够的。 处理这种情况的推荐方法是将
消息处理移到另一个线程中,让消费者继续调用 poll。 但是必须注意确保已提交的 offset
不超过实际位置。另外,你必须禁用自动提交,并只有在线程完成处理后才为记录手动提交
偏移量(取决于你)。 还要注意,你需要 pause 暂停分区,不会从 poll 接收到新消息,让
线程处理完之前返回的消息(如果你的处理能力比拉取消息的慢,那创建新线程将导致你机
器内存溢出)。

14. 如何控制消费的位置

kafka 使用 seek(TopicPartition, long)指定新的消费位置。用于查找服务器保留的最早和最新
的 offset 的特殊的方法也可用(seekToBeginning(Collection) 和 seekToEnd(Collection))

15. kafka 分布式 ( 不是单机 ) 的情况下 , 如何保证消息的

顺序消费?
Kafka 分布式的单位是 partition,同一个 partition 用一个 write ahead log 组织,所以可以
保证 FIFO 的顺序。不同 partition 之间不能保证顺序。但是绝大多数用戶都可以通过
message key 来定义,因为同一个 key 的 message 可以保证只发送到同一个 partition。
Kafka 中发送 1 条消息的时候,可以指定(topic, partition, key) 3 个参数。partiton 和 key 是
可选的。如果你指定了 partition,那就是所有消息发往同 1 个 partition,就是有序的。并
且在消费端, Kafka 保证,1 个 partition 只能被 1 个 consumer 消费。或者你指定 key
( 比如 order id),具有同 1 个 key 的所有消息,会发往同 1 个 partition。

16. kafka 如何减少数据丢失

Kafka 到底会不会丢数据(data loss)? 通常不会,但有些情况下的确有可能会发生。下面的参
数配置及 Best practice 列表可以较好地保证数据的持久性(当然是 trade-off,牺牲了吞吐量)。

block.on.buffer.full = true
acks = all
retries = MAX_VALUE
max.in.flight.requests.per.connection = 1
使用 KafkaProducer.send(record, callback)
callback 逻辑中显式关闭 producer:close(0)
unclean.leader.election.enable=false
replication.factor = 3
min.insync.replicas = 2
replication.factor > min.insync.replicas
enable.auto.commit=false

消息处理完成之后再提交位移

17. kafka 如何不消费重复数据?比如扣款。

其实还是得结合业务来思考,我这里给几个思路:
比如你拿个数据要写库,你先根据主键查一下,如果这数据都有了,你就别插入了,update
一下好吧。
比如你是写 Redis,那没问题了,反正每次都是 set,天然幂等性。
比如你不是上面两个场景,那做的稍微复杂一点,你需要让生产者发送每条数据的时候,里
面加一个全局唯一的 id,类似订单 id 之类的东西,然后你这里消费到了之后,先根据这个
id 去比如 Redis 里查一下,之前消费过吗?如果没有消费过,你就处理,然后这个 id 写
Redis。如果消费过了,那你就别处理了,保证别重复处理相同的消息即可。
比如基于数据库的唯一键来保证重复数据不会重复插入多条。因为有唯一键约束了,重复数
据插入只会报错,不会导致数据库中出现脏数据。

小白路漫漫,让我们一起加油!!!

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

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

相关文章

vue3 el-form中嵌套el-tabale 对输入动态校验

简单案例 <el-form :model"Form" :rules"rules" ref"FormRef" class"formDiv"><el-table :data"Form.copyWriters" style"width: 100%"><el-table-column label"文案链接"><temp…

rancher是什么

Rancher Labs是制作Rancher的公司。Rancher Labs成立于2014年&#xff0c;是一家专注于企业级容器管理软件的公司。它的产品设计旨在简化在分布式环境中部署和管理容器的过程&#xff0c;帮助企业轻松地采用容器技术和Kubernetes。Rancher Labs提供的Rancher平台支持Docker容器…

H5 简单四按钮个人主页源码

源码名称&#xff1a;简单四按钮个人主页源码 源码介绍&#xff1a;一款简单的带4个按钮选项的个人主页源码&#xff0c;可自行修改内容作为自己的个人主页。 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.changyouzuhao.cn/11458.html

DeepMind推出SIMA:一款在3D虚拟环境中展现强大泛化能力的通用AI代理

【技术框架概述】: SIMA(Scalable Instructable Multiworld Agent)是一种通用的 AI 代理系统,旨在在多种视频游戏环境中执行任务,并能够通过自然语言指令进行操作。它包含了预先训练的视觉模型和主模型,可以使用键盘和鼠标操作游戏中的角色。 【定位】:SIMA的定位是成…

ubuntu 23.04 安装 中文输入法

1、安装 fcitx sudo apt install fcitxfcitx 安装好后&#xff0c;可以使用 fcitx-configtool 命令进行配置&#xff0c;其界面如下所示。在这里可以配置不同输入法的切换快捷键&#xff0c;默认输入法等。刚安装系统后&#xff0c;这里只有一个输入法&#xff0c;所以接下来要…

Mysql将datetime数据转为Data/Char

打印当前日期&#xff1a; SELECT NOW();datetime转Date SELECT CONVERT(NOW(), DATE);datetime转字符 SELECT CONVERT(NOW(),char);datetime直接转日期格式的字符 方法1&#xff1a; SELECT CONCAT(CONVERT (Now(), DATE), "");方法2&#xff1a; SELECT DATE_…

元宇宙崛起:区块链与金融科技共绘数字新世界

文章目录 一、引言二、元宇宙与区块链的深度融合三、区块链在元宇宙金融中的应用四、金融科技在元宇宙中的创新应用五、面临的挑战与机遇《区块链与金融科技》亮点内容简介获取方式 一、引言 随着科技的飞速发展&#xff0c;元宇宙概念逐渐走进人们的视野&#xff0c;成为数字…

C语言入门到精通之练习54:猴子吃桃问题(附带源码)

一只小猴子一天摘了许多桃子&#xff0c;第一天吃了一半&#xff0c;然后忍不住又吃了一个&#xff1b;第二天又吃了一半&#xff0c;再加上一个&#xff1b;后面每天都是这样吃。到第10天的时候&#xff0c;小猴子发现只有一个桃子了。问小猴子第一天共摘了多少个桃子。 实例…

先进电气技术 —— 片上宽禁带器件的集成与应用

一、背景 功率转换器设计的一个关键目标是降低功率损耗以提高转换效率&#xff0c;这对可再生能源等应用产生影响。通过降低功率损耗&#xff0c;可以减小变换器元件的尺寸&#xff0c;从而使整个变换器的尺寸更小。因此&#xff0c;转换器的大小和成本完全取决于设计要求和应…

Linux:kubernetes(k8s)prestop事件的使用(11)

他的作用是在结束pod容器之后进行的操作 apiVersion: v1 # api文档版本 kind: Pod # 资源对象类型 metadata: # pod相关的元数据&#xff0c;用于描述pod的数据name: nginx-po # pod名称labels: # pod的标签type: app #这个是随便写的 自定义的标签version: 1.0.0 #这个…

2024年谷歌SEO的趋势预测及应对建议(川圣SEO)#蜘蛛池

baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; 虽然说“SEO”已死这个口号已经喊了很多年了&#xff08;最终也没死&#xff09;&#xff0c;但是在2023年很…

前端定义了全局变量后,再定义一个同名的局部变量

先说结论&#xff1a;不要这样定义&#xff0c;不然会发生莫名其妙的错误。 问题叙述 前端定义了全局变量 var selectedSheet; 在后面的函数中又定义局部变量 function switchToSheet() {var selectedSheet document.getElementById(selectSheet).value;fetch(/get_data)…

mysql中的非空间数据导入sqlserver中空间化

以下操作都在Navicat Premium 15软件中操作 1、mysql导出数据 以导出csv为例 不修改导出路径的话默认就是在桌面 设置编码UTF-8 这边还是默认,最好不要修改,如果文本识别符号为空,导入的时候可能字段会错乱 开始即可 2、导入sqlserver数据库中

STM32---ADC

ADC 概念 众所周知&#xff0c;GPIO只能读入高电平或者低电平&#xff0c;那如果现有一个模拟量&#xff0c;该如何读取呢&#xff0c;比如电压的范围是0~3.3v&#xff0c;如何获取电压的值。就需要ADC&#xff08;Analog-Digital Converter&#xff09;了。ADC可以将引脚上连…

Linux环境下用IDEA运行Golang记录

一、背景 和存储同时开发AI项目&#xff0c;在Linux环境运行Golang项目&#xff0c;因此需要进行相关的配置。 二、Golang安装 参考&#xff1a;【Linux — 安装 Go】Linux 系统安装 Go 过程总结_linux 安装go-CSDN博客 三、IDEA中Golang配置 1、去除代理 否则在Plugins中…

4.MAC平台Python的下载、安装(含Python2.7+Python3.12双版本环境变量配置)——《跟老吕学Python编程》

4.MAC平台Python的下载、安装&#xff08;含Python2.7Python3.12双版本环境变量配置&#xff09;——《跟老吕学Python编程》&#xff09;——跟老吕学Python编程 一、下载MAC版Python1.Python官网2.MAC版Python下载网址 二、在MAC安装Python1.在MAC安装Python2.阅读Python重要…

数据结构与算法之美学习笔记:不定期福利第三期 | 刘超:我是怎么学习《数据结构与算法之美》的?

目录 前言 前言 本节课程思维导图&#xff1a; 你好&#xff0c;我是刘超&#xff0c;是隔壁《趣谈网络协议》专栏的作者。今天来“串个门儿”&#xff0c;讲讲我学习《数据结构与算法之美》这个专栏的一些体会和感受。 《数据结构与算法之美》是目前“极客时间”订阅量最多的…

应用实战|从头开始开发记账本1:如何获取BaaS服务

本期视频开始&#xff0c;我们将通过一系列教程&#xff0c;来详细讲解MemFire Cloud BaaS服务的使用方法&#xff0c;通过这一系列的教程&#xff0c;你将学会如何只使用前端技术完成一个生产级应用的开发和上线。 以下是本期视频主要章节&#xff1a; BaaS服务介绍用户如何…

Django简明教程:从零打造你的第一个Web应用

引言&#xff1a; 在当今快节奏的互联网时代&#xff0c;开发者们需要高效地构建可靠、安全且易于维护的Web应用。而Django作为一个高度优化的Web框架&#xff0c;正是为了满足这一需求而设计的。本教程将带领读者从零开始&#xff0c;逐步学习如何使用Django构建他们的第一个…

【Python】成功解决NameError: name ‘sns‘ is not defined

【Python】成功解决NameError: name ‘sns’ is not defined &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您…