深入kafka(一)处理请求

本篇文章将深入kafka,介绍集群成员关系、控制器、复制和处理请求等相关内容。

一.集群成员关系

介绍集群成员关系前,我们要清楚集群包含哪些成员,所有关系都是围绕这几个成员展开的:
1.成员:包含broker、zookeeper和kafka组件。
2.关系:

  1. broker启动的时候,它通过创建临时节点把自己的ID注册到zookeeper
  2. kafka组件订阅zookeeper的/brokers/ids路径,当有broker加入或退出集群时,它就会收到通知
  3. kafka组件在broker服务器上安装。

二.控制器

本节将介绍两个概念和三种场景的处理:
1.概念

  1. 控制器:就是一个broker,除了具备一般broker的功能,还负责分区首领的选举
  2. 脑裂:有两个broker同时认为自己是当前的控制器

2.三种场景的处理

  1. 控制器的产生:集群里启动的第一个broker通过在zookeeper里创建一个临时节点让自己成为broker。其他broker在控制器节点上创建zookeeper watch对象,这样就可以接收到这个节点的变更通知
  2. 控制器挂了:剩余的broker通过watch对象得到控制器节点消失的通知,然后尝试使自己成为新的控制器,第一个在zookeeper里成功创建控制器节点的broker会成为新的控制器。
  3. broker离开集群:控制器会为失去首领的分区选择新的首领。告知首领和跟随者,谁是首领谁是跟随者。

三.复制

复制功能是kafka的核心功能,Kafka使用主题来组织数据,每个主题被分为若干个分区,每个分区有多个副本,副本被保存在broker上。本节我们来了解一下什么叫首领副本、跟随者副本、同步副本和不同步副本。
1.首领副本:每个分区都有一个首领副本,为了保证一致性,所有生产者和消费者的请求都会经过这个副本。
2.跟随者副本:

  1. 首领以外的副本都是跟随者副本
  2. 跟随者副本不处理客户端请求
  3. 唯一的任务从首领那里复制消息,保持与首领一致的状态。如果首领发生崩溃,其中一个跟随者就会提升为新首领

3.同步副本:

  1. 持续请求得到的最新消息的副本称为同步副本。
  2. 首领发生失效时,只有同步副本才有可能成为新的首领。

4.不同步副本:

  1. 跟随者10秒内没有请求任何消息。
  2. 虽然在请求消息,但是在10秒内不是请求最新的消息。

四.处理请求

本节将介绍几个相关概念、kafka内部处理流程、获取元数据、broker的操作内容和客户端设置。
1.在介绍broker如何处理请求前,我们先了解几个概念:

  1. Acceptor线程:Broker会在它所监听的每一个端口上运行一个acceptor线程,这个线程会创建一个连接,并把它交给Processor线程处理。
  2. Processor线程:也叫网络线程,负责从客户端获取请求消息,把他们放入“请求对列“,然后从”响应对列“获取响应消息,把他们发送给客户端。
  3. IO线程:处理”请求对列”的消息

2.Kafka处理请求内部流程:
在这里插入图片描述
3.获取元数据:

  1. 问题:客户端怎么知道往哪里发送请求呢?
  2. 答案:客户端会发送元数据请求。请求中包含客户端感兴趣的主题,服务器端的响应消息里指明了这些主题所包含的分区、每个分区有哪些副本,以及哪个副本是首领。
  3. 特点:元数据是缓存到客户端的
  4. 元数据请求策:
    1. 轮询发送元数据请求
    2. 客户端收到“非首领”错误,会触发发送元数据请求
  5. 元数据请求流程:
    在这里插入图片描述

4.处理生产请求Broker会做哪些操作?

  1. 校验:
    1:发送数据的客户是否有主题写入权限
    2:请求里包含的acks值是否有效(只允许:0、1、all)
    3:若acks=all,是否有足够多的同步副本保证消息已经被安全写入

  2. 处理消息:将消息写入磁盘

  3. 返回响应:
    1:acks=0|1,消息被写入分区首领后,响应会被立即返回
    2:acks=all,请求会被放在一个叫做“炼狱”的缓冲区里,直到所有跟随副本都复制了消息,响应才会返回给客户端。

5.处理获取请求Broker会做哪些操作?

  1. 校验:校验指定的偏移量在分区上是否存在,不存在broker将返回一个错误消息

  2. 处理消息:broker按照客户端指定的数量上限从分区里读取消息

6.客户端设置

  1. 设置返回下限:告诉broker“等到有10kb数据的时候再把他们发送给我”。这样可以减少cpu和网络开销

  2. 设置超时时间:告诉broker:“如果你无法在X毫秒内积累满足要求的数据,那么就把当前数据返回给我”

7.另外需要了解一下两点:

  1. 注意:并不是所有保存到分区首领的数据都能返回,而是返回已经被写入同步副本的消息

  2. 零复制:kafka直接把消息文件发送到网络通道。这样避免了字节复制和管理内存缓冲区,从而获得更好的性能。
    在这里插入图片描述

以上就是kafka处理请求的基本操作,哪里说的不对,不吝赐教。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值