kafka原理解析
//更多文章请访问主页:https://blog.csdn.net/yuyuyuxiaolei
Apache的Kafka™是一个分布式流平台(a distributed streaming platform)。这到底意味着什么?
我们认为,一个流处理平台应该具有三个关键能力:
- 它可以让你发布和订阅记录流。在这方面,它类似于一个消息队列或企业消息系统。
- 它可以让你持久化收到的记录流,从而具有容错能力。
- 它可以让你处理收到的记录流。
Kafka擅长哪些方面?
它被用于两大类应用:
- 建立实时流数据管道从而能够可靠地在系统或应用程序之间的共享数据
- 构建实时流应用程序,能够变换或者对数据
- 进行相应的处理。
想要了解Kafka如何具有这些能力,让我们从下往上深入探索Kafka的能力。
首先,明确几个概念:
- Kafka是运行在一个或多个服务器的集群(Cluster)上的。
- Kafka集群分类存储的记录流被称为主题(Topics)。
- 每个消息记录包含一个键,一个值和时间戳。
分布式消息系统kafka的提供了一个生产者、缓冲区、消费者的模型
broker:中间的kafka cluster,存储消息,是由多个server组成的集群
topic:kafka给消息提供的分类方式。broker用来存储不同topic的消息数据
producer:往broker中某个topic里面生产数据
consumer:往broker中某个topic获取数据
设计思想
topic与消息
kafka将所有消息组织成多个topic的形式存储,而每个topic又可以拆分成多个partition,每个partition又由一个一个消息组成。每个消息都被标识了一个递增序列号代表其进来的先后顺序,并按顺序存储在partition中。
这样,消息就以一个个id的方式,组织起来。
producer选择一个topic,生产消息,消息会通过分配策略append到某个partition末尾
consumer选择一个topic,通过id指定从哪个位置开始消费消息。消费完成之后保留id,下次可以从这个位置开始继续消费,也可以从其他任意位置开始消费
这个id,在kafka中被称为offset
这种组织和处理策略提供了如下好处:
消费者可以根据需求,灵活指定offset消费
保证了消息不变性,为并发消费提供了线程安全的保证。每个consumer都保留自己的offset,互相之间不干扰,不存在线程安全问题
消息访问的并行高效性。每个topic中的消息被组织成多个partition,partition均匀分配到集群server中。生产、消费消息的时候,会被路由到指定partition,减少竞争,增加了程序的并行能力
增加消息系统的可伸缩性。每个topic中保留的消息可能非常庞大,通过partition将消息切分成多个子消息,并通过负责均衡策略将partition分配到不同server。这样当机器负载满的时候,通过扩容可以将消息重新均匀分配
保证消息可靠性。消息消费完成之后不会删除,可以通过重置offset重新消费,保证了消息不会丢失
灵活的持久化策略。可以通过指定时间段(如最近一天)来保存消息,节省broker存储空间
消息以partition为单位分配到多个server,并以partition为单位进行备份。备份策略为:1个leader和N个followers,leader接受读写请求,followers被动复制leader。leader和followers会在集群中打散,保证partition高可用
producer
producer生产消息需要如下参数:
topic:往哪个topic生产消息
partition:往哪个partition生产消息
key:根据该key将消息分区到不同partition
message:消息
根据kafka源码,可以根据不同参数灵活调整生产、分区策略
iftopic isNonethrowErrorp=NoneifpartitionNotNoneifpartition< 0Orpartition>= numPartitions throwErrorp=partitionelif key NotNonep=hash(key) % numPartitionselsep=round-robin() % numPartitionssend message to the partitionp
上面是我翻译的伪代码,其中round-robin就是简单轮询,hash采用的是murmurhash
consumer
传统消息系统有两种模式:
队列
发布订阅
kafka通过consumer group将两种模式统一处理
每个consumer将自己标记consumer group名称,之后系统会将consumer group按名称分组,将消息复制并分发给所有分组,每个分组只有一个consumer能消费这条消息。
于是推理出两个极端情况:
当所有consumer的consumer group相同时,系统变成队列模式
当每个consumer的consumer group都不相同时,系统变成发布订阅
多consumer并发消费消息时,容易导致消息乱序
通过限制消费者为同步,可以保证消息有序,但是这大大降低了程序的并发性。
kafka通过partition的概念,保证了partition内消息有序吗,缓解了上面的问题。partition内消息会复制分发给所有分组,每个分组只有一个consumer能消费这条消息。这个语义保证了某个分组消费某个分区的消息,是同步而非并发的。如果一个topic只有一个partition,那么这个topic并发消费有序,否则只是单个partition有序。
一般消息消息系统,consumer存在两种消费模型:
push:优势在于消息实时性高。劣势在于没有考虑consumer消费能力和饱和情况,容易导致producer压垮consumer
pull:优势在可以控制消费速度和消费数量,保证consumer不会出现饱和。劣势在于当没有数据,会出现空轮询,消耗cpu
kafka采用pull,并采用可配置化参数保证当存在数据并且数据量达到一定量的时候,consumer端才进行pull操作,否则一直处于block状态
kakfa采用整数值consumer position来记录单个分区的消费状态,并且单个分区单个消息只能被consumer group内的一个consumer消费,维护简单开销小。消费完成,broker收到确认,position指向下次消费的offset。由于消息不会删除,在完成消费,position更新之后,consumer依然可以重置offset重新消费历史消息
相关推荐
### Kafka核心原理与实战 #### 一、Kafka简介与特点 Kafka是一款开源的分布式消息系统,由LinkedIn开发并在2011年开源,现在是Apache顶级项目。其主要设计目的是提供一种高吞吐量的实时消息处理系统,同时支持离线...
本文是系列文章的第4篇,第一篇"第二篇第三篇第四篇第五篇第六篇《Kafka设计解析》系列上一篇《Kafka高性能架构之道——Kafka设计解析(六)》从宏观架构到具体实现分析了Kafka实现高性能的原理。本文介绍了Kafka...
《Kafka源码解析及实战》是一本专为深度学习Apache Kafka的读者设计的教材,旨在帮助读者深入了解Kafka的工作原理及其内部机制。通过源码级别的解析,读者可以更好地掌握Kafka在分布式消息系统中的核心功能和设计...
本文将深入探讨Kafka的核心原理、设计模式以及实际应用,帮助读者深化对这一工具的理解。 【知识点一】:Kafka基本概念 Kafka是由LinkedIn开发并贡献给Apache的开源项目,它是一个分布式流处理平台,主要用于构建...
### Kafka源码解析新手版本(修正版)知识点详解 #### 一、Kafka诞生背景及其在LinkedIn的应用 ...无论是对于初学者还是经验丰富的开发者而言,深入理解Kafka的工作原理和技术细节都是非常有价值的。
通过对Kafka源码的解析,读者可以深入了解其内部工作原理,从而更好地掌握和运用Kafka进行实时数据处理和消息传递。 Kafka的核心概念包括生产者、消费者、主题(Topic)、分区(Partition)和offset。生产者负责将...
Kafka的设计理念和原理,使之能够在商业机器上以每秒处理超过100K条消息的速度运行,且支持数据的分区和分布式消费,保证了单个分区内的消息顺序性。 Kafka的核心特性包括: - 消息持久化能力:Kafka保证了以时间...
### Kafka源码解析与实战 #### 一、Kafka简介 Kafka是由Apache软件基金会开发的一款开源流处理平台,主要用于构建实时数据管道以及基于流的数据处理应用。它以分布式的方式运行,具有高吞吐量、低延迟的特点,适用...
标题中提到的“Kafka源码解析与实战”指向了关于Apache Kafka这个开源流处理平台的深入分析和应用实践。...深入学习Kafka的源码能够帮助开发者更好地掌握其工作原理,并能有效地应用在各种复杂的数据处理场景中。
《Kafka源码解析与实战》是一本专为IT专业人士准备的深度学习Kafka的书籍。Kafka,作为Apache软件基金会的重要项目,是一款高吞吐量的分布式消息系统,广泛应用于大数据实时处理、日志收集、流式计算等多个领域。...
《Kafka源码解析与实战》是一本深入探讨Apache Kafka技术的专业书籍,旨在帮助读者理解Kafka的核心原理、源码实现及其在大数据处理中的实际应用。这本书以清晰无水印的PDF格式呈现,包含了详尽的书签导航,便于读者...
kafka架构原理 1、kafka架构原理简介 2、kafka架构原理深度解析 3、常见问题以及处理方案 4、各种消息中间件的对比 ps:可用于公司技术分享
### Kafka源码解析新手版本 #### 一、Kafka概览与诞生背景 Apache Kafka 是一个高度可扩展的分布式消息系统,由 LinkedIn 开发并开源,后成为 Apache 的顶级项目。Kafka 采用 Scala 编写,其核心设计旨在提供一个...
《深入理解Kafka:核心设计与实践原理》从Kafka的基础...《深入理解Kafka:核心设计与实践原理》主要阐述了Kafka中生产者客户端、消费者客户端、主题与分区、日志存储、原理解析、监控管理、应用扩展及流式计算等内容
1. **Kafka内部机制**:深入源码,解析Kafka的消息存储、网络通信、领导者选举等核心组件的工作原理。 2. **故障恢复与容错**:分析Kafka如何处理节点故障,保持集群的稳定运行。 3. **消费者组管理**:探讨消费者组...
Spring Boot 集群管理工具 KafkaAdminClient 使用方法解析 KafkaAdminClient 是 Spring Boot 集群管理工具中的一部分,主要用于管理和检视 Kafka 集群中的Topic、Broker、ACL 等对象。下面将详细介绍 Kafka...
2. **分区策略**:解析Kafka是如何通过分区来实现数据的分布式存储和负载均衡的。 3. **副本机制**:理解Kafka如何通过复制数据到多个Broker上来保证数据的高可用性和容错能力。 4. **网络通信协议**:分析Kafka使用...
此外,它还会深入讨论Kafka的内置特性,如Offset管理和Consumer Group机制,这些是理解Kafka工作原理的关键。 接着,《Kafka实战指南》则注重实践操作,书中可能包含了大量的实战案例和最佳实践,帮助读者在实际...