Kafka基础概念介绍

在之前的一篇文章当中介绍了kafka在windows上面的安装以及简单的使用命令,windows 系统 上启动kafka

这篇主要是来介绍以下kafka当中的一些基本概念,先对kafka有一个感性的认识。

消息队列的基本框架是

                   生产者-------》消息队列《----------消费者

生产者(Producer)

   生产者就是消息的创造者,主要工作就是源源不断的产生消息,然后将其发送给消息队列,生产者可以发送各种消息给消息队列。

消费者(Consumer)

    消费者就是不断地从消息队列当中获取消息进行处理。

代理(Broker)

    在消息队列模型当中,Broker所指的就是消息队列本身,在kafka当中broker指的就是kafka Server这台服务,我们可以把部署了KafkaServer的这台机器看做是一个Broker。从流程上来说,生产者将消息发送个broker, 消费者从broker当中获取消息。

主题(Topic)

    主题是一个逻辑上的一个概念,主要是用来对消息进行一个划分,多个生产者可以向一个主题当中发送消息,同时也可以有多个消费者来消费同一个主题当中的消息。Kafka当中每个消息都属于一个主题,每个主题下面可以有任意数量的消息。

消息(Record)

   消息是整个消息队列当中最为基本的一个概念,也是最为原子的概念。它指的是生产者发送与消费者拉取的一个原子事务。一个消息需要关联到一个具体的topic上。消息是由一串字符串所构成,其中主要有key和value两个部分,key和value本质上都是字节数组。当我们在发送消息时,可以省去掉key,直接发送value, 比如上篇文章当中给出的简单例子,我们发送的消息其实都只是value。key的主要作用是根据一定的策略,将消息发送到指定的分区,这样可以保证同一个key值的消息全部都写入到一个分区当中。

集群(Cluster)

     集群指的是多个broker构成的一个整体,对外提供一定的服务,比较类似我们在部署应用的时候,都会采用集群的方式进行部署。集群主要是为了保证其中一个broker挂了之后,kafka还能正常使用。集群当中的各个broker之间通过心跳的方式来确定其他机器是否存活。

控制器(Controller)

    控制器是集群当中的概念,每个集群都会选择一个broker来担任控制器的角色。在一个集群当中,控制器这台broker会控制其他的broker实现相应的功能。控制器主要是负责kafka分区状态,管理每个分区的副本状态,监听zookeeper中数据的变化并作出相应的反馈。所有的broker都会监听Controller的状态,当controller出现故障时,会选举一个新的broker作为controller。

消费者组(Consumer Group)

    kafka当中多个消费者可以组成一个消费者组。消费者组的主要作用是用来实现单播和广播。一个消费者组可以确保其订阅的topic每个分区只能被从属于该消费者组当中的一个消费者所消费。如果不同的消费者组订阅了同一个topic,那么这些消费者组之间是彼此独立的,不会受到干扰。如果我们希望一个消息,被多个消费者所消费,可以将这些消费者放在不同的消费者组中,这个就是广播。如果一个消息只能被一个消费者所消费,那么可以将这些消费者放在同一个组当中,这就是单播。举个例子,在我们实际开发当中,一个应用会采用微服务的形式分成很多个小的应用,比如人员管理系统,消费管理系统,仓库管理系统,每个系统为了保证其稳定性,都设置了多个实例,即多个应用部署,假设现在人员管理系统添加了一个新的人员信息,需要把这个信息作为消息,发送给消费管理系统和仓库管理系统,我们可以把消费管理系统的多个实例,放在一个消费者组当中,这样一个人员信息只会被消费管理系统当中的其中一个应用所获取,仓库管理系统当中的多个实例又是在另外一个消费者组当中,因此仓库管理系统当中只能有一个实例拉取到新增的人员信息然后进行处理。而仓库管理系统和消费管理系统属于不同的消费者组,因此都可以获取到人员信息。

分区(Partition)

   每个主题都可以被划分成多个分区(每个主题至少有一个分区),在同一个主题下,不同分区所包含的内容是不同的,每个消息再被添加到分区当中时,都会被分配一个偏移量(offset),它是消息在分区当中的唯一编号,kafka是通过offset来确保一个分区内的消息顺序的,offset的顺序并不跨越分区,也就是说,在一个分区内消息是顺序的,在不同的分区之间,kafka并不保证消息的顺序。以下是主题和分区之间的关系

 

上图当中每个分区内部是有序的,而分区之间是无序的。基于这样的设计,kafka当中的消息不会随着分区数量的增多而产生损耗,因此存储长时间的数据也没有影响。

kafka当中的消息记录是存储在磁盘上的,通过为每个消息分配offset,就可以保证消息的顺序性,当然消息在磁盘上是有保留时间的,过了这个时间,消息就会被丢弃掉,可以通过修改server.properties文件当中log.retention.hours=168,保留七天,修改后重启生效。

分区的实现:

分区中的消息数据是保存在日志文件当中的,分区在逻辑上对应一个日志,当生产者将消息写入到分区当中时,实际上是写入到了分区对应的日志中。而日志可以看做是一个逻辑上的概念,对应与磁盘上的一个目录,一个日志由多个segment构成,每个Segment对应一个索引文件和日志文件。

分区的作用:

1、借助于分区,可以实现kafka的水平扩展,我们可以通过分区,将同一个主题下的消息保存在不同的kafka server上,当机器的运行能力不足时,只需要增加机器就可以了,在新的机器上创建分区,就可以实现水平扩展。

2、分区可以实现并行处理能力,当一个主题所发送的消息给该主题的所拥有的不同分区中,这样消息就可以实现并行发送和处理,由多个分区来接受信息。

分区的数据存储在server.properties文件中,配置的logs.dir路径下,如果一个主题下存在多个分区,那么每个分区就会对应一个目录,其目录的命名规则是topic+index, index是从0开始。

每个partion当中并不是由一个文件所构成的,因为随着消息数量的增加,如果分区当中的消息都保存在一个文件当中,显然是不够用的,kafka采用的是rolling log,也就是当分区当中的消息数量达到一定程度后,消息文件会进行分割,新的消息会被写到新的文件当中,而这一个个新的文件就叫做segment.

分割分区文件夹下面包含的文件如下

1、0000000000000.index: 这个文件是segment文件的索引文件,他与00000000000.log文件是成对出现的。

2、0000000000000.log: 这是segment文件的数据文件,用于存储实际的消息,该文件是二进制格式的,segment文件的命名格式是,分区的第一个segment从0开始,后续每个segment的文件名为上一个segment文件最后一个消息的offset值。没有数据就用0填充。

3、00000000000000.timeindex:该文件是一个基于日期的索引文件,主要是用在根据日期和时间来找寻消息的场景下,当然我们设置的文件过期时间也会基于这个日期的索引文件来确定哪些是过期的消息

4、leader-epoch-checkpoint : 是一个leader的缓存文件。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值