概述
Apache Kafka 是一种分布式流处理平台,它的主要作用是处理大规模的实时数据流。它的核心概念是消息系统,其中消息由生产者发布到一个或多个主题,消费者订阅这些主题并接收消息。
Kafka的核心原理是消息队列,即在消息的发布和消费之间缓存消息的缓冲区。消息在生产者发布后,会被保存在一个或多个Kafka的分区中。每个分区可以有多个副本,这些副本会分布在不同的Kafka节点上,以提高可靠性和可用性。
消费者从指定的分区中读取消息,并将其处理或转发给其他系统。消费者可以通过轮询或流式处理方式读取消息。消费者可以按照指定的顺序读取消息,或者以并行方式读取多个分区中的消息。
Kafka支持多种协议和API,包括Producer API、Consumer API和Stream API等,它们都是基于Kafka的核心消息队列原理而构建的。同时,Kafka还提供了一些高级功能,例如消息的压缩、事务支持、精确一次性传递等,以满足不同的应用需求。
kafka快的原因
分布式架构:Kafka采用了分布式的架构设计,可以将数据分布存储在多个节点上,实现数据的水平扩展。这样可以有效地利用集群中多台服务器的计算和存储资源,提高整体的处理能力和吞吐量。
高效的消息存储机制:Kafka使用高效的消息存储机制,将消息持久化存储在磁盘上,并采用顺序写入的方式。这种设计使得Kafka能够快速地写入和读取大量的消息,同时保证数据的持久性和可靠性。
零拷贝技术:Kafka利用了操作系统的零拷贝技术,在消息的传输和存储过程中尽量减少数据的拷贝操作,提高了数据的传输效率和性能。
批量处理:Kafka支持批量处理消息,可以将多个消息一起发送到Broker或者一次性读取多个消息。这种批量处理机制可以减少网络传输和磁盘IO的开销,提高了数据传输和存储的效率。
基于内存的索引:Kafka使用基于内存的索引来管理消息的偏移量,可以快速定位消息的位置。这种索引机制使得Kafka能够在读取消息时快速定位到目标消息,提高了消息的读取效率。
kafka怎么保证数据不丢失不重复消费
Kafka 通过多个机制来确保消息不会丢失且不会被重复消费:
持久化存储:Kafka 使用持久化存储机制将消息写入到磁盘,这样即使在消息被消费之后,消息仍然会被保存在磁盘上。这样可以保证即使在消费者处理消息时出现故障,消息也不会丢失。
复制机制:Kafka 使用副本机制将消息复制到多个 Broker 上。当消息被写入到主题时,Kafka 会将消息复制到多个副本中,并确保每个副本都同步到相同的偏移量。这样即使某个 Broker 发生故障,消息仍然可以从其他 Broker 上获取。
消费者位移提交:Kafka 的消费者会定期将已经消费的消息的位移提交到 Kafka 的内部主题中。这样即使消费者发生故障,下一次启动时可以从上一次提交的位移处继续消费消息,避免了消息的重复消费。
Exactly Once 语义:Kafka 提供了 Exactly Once 语义的支持,即确保消息在生产者发送到 Broker 到消费者消费的整个过程中,每条消息都只被处理一次且不会丢失。这是通过事务、幂等性和 Exactly Once 语义的设计来实现的。
kafka一些关键参数
broker.id:每个 Kafka Broker 都必须有一个唯一的 broker.id,用于在集群中标识自己。
listeners:用于指定 Kafka Broker 监听的地址和端口,包括外部访问地址和内部通信地址。
log.dirs:Kafka 存储消息数据的目录路径。
zookeeper.connect:用于指定 Kafka 使用的 ZooKeeper 连接地址。
num.partitions:用于指定主题的默认分区数。
default.replication.factor:用于指定主题的默认副本因子,即每个分区的副本数量。
offsets.topic.replication.factor:用于指定 Kafka 内部存储消费者位移的主题的副本因子。
log.retention.hours:用于指定消息在 Kafka 中的保留时间,超过该时间的消息将被自动删除。
message.max.bytes:用于指定单个消息的最大字节数。
replica.fetch.max.bytes:用于指定每次从 Leader Broker 同步消息到 Follower Broker 的最大字节数。
min.insync.replicas:用于指定每个分区中需要保持同步的最小副本数,用于消息的可靠性保证。
unclean.leader.election.enable:用于指定是否允许在 ISR 集合之外选择 Leader,用于故障恢复。
auto.create.topics.enable:用于指定是否允许自动创建不存在的主题。
auto.offset.reset:用于指定消费者在消费一个没有偏移量的分区或者偏移量无效的情况下的行为策略,包括 earliest、latest、none。
compression.type:用于指定消息的压缩类型,包括 none、gzip、snappy、lz4。
batch.size:用于指定生产者在发送消息之前等待积累的消息批量大小。
acks 参数:acks 参数指定了生产者接收到确认消息的方式。它可以设置为以下几种值之一:
acks=0:生产者不会等待任何来自服务器的确认,直接发送下一条消息。这种设置下,消息可能会丢失,因为生产者无法知道消息是否已经成功写入到服务器中。
acks=1:生产者在消息被 Leader Broker 成功接收后会收到确认消息。这种设置下,消息可能会丢失,因为 Leader Broker 可能在将消息写入到本地日志之后但尚未复制到所有的 ISR 中就宕机了。
acks=all:生产者在消息被 Leader Broker 成功接收并且所有的 ISR 都复制了该消息后才会收到确认消息。这种设置下,消息不会丢失,但会降低生产者的性能,因为需要等待所有 ISR 中的所有副本都复制成功后才返回确认消息。
kafka 零拷贝技术
Kafka 使用了操作系统的零拷贝(Zero Copy)技术,这是一种在数据传输过程中减少数据拷贝的方法,能够提高数据传输的效率和性能。具体来说,Kafka 在以下几个方面应用了零拷贝技术:
数据写入:在生产者将消息写入到 Kafka Broker 时,Kafka 利用零拷贝技术直接将数据从生产者的内存缓冲区写入到内核缓冲区,而不需要先将数据拷贝到内核缓冲区中,然后再写入到磁盘。这样可以减少一次数据的拷贝操作,提高数据写入的效率。
数据传输:在 Broker 将消息从内核缓冲区传输到磁盘时,Kafka 也利用零拷贝技术直接将数据从内核缓冲区传输到磁盘,而不需要先将数据拷贝到用户空间,然后再传输到磁盘。这样可以减少一次数据的拷贝操作,提高数据传输的效率。
数据发送:在消费者从 Kafka Broker 拉取消息时,Kafka 利用零拷贝技术直接将数据从内核缓冲区发送到网络套接字,而不需要先将数据拷贝到用户空间,然后再发送到网络套接字。这样可以减少一次数据的拷贝操作,提高数据发送的效率。
通过利用零拷贝技术,Kafka 能够减少数据传输过程中不必要的数据拷贝操作,提高数据传输的效率和性能。这对于高吞吐量、低延迟的消息传输非常重要,能够有效地提升 Kafka 的性能表现。