黑马Java热门面试题MQ&Kafka(十一)


目录:

(1)哪些场景下会选择 Kafka?

(2)Kafka 架构包含哪些内容?

(3)Kafka 分区的目的?

(4)Kafka 是如何做到消息的有序性?

(5)Kafka Producer 如何提升系统发送消息的效率?

(6)Kafka 发送数据,ack 为 0,1,-1 分别是什么意思?

(7)Kafka 中 consumer group 是什么概念?

(8)Kafka 消息丢失和重复消费怎么处理?

(9)Kafka follower 如何与 leader 同步数据?

(10)Kafka 什么情况下一个 broker 会从 ISR 中被踢出?

(11)为什么 Kafka 不支持读写分离?

(12)解释下 Kafka 中偏移量(offset)的是什么?

(13)Kafka消费消息是采用Pull模式,还是Push模式?

(14)Kafka 创建 Topic 时如何将分区放置到不同的

(15)Kafka 中 partition 的数据如何保存到硬盘?

(16)Kafka 什么时候会触发 Rebalance

(17)KafkaStream 的工作原理?

(18)Kafka 中的幂等是怎么实现的?

(19)KafkaConsumer 是非线程安全的,那么怎么样实现多 线程消费?


(1)哪些场景下会选择 Kafka?

• 日志收集:一个公司可以用 Kafka 可以收集各种服务的 log,通过 kafka 以统一 接口服务的方式开放给各种 consumer,例如 hadoop、HBase、Solr 等。

• 消息系统:解耦和生产者和消费者、缓存消息等。

• 用户活动跟踪:Kafka 经常被用来记录 web 用户或者 app 用户的各种活动,如 浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到 kafka 的 topic 中,然后订阅者通过订阅这些 topic 来做实时的监控分析,或者装载到 hadoop、 数据仓库中做离线分析和挖掘。

• 运营指标:Kafka 也经常用来记录运营监控数据。包括收集各种分布式应用的数 据,生产各种操作的集中反馈,比如报警和报告。

• 流式处理:比如 Spark Streaming 和 Flink

(2)Kafka 架构包含哪些内容?

Kafka 架构分为以下几个部分

• Producer :消息生产者,就是向 kafka broker 发消息的客户端。

• Consumer :消息消费者,向 kafka broker 取消息的客户端。

• Topic :可以理解为一个队列,一个 Topic 又分为一个或多个分区,

• Consumer Group:这是 kafka 用来实现一个 topic 消息的广播(发给所有的 consumer)和单播(发给任意一个 consumer)的手段。一个 topic 可以有多 个 Consumer Group。

• Broker :一台 kafka 服务器就是一个 broker。一个集群由多个 broker 组成。 一个 broker 可以容纳多个 topic。

• Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker 上, 每个 partition 是一个有序的队列。partition 中的每条消息都会被分配一个有 序的 id(offset)。将消息发给 consumer,kafka 只保证按一个 partition 中的 消息的顺序,不保证一个 topic 的整体(多个 partition 间)的顺序。

• Offset:kafka 的存储文件都是按照 offset.kafka 来命名,用 offset 做名字的 好处是方便查找。例如你想找位于 2049 的位置,只要找到 2048.kafka 的文 件即可。当然 the first offset 就是 00000000000.kafka。

(3)Kafka 分区的目的?

分区对于 Kafka 集群的好处是:实现负载均衡。分区对于消费者来说,可以提高并 发度,提高效率。

(4)Kafka 是如何做到消息的有序性?

kafka 中的每个 partition 中的消息在写入时都是有序的,而且单独一个 partition 只能由一个消费者去消费,可以在里面保证消息的顺序性。但是分区之间的消息是 不保证有序的。

(5)Kafka Producer 如何提升系统发送消息的效率?

• 增加 partition 数

• 提高 batch.size

• 压缩消息

• 异步发送

