前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java高频面试题- 每日三连问?【Day35】 — Kafka篇(三)

Java高频面试题- 每日三连问?【Day35】 — Kafka篇(三)

作者头像
浩说编程
发布于 2022-04-12 06:23:23
发布于 2022-04-12 06:23:23
2800
举报
文章被收录于专栏:Java经验之谈Java经验之谈

问题导读

一、说说Kafka 如何保证消息的消费顺序?

二、Kafka 如何保证消息不丢失?

三、Kafka 判断一个节点是否还活着有哪两个条件?

01

说说Kafka 如何保证消息的消费顺序?

正经回答:

我们在使用消息队列的过程中经常有业务场景需要严格保证消息的消费顺序,比如我们同时发了 2 个消息,这 2 个消息对应的操作分别对应的数据库操作是:

 更改用户会员等级。

 根据会员等级计算订单价格。

假如这两条消息的消费顺序不一样造成的最终结果就会截然不同。

Kafka 中 Partition(分区)是真正保存消息的地方,我们发送的消息都被放在了这里。

而我们的 Partition(分区) 又存在于 Topic(主题) 这个概念中,并且我们可以给特定 Topic 指定多个 Partition。

每次添加消息到 Partition(分区) 的时候都会采用尾加法,如上图所示。

Kafka 只能为我们保证 Partition(分区) 中的消息有序。

消息在被追加到 Partition(分区)的时候都会分配一个特定的偏移量(offset)。

Kafka 通过偏移量(offset)来保证消息在分区内的顺序性。

所以,我们就有一种很简单的保证消息消费顺序的方法:

1 个 Topic 只对应一个Partition。

这样当然可以解决问题,但是破坏了 Kafka 的设计初衷。

Kafka 中发送 1 条消息的时候,可以指定 topic, partition, key,data(数据) 4 个参数。

如果你发送消息的时候指定了 Partition 的话,所有消息都会被发送到指定的 Partition。

并且,同一个 key 的消息可以保证只发送到同一个 partition,这个我们可以采用表/对象的 id 来作为 key 。

总结一下,对于如何保证 Kafka 中消息消费的顺序,有了下面两种方法:

 1 个 Topic 只对应一个 Partition。

 发送消息的时候指定 key/Partition。

分享朋友圈,记录学习每一天~

02

Kafka 如何保证消息不丢失?

正经回答:

生产者丢失消息的情况

生产者(Producer) 调用 send 方法发送消息之后,消息可能因为网络问题并没有发送过去。

所以,我们不能默认在调用 send 方法发送消息之后消息发送成功了。

为了确定消息是发送成功,我们要判断消息发送的结果。

但是要注意的是 Kafka 生产者(Producer) 使用 send 方法发送消息实际上是异步的操作,我们可以通过 get()方法获取调用结果,但是这样也让它变为了同步操作 。

消费者丢失消息的情况

我们知道消息在被追加到 Partition(分区)的时候都会分配一个特定的偏移量(offset)。

偏移量(offset)表示 Consumer 当前消费到的 Partition(分区)的所在的位置。

Kafka 通过偏移量(offset)可以保证消息在分区内的顺序性。

当消费者拉取到了分区的某个消息之后,消费者会自动提交了 offset。

自动提交的话会有一个问题,试想一下,当消费者刚拿到这个消息准备进行真正消费的时候,突然挂掉了,消息实际上并没有被消费,但是 offset 却被自动提交了。

解决办法也比较粗暴,我们手动关闭自动提交 offset,每次在真正消费完消息之后再自己手动提交 offset 。

但是,细心的朋友一定会发现,这样会带来消息被重新消费的问题。

比如你刚刚消费完消息之后,还没提交 offset,结果自己挂掉了,那么这个消息理论上就会被消费两次。

03

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

正经回答:

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

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

