0


中间件之Kafka第一篇

1、什么是kafka?它能解决什么问题?

简介

    Apach Kafka是一款分布式流处理平台,用于实时构建流处理应用。它有一个核心的功能广为人知,即作为企业级的消息引擎被广泛使用。

作用

  1. 解耦:短信发送成功后,需要通知A、B、C、D等服务,我们只管发送到MQ不用耦合一个个通知其他服务。通道商回调通知短信发送情况,需要通知A、B、C、D等服务,我们只管发送到MQ不用耦合一个个通知其他服务。
  2. 异步:用户注册后,发送短信和邮件,通过发送MQ异步消费的形式实现,可以减少接口的耗时。用户购买后,发送push通知和券激励,通过发送MQ异步消费的形式实现,可以减少接口的耗时。
  3. 削峰:秒杀保护服务

2、kafka整体架构?

0.8版本之前的架构图

在 0.8版本之后,consumer 不会再与zookeeper直接通信了

  • broker集群(可以有多个) - 每个kafka server称为一个Broker,多个borker组成 Kafka Cluster。
  • 生产者组(可以有多个)
  • 消费者组(可以有多个)
  • Topic(可以包含多个分区,同时每个分区可以有多个副本) - 创建时需要选择存储在哪个broker cluster- 需要指定分区partition的数量,默认4

消费组中的消费数目与主题中的分区数目关系?

  • 消费者数小于分区数,此时一个消费者会消费多个分区
  • 消费者数大于分区数,此时一个消费者会消费一个分区,多余消费者会空闲

3、Topic的分区是如何存储在broker的磁盘?请描述知道offset从broker检索消息的过程?

逻辑 message 属于 topic 的哪个 partition。

日志采用分段存储

  • 索引文件分段
  • 存储文件分段

日志分段配置

server.properties

    log.segment.bytes=1073741824(1G)

    log.dirs=/tmp/kafka-logs

日志内容解读【下面是一行物理日志信息】

baseOffset: 1778276 lastOffset: 1778362 count: 87 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 0 CreateTime: 1645765269680 size: 44169 magic: 2 compresscodec: NONE crc: 1917853349 isvalid: true

一条批消息(Record Batch)日志记录,包含多条的实际数据 lastOffset - baseOffset + 1 = count

  • baseOffset和lastOffset为批消息中第一条记录和最后一条记录的偏移量,在整个topic分区中的偏移量
  • count为批消息中包含的记录数
  • position为批消息的起始位置(这里应该是物理地址),每个log文件中,position 都是从0开始的
  • CreateTime在批消息中为批消息中最后一条记录的创建时间,在记录中为记录的创建时间
  • size为批消息的大小,从内容可以看出,前一条批消息的position,加上前一条消息的size,结果为后一条消息的position
  • offset为记录的偏移量,整个topic分区中的偏移量
  • size为一条记录的大小
  • 其他字段有些没有用到,所以显示-1,有些暂时也不清楚

偏移量索引文件

偏移量索引(.index)项的格式如下图所示。每个索引项占用8个字节,分为两个部分。

  • relativeOffset:相对偏移量,表示消息相对于baseOffset 的偏移量,即消息的offset - baseOffset,占用4个字节,当前索引文件的文件名即为 baseOffset 的值。消息的 offset 占用8个字节,也可以称为绝对偏移量。索引项中没有直接使用绝对偏移量而改为只占用4个字节的相对偏移量(relativeOffset =offset - baseOffset),这样可以减小索引文件占用的空间。
  • position:物理地址,也就是消息在日志分段文件中对应的物理位置(即 .log 文件的 position 字段),占用4个字节。

如果要查找偏移量为268的消息,过程应该是:首先是定位到 baseOffset 为251的日志分段,然后计算相对偏移量relativeOffset = 268 - 251 = 17 ,之后再在对应的索引文件中找到不大于17的索引项,最后根据索引项中的 position 定位到具体的日志分段文件位置开始查找目标消息。

偏移量索引文件

时间戳索引(.timeindex)项的格式,每个索引项占用12 个字节,分为两个部分。

  • timestamp : 当前日志分段最大的时间戳。
  • relativeOffset :时间戳所对应的消息的相对偏移量。

时间戳索引文件中包含若干时间戳索引项,每个追加的时间戳索引项中的 timestamp 必须大于之前追加的索引项的 timestamp ,否则不予追加。

4、消费者如何利用零拷贝技术提高效率?

消息消费的基本流程

  1. broker收到consumer的消费请求
  2. broker从磁盘读取消息
  3. broker通过网络将消息发送给consumer

传统的消息消费流程

默认有4次拷贝

  1. 磁盘到内核缓存冲区
  2. 内核缓存冲区到用户缓冲区
  3. 用户缓冲区到socket缓冲区
  4. socket缓冲区到网卡

零拷贝方式消费流程


本文转载自: https://blog.csdn.net/zwy_992/article/details/134632091
版权归原作者 写的更好 所有, 如有侵权,请联系我们删除。

“中间件之Kafka第一篇”的评论:

还没有评论