(6)Kafka 发送数据,ack 为 0,1,-1 分别是什么意思?

• 1(默认) 数据发送到 Kafka 后,经过 leader 成功接收消息的的确认,就算是 发送成功了。在这种情况下,如果 leader 宕机了,则会丢失数据。

• 0 生产者将数据发送出去就不管了,不去等待任何返回。这种情况下数据传输 效率最高,但是数据可靠性确是最低的。

• -1producer 需要等待 ISR 中的所有 follower 都确认接收到数据后才算一次发送完 成,可靠性最高。当 ISR 中所有 Replica 都向 Leader 发送 ACK 时,leader 才 commit,这时候 producer 才能认为一个请求中的消息都 commit 了。

(7)Kafka 中 consumer group 是什么概念?

同样是逻辑上的概念,是 Kafka 实现单播和广播两种消息模型的手段。

• 同一个 topic 的数据,会广播给不同的 group;

• 同一个 group 中的 worker,只有一个 worker 能拿到这个数据。

• 换句话说,对于同一个 topic,每个 group 都可以拿到同样的所有数据,但是数 据进入 group 后只能被其中的一个 worker 消费。group 内的 worker 可以使用多 线程或多进程来实现,也可以将进程分散在多台机器上,worker 的数量通常不 超过 partition 的数量,且二者最好保持整数倍关系,因为 Kafka 在设计时假定 了一个 partition 只能被一个 worker 消费(同一 group 内)。

(8)Kafka 消息丢失和重复消费怎么处理?

• 针对消息丢失:同步模式下,确认机制设置为-1,即让消息写入 Leader 和 Follower 之后再确认消息发送成功;异步模式下,为防止缓冲区满,可以在配置文件设 置不限制阻塞超时时间,当缓冲区满时让生产者一直处于阻塞状态;

• 针对消息重复:

–将消息的唯一标识保存到外部介质中,每次消费时判断是否处理过即可。

–消费者处理业务添加分布式锁控制保证业务幂等性

(9)Kafka follower 如何与 leader 同步数据?

kafka 的复制机制既不是完全的同步复制,也不是单纯的异步复制。

• 完全同步复制要求 All Alive Follower 都复制完,这条消息才会被认为 commit, 这种复制方式极大的影响了吞吐率。

• 异步复制方式下,Follower 异步的从 Leader 复制数据,数据只要被 Leader 写入 log 就被认为已经 commit,这种情况下,如果 leader 挂掉,会丢失数据;

• kafka 使用 ISR 的方式很好的均衡了确保数据不丢失以及吞吐率。Follower 可以 批量的从 Leader 复制数据,而且 Leader 充分利用磁盘顺序读以及 send file(zero copy)机制,这样极大的提高复制性能,内部批量写磁盘,大幅减少了 Follower 与 Leader 的消息量差。

(10)Kafka 什么情况下一个 broker 会从 ISR 中被踢出?

leader会维护一个与其基本保持同步的Replica列表,该列表称为ISR(in-sync Replica), 每 个 Partition 都会有一个 ISR,而且是由 leader 动态维护 ,如果一个 follower 比一 个 leader 落后太多,或者超过一定时间未发起数据复制请求,则 leader 将其重 ISR 中移除 。 

(11)为什么 Kafka 不支持读写分离?

Kafka 并不支持主写从读,因为主写从读有 2 个很明显的缺点:

• 数据一致性问题。数据从主节点转到从节点必然会有一个延时的时间窗口,这 个时间 窗口 会导致主从节点之间的数据不一致。某一时刻,在主节点和从节 点中 A 数据的值都为 X, 之后 将主节点中 A 的值修改为 Y,那么在这个变 更通知到从节点之前,应用读取从节点中的 A 数据 的值并不为最新的 Y,由 此便产生了数据不一致的问题。

