一:Kafka的架构是怎么样的?
Kafka 的整体架构比较简单,主要由 Producer(生产者)、broker(Kafka集群)和 consumer(消费者)组成。
生产者:负责发布消息到Kafka集群中的一个或多个主题,每个主题包含一个或多个分区。
(1)Topic(主题) : 每条发布到Kafka集群的消息都有一个类别,这个类别被称为主题。
(2)Partition(分区) : Partition是物理上的概念,体现在磁盘上面,每个主题包含一个或多个分区
消费者:负责从Kafka集群中的一个或多个主题消费消息,并将消费的偏移量提交回Kafka以保证消息的顺序性和一致性
(1)offset 偏移量: 是kafka用来确定消息是否被消费过的标识,在kafka内部体现就是一个递增的数字
Kafka集群:由多个Kafka节点组成的分布式系统,每个节点都可以存储一个或多个主题的分区副本,以提供高可用性和容错能力。
二:Kafka、RocketMQ都有哪些区别?
- 消息传递模型:Kafka主要支持发布-订阅模型,RocketMQ同时支持点对点和发布-订阅两种模型。
- 性能和吞吐量:Kafka在数据处理和数据分发方面表现出色,可以处理每秒数百万条消息,而RocketMQ的吞吐量相对较低。
- 功能支持:
三:Kafka 为什么这么快?
能够实现高吞吐量和低延迟,主要是由于以下几个方面的优化
消息发送:
(1) 批量发送:Kafka 通过将多个消息打包成一个批次,减少了网络传输和磁盘写入的次数
(2)异步发送:生产者可以异步发送消息,不必等待每个消息的确认
(3) 并行发送:通过将数据分布在不同的分区中,生产者可以并行发送消息
(4)消息压缩:支持对消息进行压缩,减少网络传输的数据量。
消息存储:
(1)零拷贝技术:Kafka 使用零拷贝技术来避免了数据的拷贝操作,降低了内存和 CPU 的使用率
(2)磁盘顺序写入:Kafka顺序写入比随机写入速度快很多,因为它减少了磁头寻道时间。避免了随机读写带来的性能损耗,提高了磁盘的使用效率。
(3) 页缓存:Kafka 将数据存储在磁盘中,但在访问数据时,它会先将数据加载到操作系统的页缓存中,并在页缓存中保留一份副本,从而实现快速的数据访问。
消息消费:
(1) 消费者群组:通过消费者群组可以实现消息的负载均衡和容错处理。
(2)并行消费:不同的消费者可以独立地消费不同的分区,实现消费的并行处理。
(3)批量拉取:Kafka支持批量拉取消息,可以一次性拉取多个消息进行消费。减少网络消耗,提升性能
三:kafka消息堆积了怎么解决?
当线上出现消息堆积的问题时,一般有以下几种方式来解决:
- 增加top分区数和消费者数量
- 提升消费者消费速度:比如引入线程池、本地消息存储后即返回成功后续再慢慢消费等。
- 降低生产者的生产速度:如果生产者可控的话,可以让生产者生成消息的速度慢一点。
- 清理过期消息:有一些过期消息,在业务做评估之后,如果影响不大,其实是可以清理的。
- 调整 kafka 的配置参数:kafka提供了很多可配置的参数,例如一次拉取的消息条数等
二:Kafka支持事务消息吗?如何实现的?
- Kafka的事务消息只保证自己发送消息的原子性。而RocketMQ的事务消息是保证本地事务和发送消息的原子性。
- Kafka的事务机制允许一个生产者向多个主题和分区发送消息,并确保这些消息要么全部成功提交,要么全部回滚。事务由生产者负责开启、提交和回滚。Kafka通过引入事务日志和协调器来实现事务消息的管理。
二:什么是延迟消息
延迟消息: 发送者发送消息时指定一个时间,消费者不会立刻收到消息,而是在指定时间之后才收到消息。
延迟任务: 设置在一定时间之后才执行的任务
二:kafka如何实现延时消息?
二:Kafka 消息的发送过程简单介绍一下?
当我们使用Kafka发送消息时,一般有两种方式,分别是同步发送和异步发送。同步发送的时候,通过get方法等待消息结果,要么是成功,要么是失败。而异步发送,是采用了callback的方式进行回调的。Kafka 的 Producer 在发送消息时通常涉及两个线程main线程和Sender线程,和一个消息累加器(RecordAccumulator)。Main线程是 Producer 的入口,负责初始化 Producer 的配置、创建 KafkaProducer 实例并执行发送逻辑,一条消息的发送,在调用send方法后,会经过拦截器、序列化器及分区器。
三:Kafka 为什么有 Topic 还要用 Partition?
1.提升吞吐量:通过将一个Topic分成多个Partition,可以实现消息的并行处理。每个Partition可以由不同的消费者组进行独立消费,这样就可以提高整个系统的吞吐量。
2.负载均衡:Partition的数量通常比消费者组的数量多,这样可以使每个消费者组中的消费者均匀地消费消息。
四: 怎么确定分区数?
四:介绍一下Kafka的ISR机制?
ISR是同步副本的意思,在Kafka中,每个主题分区可以有多个副本,ISR意为和Leader保持同步的Follower+Leader集合,当消息被写入Kafka的分区时,它首先会被写入Leader,然后Leader将消息复制给ISR中的所有副本,只有当ISR中的所有副本都成功地接收到并确认了消息后,Leader才会认为消息已成功提交,这种机制确保了数据的可靠性和一致性。
五:Kafka如何实现顺序消费?
同一个partition中的消息是有序的,但是跨partition,或者跨topic的消息就是无序的了。当生产者向某个partition发送消息时,消息会被追加到该partition的日志文件中,并且被分配一个唯一的 offset,文件的读写是有顺序的。而消费者从该分区消费消息时,会从该分区最早的offset 开始逐个读取消息,保证了消息的顺序性。
实现消息的顺序消费,可以有以下几个办法:
- 在一个topic中,只创建一个partition,这个topic下的消息都会按照顺序保存在同一个partition 中,这就保证了消息的顺序消费。
- 发送消息的时候指定partition,如果一个topic下有多个partition,那么我们可以把需要保证顺序的消息都发送到同一个partition中,这样也能保证顺序消费。
六:Kafka如何保证消息不丢失?
Kafka保证消息不丢失,需要从生产者、消费者以及kafka集群三个方面来分析。
生产者
(1)需要有一个确认机制来告诉生产者这个消息是否有发送成功,我们使用Kafka发送消息的时候,建议使用异步发送,这个方法支持传入一个callback,可以在消息发送时进行重试。
(2)给producer设置一些参数来提升发送成功率
acks=-1 //表示 Leader 和 Follower 都接收成功时确认;可以最大限度保证消息不丢失,但是吞吐量低
retries=3 //生产端的重试次数
retry.backoff.ms = 300 //消息发送超时或失败后,间隔的重试时间
消费者
(1) 为了保证消息不丢失,建议使用手动提交偏移量的方式,避免拉取了消息以后,业务逻辑没处理完,消费者挂了的问题
(2) Kafka消费者还可以组成消费者组,每个消费者组可以同时消费多个分区。当一个消费者组中的消费者宕机或者不可用时,其他消费者仍然可以消费该组的分区,保证消息不丢失。
kafka集群:Kafka集群有一些机制来保证消息的不丢失,比如持久化存储机制以及ISR机制。
(1) 持久化存储:Kafka使用持久化存储来存储消息,这意味着消息在写入Kafka时将被写入磁盘,这种方式可以防止消息因为节点宕机而丢失。
(2)ISR复制机制:Kafka使用ISR机制来确保消息不会丢失,每个分区都有多个副本,副本可以分布在不同的节点上。当一个节点宕机时,其他节点上的副本仍然可以提供服务,保证消息不丢失。
七:为什么Kafka没办法100%保证消息不丢失?
生产者:如果生产者在发送消息之后,Kafka的集群发生故障或崩溃,而消息尚未被完全写入Kafka的日志中,那么这些消息可能会丢失。虽然后续有可能会重试,但是重试也失败了呢?如果这个过程中刚好生产者也崩溃了呢?
Broker:Kafka使用日志来做消息的持久化的,日志文件是存储在磁盘之上的,如果Broker在消息尚未完全写入日志之前崩溃,那么这些消息可能会丢失了。即使Kafka中引入了副本机制来提升消息的可靠性,但是如果发生同步延迟,还没来的及同步,主副本就挂掉了,那么消息就可能会发生丢失。
所以,只靠Kafka自己,是没有办法保证极端情况下的消息100%不丢失的。
八:Kafka怎么保证消费只消费一次的?
- 在Kafka中,每个消费者都必须加入至少一个消费者组。如果一个消息被消费组中的任何一个消费者消费了,那么其他消费者就不会再收到这个消息了。
- 消费者可以通过手动提交消费位移来控制消息的消费情况。通过手动提交位移,消费者可以跟踪自己已经消费的消息,确保不会重复消费同一消息。
- 客户端自己可以做一些幂等机制,防止消息的重复消费。
九:什么是Kafka的重平衡机制?
Kafka 的重平衡机制是指在消费者组中新增或删除消费者时,Kafka 集群会重新分配主题分区给各个消费者,以保证每个消费者消费的分区数量尽可能均衡。在重平衡过程中,所有 Consumer 实例都会停止消费,等待重平衡完成
重平衡的 3 个触发条件:
● 消费者组成员数量发生变化。(新消费者的加入或者退出)
● 订阅主题(Topic)数量发生变化。
● 订阅主题的分区(Partition)数发生变化。