什么是 Kafka
Kafka 是一个分布式的,支持多分区、多副本的分布式消息流平台,它同时也是一款开源的**基于发布订阅模式的消息引擎系统,**简单来说就是一个分布式消息队列。
在2.8版本之前,无论是Kafka 集群,还是consumer都依赖于zookeeper集群保存一些meta信息,来保证系统可用性。2.8版本之后使用内嵌的KRaft作为zookeeper部分功能的替代品。
如上图所示,一个典型的 Kafka 集群中包含若干Producer,若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干Consumer Group,以及一个Zookeeper集群。Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance。Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息。
使用场景
活动跟踪
kafka可以用来跟踪用户行为,比如我们经常回去淘宝购物,你打开淘宝的那一刻,你的登陆信息,登陆次数都会作为消息传输到 kafka,当你浏览购物的时候,你的浏览信息,你的搜索指数,你的购物爱好都会作为一个个消息传递给 kafka,这样就可以生成报告,可以做智能推荐,购买喜好等。
传递消息
kafka另外一个基本用途是传递消息,应用程序向用户发送通知就是通过传递消息来实现的,这些应用组件可以生成消息,而不需要关心消息的格式,也不需要关心消息是如何发送的;度量指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
日志记录
Kafka 的基本概念来源于提交日志,比如我们可以把数据库的更新发送到 kafka上,用来记录数据库的更新时间,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。
流式处理
流式处理是有一个能够提供多种应用程序的领域;限流削峰:kafka多用于互联网领域某一时刻请求特别多的情况下,可以把请求写入kafka中,避免直接请求后端程序导致服务崩溃。
基本数据结构
Producer
生产者,发送消息的一方,负责创建消息发给kafka,会把消息发送到指定的topic里。
Comsumer
消费者,连接kafka并接收消息,对指定的topic进行消费消息。
Comsumer group
一个消费者组可以包含n个消费者,同一组的消费者会去消费指定的topic,保证不会重复消费同一条消息。
因为topic里包含多个partition,kafka规定一个partition不能由多个comsumer消费,如果消费组的comsumer数量小于partition的,就会导致多余的comsumer线程空闲,如果大于那么comsumer会进行轮询直到消费完所有的partition,所以消费组里的comsumer的数量跟partition一致可达到最高利用率。
Broker
服务代理节点,也就是服务节点,kafka的服务器。
Topic
kafka的消息以topic为单位进行划分,生产者将消息发送到特定的topic,而消费者负责订阅topic的消息并进行消费。
Partition
topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列。消息到来时会使用轮询制往每个partition写入,如下图。
kafka默认使用的是hash进行分区,所以同一个topic下的不同partition包含的消息是不同的。
物理上每个partition对应的是一个文件夹,其命名规则为topic名称+有序序号,第一个partiton序号从0开始,序号最大值为partitions数量减1。而文件夹里存储的当然是文件,这个文件就是segment。
Segment
partition包含多个segment,每个segment对应一个文件,partition全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值。数值最大为64位long大小,19位数字字符长度,没有数字用0填充。
segment可以手动指定大小(log.segment.bytes),当segment达到阈值时,将不再写数据。
记录只会被append到segment中,不会被单独删除或者修改,每个segment中的消息数量不一定相等。
而segment又分为索引跟手数据文件,2个文件是相关对应的,如下图:
- 索引文件:以.index结尾的文件,采取稀疏索引存储方式,它减少索引文件大