• 延时问题。类似 Redis 这种组件,数据从写入主节点到同步至从节点中的过程 需要经 历网 络→主节点内存→网络→从节点内存这几个阶段,整个过程会耗 费一定的时间。而在 Kafka 中,主从同步会比 Redis 更加耗时,它需要经历网 络→主节点内存→主节点磁盘→网络→从节 点内存→从节点磁盘这几个阶段。 对延时敏感的应用而言,主写从读的功能并不太适用。

(12)解释下 Kafka 中偏移量(offset)的是什么?

在 Kafka 中,每个 主题分区下的每条消息都被赋予了一个唯一的 ID 数值,用于 标识它在分区中的位置。这个 ID 数值,就被称为位移,或者叫偏移量。一旦消息 被写入到分区日志,它的位移值将不能 被修改。

(13)Kafka消费消息是采用Pull模式,还是Push模式?

Kafka 还是选取了传统的 pull 模式

• Pull 模式的好处是 consumer 可以自主决定是否批量的从 broker 拉取数据。 Push 模式必须在不知道下游 consumer 消费能力和消费策略的情况下决定是 立即推送每条消息还是缓存之后批量推送。如果为了避免 consumer 崩溃而 采用较低的推送速率,将可能导致一次只推送较少的消息而造成浪费。Pull 模式下,consumer 就可以根据自己的消费能力去决定这些策略

• Pull 有个缺点是,如果 broker 没有可供消费的消息,将导致 consumer 不断 在循环中轮询,直到新消息到 t 达。为了避免这点,Kafka 有个参数可以让 consumer 阻塞知道新消息到达(当然也可以阻塞知道消息的数量达到某个特定 的量这样就可以批量发

(14)Kafka 创建 Topic 时如何将分区放置到不同的

• 副本因子不能大于 Broker 的个数;

• 第一个分区(编号为 0)的第一个副本放置位置是随机从 brokerList 选择的;

• 其他分区的第一个副本放置位置相对于第 0 个分区依次往后移。也就是如果我 们有 5 个 Broker,5 个分区,假设第一个分区放在第四个 Broker 上,那么第 二个分区将会放在第五个 Broker 上;第三个分区将会放在第一个 Broker 上; 第四个分区将会放在第二个 Broker 上,依次类推;

• 剩余的副本相对于第一个副本放置位置其实是由 nextReplicaShift 决定的,而 这个数也是随机产生的

(15)Kafka 中 partition 的数据如何保存到硬盘?

topic 中的多个 partition 以文件夹的形式保存到 broker,每个分区序号从 0 递增, 且消息有序 Partition 文件下有多个 segment(xxx.index,xxx.log)segment 文件里 的 大小和配置文件大小一致可以根据要求修改 默认为 1g 如果大小大于 1g 时, 会滚动一个新的 segment 并且以上一个 segment 最后一条消息的偏移量命名

(16)Kafka 什么时候会触发 Rebalance

• Topic 分区数量变更时

• 消费者数量变更时

(17)KafkaStream 的工作原理?

 

• 消费者 订阅出口 topic 消费数据处理业务

(18)Kafka 中的幂等是怎么实现的?

kafka 幂等性指的是消费者处理的幂等性,一旦出现重复消费消息,那么我们要避免 重复消息对业务带来的影响。 解决方案是:生产的消息都要带上业务唯一 ID,消费消息时,可以根据唯一 ID 添加 基于 Redis 的分布式锁防止消息重复进行业务处理。

(19)KafkaConsumer 是非线程安全的,那么怎么样实现多 线程消费?

kafka 消费者多线程消费不应该是一个消费者主线程拉取到消息后,将消息放线程池 交给多个 worker 子线程处理,这种是没法保证线程安全的。 正确的用法应该是同一消费者群组内多个消费者订阅同一主题不同分区的数据,进 行拉取消息消费,消费者彼此之间没有影响,我们可以理解多个消费者就是多个主 线程,不存在 worker 子线程,所以这种用法不存在线程安全问题。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵俺第一专栏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值