zoukankan      html  css  js  c++  java
  • Broker 保存消息(面试题)

    1.Kafka文件存储基本结构

    1)在Kafka文件存储中,同一个topic下有多个不同partition,每个partition为一个目录,partiton命名规则为topic名称+有序序号,第一个partiton序号从0开始,序号最大值为partitions数量减1

    2)每个partion(目录)相当于一个巨型文件被平均分配到多个大小相等segment(段)数据文件中。但每个段segment file消息数量不一定相等,这种特性方便old segment file快速被删除。默认保留7天的数据

    3)每个partiton只需要支持顺序读写就行了,segment文件生命周期由服务端配置参数决定。(什么时候创建,什么时候删除)

    4)数据有序的讨论?

    一个partition的数据是否是有序的? 间隔性有序,不连续

    针对一个topic里面的数据,只能做到partition内部有序,不能做到全局有序。

    特别加入消费者的场景后,如何保证消费者消费的数据全局有序的?伪命题。

    只有一种情况下才能保证全局有序?就是只有一个partition

    2.KafkaPartitionSegment

    (1)Segment file组成:由2大部分组成,分别为index file和data file,此2个文件一一对应,成对出现,后缀".index"和“.log”分别表示为segment索引文件、数据文件。

     

    (2)Segment文件命名规则:partion全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值。数值最大为64位long大小,19位数字字符长度,没有数字用0填充。

    (3)索引文件存储大量元数据,数据文件存储大量消息,索引文件中元数据指向对应数据文件中message的物理偏移地址。

    (4)3,497:当前log文件中的第几条信息,存放在磁盘上的那个地方

      上述图中索引文件存储大量元数据,数据文件存储大量消息,索引文件中元数据指向对应数据文件中message的物理偏移地址。

      其中以索引文件中元数据3,497为例,依次在数据文件中表示第3个message(在全局partiton表示第368772个message)、以及该消息的物理偏移地址为497

    (5)segment data file由许多message组成, qq物理结构如下

    3.Kafka 查找message

    (1)读取offset=368776的message,需要通过下面2个步骤查找

     

    4.查找segment file

    00000000000000000000.index表示最开始的文件,起始偏移量(offset)为0

    00000000000000368769.index的消息量起始偏移量为368770 = 368769 + 1

    00000000000000737337.index的起始偏移量为737338=737337 + 1

    其他后续文件依次类推。

    以起始偏移量命名并排序这些文件,只要根据offset 二分查找文件列表,就可以快速定位到具体文件。当offset=368776时定位到00000000000000368769.index和对应log文件。

    5.通过segment file查找message

    当offset=368776时,依次定位到00000000000000368769.index的元数据物理位置和00000000000000368769.log的物理偏移地址

    然后再通过00000000000000368769.log顺序查找直到offset=368776为止。

    6.消费过程分析

    本质上kafka只支持Topic;

    (1)每个group中可以有多个consumer,每个consumer属于一个consumer group;

    (2)通常情况下,一个group中会包含多个consumer,这样不仅可以提高topic中消息的并发消费能力,而且还能提高"故障容错"性,如果group中的某个consumer失效那么其消费的partitions将会有其他consumer自动接管。

    (3)对于Topic中的一条特定的消息,只会被订阅此Topic的每个group中的其中一个consumer消费,此消息不会发送给一个group的多个consumer;

    (4)那么一个group中所有的consumer将会交错的消费整个Topic,每个group中consumer消息消费互相独立,我们可以认为一个group是一个"订阅"者。

    (5)在kafka中,一个partition中的消息只会被group中的一个consumer消费(同一时刻)

    (6)一个Topic中的每个partions,只会被一个"订阅者"中的一个consumer消费,不过一个consumer可以同时消费多个partitions中的消息。

    (7)kafka的设计原理决定,对于一个topic,同一个group中不能有多于partitions个数的consumer同时消费,否则将意味着某些consumer将无法得到消息。

    (8)kafka只能保证一个partition中的消息被某个consumer消费时是顺序的;事实上,从Topic角度来说,当有多个partitions时,消息仍不是全局有序的

  • 相关阅读:
    无线路由器的工作模式
    php 利用root 权限执行shell脚本
    shell 终端常用插件
    linux space/mark设置
    推送唯一标识符
    微信支付跨平台软件架构
    celery 动态配置定时任务
    两个报文是如何进行 TCP 分组传输
    接口 Interfaces
    How does Circus stack compare to a classical stack?
  • 原文地址:https://www.cnblogs.com/liujinqq7/p/12405018.html
Copyright © 2011-2022 走看看