- End -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浩说编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
面试官问我如何保证Kafka不丢失消息?我哭了!
不了解 Kafka 的朋友建议先看一看我的下面这几篇文章,第一篇一定要看,其他的可以按需学习。
Guide哥
2020/05/07
2.9K0
面试官问我如何保证Kafka不丢失消息?我哭了!
Java高频面试题- 每日三连问?【Day33】 — Kafka篇(一)
问题导读 一、说说Kafka 是什么?主要应用场景有哪些? 二、和其他消息队列相比,Kafka 的优势在哪里? 三、什么是 Producer、Consumer、Broker、Topic、Partiti
浩说编程
2022/04/12
3350
18道kafka高频面试题哪些你还不会?(含答案和思维导图)
Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。
程序员追风
2019/12/22
1.1K0
18道kafka高频面试题哪些你还不会?(含答案和思维导图)
面试系列-kafka消息相关机制
首先生产者线程main生成消息后调用send方法,然后会经过拦截器、序列化器、分区器(Partition),分区器会对消息进行分区放入不同的本地队列,本地队列保存在计算机的内存中,每个队列32m,每16k数据形成一批消息;
用户4283147
2022/12/29
6780
面试系列-kafka消息相关机制
Java高频面试题- 每日三连问?【Day36】 — Kafka篇(四)
问题导读 一、producer 是否直接将数据发送到broker 的leader(主节点)? 二、Kafa consumer 是否可以消费指定分区消息吗? 三、Kafka 高效文件存储设计特点是什么?
浩说编程
2022/04/12
2330
kafka的架构及常见面试题
Kafka是一种高吞吐量、持久性、分布式的发布订阅的消息队列系统。它最初由LinkedIn(领英)公司发布,使用Scala语言编写,与2010年12月份开源,成为Apache的顶级子项目 。
半月无霜
2023/10/18
6810
kafka的架构及常见面试题
Kafka 基础面试题
答:Apache Kafka是一个发布 - 订阅开源消息代理应用程序。这个消息传递应用程序是用“scala”编码的。基本上,这个项目是由Apache软件启动的。Kafka的设计模式主要基于事务日志设计。
Tim在路上
2020/08/05
7020
kafka面试总结
转自:https://www.cnblogs.com/threecha/p/13737421.html
Spark学习技巧
2021/03/05
7360
Kafka入门篇学习笔记整理
本文只包含Kafka入门使用导学,后续会继续整理Kafka进阶知识与底层原理剖析。
大忽悠爱学习
2023/04/12
1.2K0
Kafka入门篇学习笔记整理
【年后跳槽必看篇】Kafka核心知识点 技术探秘第一章
Kafka是一个成熟的消息队列,是一个天然分布式、支持分区(partition)、多副本(replica)。是基于Zookeeper协调的分布式消息系统。它最大特性就是可以实时的处理大量数据以满足各种需求场景:比如:基于Hadoop的批处理系统,低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等。Kafka使用Scala语言编写的。
@派大星
2024/01/19
3310
Java高频面试题- 每日三连问?【Day9】 — 消息队列篇二
  在一般网络环境下,都存在一定的网络延迟、网络抖动,网络问题导致消息重复发送的情况是难以避免的,毕竟网络环境无法预知。
浩说编程
2021/08/16
3750
Java高频面试题- 每日三连问?【Day9】 — 消息队列篇二
Kafka基础篇学习笔记整理
KafkaProducer会将消息先放入缓冲区中,然后由单独的sender线程异步发送到broker服务端,那么既然消息是批量发送的,那么触发批量发送的条件是什么呢?
大忽悠爱学习
2023/04/23
3.7K0
Kafka基础篇学习笔记整理
kafka key的作用一探究竟,详解Kafka生产者和消费者的工作原理!
每个分区(Partition)都是有序的(所以每一个Partition内部都是有序的),不变的记录序列,这些记录连续地附加到结构化的提交日志中。分区中的每个记录均分配有一个称为偏移的顺序ID号,该ID 唯一地标识分区中的每个记录。
大数据真好玩
2021/04/21
13.7K0
刨根问底 Kafka,面试过程真好使
Kafka最初是由Linkedin公司开发的,是一个分布式的、可扩展的、容错的、支持分区的(Partition)、多副本的(replica)、基于Zookeeper框架的发布-订阅消息系统,Kafka适合离线和在线消息消费。它是分布式应用系统中的重要组件之一,也被广泛应用于大数据处理。Kafka是用Scala语言开发,它的Java版本称为Jafka。Linkedin于2010年将该系统贡献给了Apache基金会并成为顶级开源项目之一。
蔡不菜丶
2022/12/19
5600
刨根问底 Kafka,面试过程真好使
看完这篇Kafka,你也许就会了Kafka[通俗易懂]
Kafka是一种消息队列,主要用来处理大量数据状态下的消息队列,一般用来做日志的处理。既然是消息队列,那么Kafka也就拥有消息队列的相应的特性了。
全栈程序员站长
2022/08/24
10.1K4
看完这篇Kafka,你也许就会了Kafka[通俗易懂]
Kafka进阶面试题分享
1) 缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。
857技术社区
2022/05/17
1.1K0
Kafka进阶面试题分享
Kafka系列1:Kafka概况
Kafka是当前分布式系统中最流行的消息中间件之一,凭借着其高吞吐量的设计,在日志收集系统和消息系统的应用场景中深得开发者喜爱。本篇就聊聊Kafka相关的一些知识点。主要包括以下内容:
王金龙
2020/02/17
8020
真的,关于 Kafka 入门看这一篇就够了
Kafka 是由 Linkedin 公司开发的,它是一个分布式的,支持多分区、多副本,基于 Zookeeper 的分布式消息流平台,它同时也是一款开源的基于发布订阅模式的消息引擎系统。
cxuan
2019/12/02
1.3K0
kafka学习
Apache Kafka是由LinkedIn采用Scala和Java开发的开源流处理(open source、 stream-processing)平台,该项目旨在提供统一的、高吞吐量、低延迟的平台来处理实时数据流。
艾利
2022/08/16
3960
从面试角度一文学完 Kafka
Kafka 是一个优秀的分布式消息中间件,许多系统中都会使用到 Kafka 来做消息通信。对分布式消息系统的了解和使用几乎成为一个后台开发人员必备的技能。
Bug开发工程师
2020/10/26
1.3K0
从面试角度一文学完 Kafka
相关推荐
面试官问我如何保证Kafka不丢失消息?我哭了!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文