`
于佳磊
  • 浏览: 5065 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

                                                 kafka原理解析

//更多文章请访问主页:https://blog.csdn.net/yuyuyuxiaolei

Apache的Kafka™是一个分布式流平台(a distributed streaming platform)。这到底意味着什么?

我们认为,一个流处理平台应该具有三个关键能力:

  1. 它可以让你发布和订阅记录流。在这方面,它类似于一个消息队列或企业消息系统。
  2. 它可以让你持久化收到的记录流,从而具有容错能力。
  3. 它可以让你处理收到的记录流。

Kafka擅长哪些方面?

它被用于两大类应用:

  1. 建立实时流数据管道从而能够可靠地在系统或应用程序之间的共享数据
  2. 构建实时流应用程序,能够变换或者对数据
  3. 进行相应的处理。

想要了解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简介与特点 Kafka是一款开源的分布式消息系统,由LinkedIn开发并在2011年开源,现在是Apache顶级项目。其主要设计目的是提供一种高吞吐量的实时消息处理系统,同时支持离线...

    KafkaStream分布式流式处理的新贵-Kafka设计解析(七)

    本文是系列文章的第4篇,第一篇"第二篇第三篇第四篇第五篇第六篇《Kafka设计解析》系列上一篇《Kafka高性能架构之道——Kafka设计解析(六)》从宏观架构到具体实现分析了Kafka实现高性能的原理。本文介绍了Kafka...

    Kafka源码解析及实战

    《Kafka源码解析及实战》是一本专为深度学习Apache Kafka的读者设计的教材,旨在帮助读者深入了解Kafka的工作原理及其内部机制。通过源码级别的解析,读者可以更好地掌握Kafka在分布式消息系统中的核心功能和设计...

    [转]Kafka深度解析

    本文将深入探讨Kafka的核心原理、设计模式以及实际应用,帮助读者深化对这一工具的理解。 【知识点一】:Kafka基本概念 Kafka是由LinkedIn开发并贡献给Apache的开源项目,它是一个分布式流处理平台,主要用于构建...

    kafka源码解析新手版本(修正版)

    ### Kafka源码解析新手版本(修正版)知识点详解 #### 一、Kafka诞生背景及其在LinkedIn的应用 ...无论是对于初学者还是经验丰富的开发者而言,深入理解Kafka的工作原理和技术细节都是非常有价值的。

    Kafka深度解析PDF 下载

    《Kafka深度解析》这本书是Java开发者深入了解Apache Kafka这一分布式流处理平台的重要参考资料。Kafka是一种高吞吐、低延迟的消息系统,广泛应用于大数据实时处理、日志收集、流式计算等多个领域。以下是对Kafka...

    Kafka设计解析

    Kafka的设计理念和原理,使之能够在商业机器上以每秒处理超过100K条消息的速度运行,且支持数据的分区和分布式消费,保证了单个分区内的消息顺序性。 Kafka的核心特性包括: - 消息持久化能力:Kafka保证了以时间...

    Kafka核心设计与实践原理.zip

    《深入理解Kafka:核心设计与实践原理》从Kafka的基础...《深入理解Kafka:核心设计与实践原理》主要阐述了Kafka中生产者客户端、消费者客户端、主题与分区、日志存储、原理解析、监控管理、应用扩展及流式计算等内容

    Kafka技术架构原理分享ppt

    kafka架构原理 1、kafka架构原理简介 2、kafka架构原理深度解析 3、常见问题以及处理方案 4、各种消息中间件的对比 ps:可用于公司技术分享

    kafka源码解析新手版本

    ### Kafka源码解析新手版本 #### 一、Kafka概览与诞生背景 Apache Kafka 是一个高度可扩展的分布式消息系统,由 LinkedIn 开发并开源,后成为 Apache 的顶级项目。Kafka 采用 Scala 编写,其核心设计旨在提供一个...

    Spring Boot集群管理工具KafkaAdminClient使用方法解析

    Spring Boot 集群管理工具 KafkaAdminClient 使用方法解析 KafkaAdminClient 是 Spring Boot 集群管理工具中的一部分,主要用于管理和检视 Kafka 集群中的Topic、Broker、ACL 等对象。下面将详细介绍 Kafka...

    Kafka全面教程,适合项目实战(包括源码剖析)

    2. **分区策略**:解析Kafka是如何通过分区来实现数据的分布式存储和负载均衡的。 3. **副本机制**:理解Kafka如何通过复制数据到多个Broker上来保证数据的高可用性和容错能力。 4. **网络通信协议**:分析Kafka使用...

    Kafka详细课程讲义

    本课程主要涵盖了Apache Kafka的核心概念、安装配置、架构解析、API使用以及监控与面试知识点,旨在帮助学习者全面理解并掌握这一强大的分布式流处理平台。 **第 1 章 Kafka 概述** Apache Kafka是一款高吞吐量的...

    Kafka技术内幕:图文详解Kafka源码设计与实现+书签.pdf+源码

    书中对这些关键点的源码实现进行了详细的解析,对于想要深入了解Kafka内部运作原理的开发者来说,是一份宝贵的资源。通过阅读源码,可以更好地理解Kafka如何在实践中解决各种挑战,如何优化性能,以及如何设计一个高...

    Kafka官方中文文档.pdf

    这些内容深入解析了Kafka之所以能够高效可靠地处理数据流的设计原理。 实现部分涉及到了Kafka的网络层、消息、消息格式、日志和分布式架构。这部分内容着重描述了Kafka作为高性能、可伸缩消息系统的内部工作机制。 ...

    kafka深入学习资料

    这份“kafka深入学习资料”压缩包包含了三本关于Kafka的PDF文档,可以帮助你深入理解和掌握Kafka的核心概念、工作原理以及源码分析。 首先,我们来看《Apache Kafka源码剖析》.pdf,这本书通常会详细讲解Kafka的...

    有关kafka的三本电子书,电子文档

    Offset管理使得消息的生产和消费状态得以追踪和恢复,而Consumer Group则支持了消费者集群的水平扩展,这些都是读者理解Kafka工作原理必须要掌握的内容。 《Kafka实战指南》则是一本面向实践者的指南,它不仅仅...

    spring-kafka源代码

    本文将围绕Spring Kafka的源代码进行深度解析,帮助开发者更好地理解和运用这个库。 一、Spring Kafka简介 Spring Kafka的核心目标是简化Kafka的生产和消费操作,同时保持灵活性和可配置性。它通过Spring的声明式...

    图解 Kafka 之实战指南.7z

    《图解 Kafka 之实战指南》是一本深入解析Apache Kafka的实用书籍,旨在帮助读者理解和掌握这个分布式消息系统的精髓。Kafka是一个高吞吐、低延迟的开源流处理平台,常用于实时数据管道和流应用的构建。在这个实战...

Global site tag (gtag.js) - Google Analytics