`

Kafka设计原理,为什么Kafka性能高?如何保证Kafka不丢消息?

 
阅读更多

分布式消息中间件

作用:

1. 解耦(同步调用是一种强依赖,而异步调用是一种弱依赖);

2. 削峰填谷;

3. 降低响应时间;

4. 提升吞吐量(Kafka 的吞吐量是MySQL 吞吐量的30-40倍,并且Kafka的扩展性远高于MySQL);Kafka 的设计原理

Kafka 是一个分布式消息中间件,但是它并不符合JMS 规范,即使消息已经被消费,也不会被马上删除,当消息保留一定时间后,会被批量删除。

在Kafka 中,消息被持久化到磁盘上,因此Kafka 堆积消息的能力非常强大。

Kafka 依赖于 Zookeeper 管理元数据。Kafka 架构图

Broker

Kafka的服务端,负责接收数据,并持久化数据,Broker 可以有多个,每个Broker 可以包含多个 Topic,Broker 并不保存 Offset(消费者消费的位置)数据,由 Consumer 自己负责保存,默认保存在 ZooKeeper 中。

Producer 生产者

生产数据发送到Broker 存储数据。Producer 直连 Broker,不经过任何代理,Producer 将会和 Topic 下所有 Partition Leader 保持 Socket 连接。通常 Producer 是一个包含 Kafka客户端的业务服务。

Consumer 消费者

业务服务从 Broker 订阅Topic,并从 Topic 中接收数据。

每个消费者都属于某个消费者组,一个组里的消费者订阅的是同一个Topic,同一个组的消费者分别订阅同一个 Topic下的不同 Partition 的数据。

需要注意的是,每个 Partition 只能被一个消费者订阅,一个消费者可以订阅多个 Partition,用这种方式避免一定的重复消费。

当一个消费者挂掉之后,会重新进行负载均衡。

Topic 主题

相当于数据库找那个的表名,生产者和消费者之间通过 Topic 建立对应关系。

Topic 更像一个逻辑概念,每个 Topic 下包含了多个 Partition,所有元数据都存储在 ZooKeeper 中。

Partition 分区

Kafka 为了扩展性,提升性能,可以将一个 Topic 拆分为多个分区,每个分区可以独立放到一个 Broker 中。ZooKeeper

Kafka将元数据信息保存在Zookeeper中,但是发送给Topic本身的数据是不会发到ZooKeeper上。

Kafka 使用Zookeeper来实现动态的集群扩展,不需要更改客户端(producer和consumer)的配置。Broker会在Zookeeper注册并保持相关的元数据(topic,partition信息等)更新。

而客户端会在Zookeeper上注册相关的watcher。一旦zookeeper发生变化,客户端能及时感知并作出相应调整。这样就保证了添加或去除Broker时,各Broker间仍能自动实现负载均衡。

这里的客户端指的是Kafka的消息生产端(Producer)和消息消费端(Consumer)。Producer端使用Zookeeper用来"发现"broker列表,以及和Topic下每个partition的Leader建立socket连接并发送消息。也就是说每个Topic的partition是由Leader角色的Broker端使用Zookeeper来注册Broker信息,以及监测partition leader存活性。Consumer端使用Zookeeper用来注册Consumer信息,其中包括Consumer 消费的partition列表等,同时也用来发现broker列表,并和partition leader建立socket连接,并获取消息。

ZooKeeper 在Kafka 集群中承担的作用

Zookeeper管理着Kafka集群中的若干个Broker,保存着一份完整的Broker列表。

维护Topic信息,比如Partitions、Replication Factor、ISR(In-sync Replica)等。

Zookeeper帮助选举Partition的Leader。

当有任何变动时,由Zookeeper给Kafka发送通知,比如添加一个新的Topic、Broker挂掉了、删除Topic等等。

Zookeeper集群中也有Leader和Follower的概念。Leader负责写数据,Follower负责读数据.

存储Kafka集群ID。

存储访问控制列表(ACL,Access Control List)。控制Topic、Consumer Group、User等访问权限。

为什么 Kafka 性能高?顺序写磁盘,媲美内存随机访问的性能。

顺序写磁盘的性能是随机写入的性能的6000倍的提升,磁盘不再是瓶颈点。零拷贝技术,减少上下文切换和拷贝次数。如何保证Kafka 不丢消息?

1. ACK 机制

通过 ACK 机制保证消息送达。Kafka 采用的是至少一次(At least once),消息不会丢,但是可能会重复传输。

2. 复制机制

Kafka 保证可靠性依赖的是复制机制,因为单机容易出现故障。Kafka 以Topic 为单位进行设置复制因子,以 Partition 为单位进行复制,允许一份数据复制到集群中的多个节点上。通过复制,Kafka 在Broker 集群中的部分节点挂掉的情况下,仍然可以继续发送和接收消息。

3. 消息删除机制

Broker 端删除消息有一个配置策略,默认是7天,如果7天消息还没有消费,则有可能被删除,也就是丢消息了。

4. 发送消息

为了得到更好的性能,Kafka 支持在生产者一侧进行本地buffer,也就是累积到一定的条数才发送,如果这里设置不当是会丢消息的。

生产者端设置 producer.type=async, sync,默认是 sync。

当设置为 async,会大幅提升性能,因为生产者会在本地缓冲消息,并适时批量发送。

如果对可靠性要求高,那么这里可以设置为 sync 同步发送。

5. 消费消息

如果更注重可靠性,则需要显示提交 Offset,也就是当所有业务都处理完成的时候,再提交 Offset。这样会导致重复消费,需要提供幂等性接口。

分享到:
评论

相关推荐

    Kafka 消息队列(高清版)深入理解Kafka:核心设计与实践原理.zip

    通过阅读《深入理解Kafka:核心设计与实践原理》这本书,读者可以深入了解Kafka的内部工作机制,掌握如何在实际项目中有效地利用Kafka解决消息传递、数据流处理等问题,提升系统的可靠性和性能。

    kafka细心原理与实战

    Kafka使用了一种高效的文件组织结构来存储消息,以实现高性能的读写操作。 **1. 顺序读写**:Kafka将消息按顺序追加到文件末尾,利用磁盘顺序读写的高效性。 2. **零拷贝**:通过映射文件到内存,避免了数据从内核...

    Kafka-Vip-高性能消息中间件Kafka实战(1)1

    Kafka 是一款高性能的分布式消息中间件,由 Scala 编写,主要特点是高吞吐量、持久化和可扩展性。Kafka 不是严格遵循 JMS 规范,但借鉴了其思想,提供了消息发布订阅功能。在 Kafka 中,消息以 Topic 形式组织,每个...

    Kafka分布式消息队列的高性能研究.pdf

    Kafka的主要设计目标是提供低延迟、高可扩展性和容错性的消息传递服务。在大数据处理场景中,Kafka常用于收集和分发各种日志数据,使得数据能够被实时处理或者离线分析。 【Kafka架构】 Kafka的核心组件包括:...

    Kafka高可用性实现原理

    Kafka 的高可用性实现原理是基于分布式系统架构、消息持久化、复制机制、同步机制、可靠性保证、Topic 和 Partition、Producer 和 Consumer 等机制的结合。这些机制确保了 Kafka 的高可用性和高吞吐量,满足了大多数...

    kafka原理文档1

    下面是kafka的原理文档,涵盖了kafka的架构、设计理念、消息模型、 Partition机制、日志策略、消息可靠性机制等方面。 一、kafka架构 kafka的架构主要包括以下几个部分: *Broker:kafka集群中的每个节点称为...

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

    《深入理解Kafka:核心设计与实践原理》从Kafka的基础概念切入,循序渐进地转入对其内部原理的剖析。《深入理解Kafka:核心设计与实践原理》主要阐述了Kafka中生产者客户端、消费者客户端、主题与分区、日志存储、...

    深入理解Kafka:核心设计与实践原理_朱忠华著_带目录.rar

    《深入理解Kafka:核心设计与实践原理》是由朱忠华编著的一本关于Kafka的专业书籍,旨在帮助读者从基础知识到深入原理全面掌握Kafka。这本书以清晰易懂的文字和直观的图形辅助讲解,既适合初学者快速入门,也满足有...

    Kafka工作原理详解

    综上所述,Kafka通过一系列精心设计的角色和组件,构建了一个高度可靠、可扩展的消息系统。通过对Topic、Partition、Offset等概念的理解,以及对Zookeeper在Kafka中的关键作用的认识,可以帮助我们更好地掌握Kafka的...

    (高清版)深入理解Kafka:核心设计与实践原理.zip

    《深入理解Kafka:核心设计与实践原理》是一本深入探讨Apache Kafka这一分布式流处理平台的专业书籍。Kafka是目前大数据领域中广泛使用的实时数据处理工具,它在消息队列、日志聚合以及流处理等多个场景下发挥着关键...

    大数据Kafka架构原理.pdf

    Kafka是一款高性能、分布式的发布订阅消息系统,由LinkedIn开发并贡献给Apache软件基金会。它被设计成能够处理海量数据,提供高吞吐量、低延迟的消息传递能力。Kafka主要用于构建实时数据管道和流应用,将数据从生产...

    Kafka核心原理与实战(并不是原书,请看描述和评论下载)

    1. **高性能**:通过顺序读写、零拷贝技术以及数据压缩等手段,Kafka实现了极高的数据吞吐量。 2. **可靠性**:通过多副本机制确保数据不会丢失,并且能够快速恢复。 3. **持久化**:消息存储在磁盘上,提供了一种...

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

    《Kafka技术内幕:图文...通过阅读源码,可以更好地理解Kafka如何在实践中解决各种挑战,如何优化性能,以及如何设计一个高可用、可扩展的分布式系统。同时,书中的书签功能可以帮助读者快速定位和回顾重要的知识点。

    kafka及其性能测试

    Kafka具备高性能、可扩展性以及容错能力,因此在大数据处理场景中非常流行。本知识点将详细阐述Kafka的核心概念、使用场景以及性能测试方法。 首先,Kafka的核心概念包括生产者(Producer)、消费者(Consumer)、...

    深入剖析Kafka设计原理:如何构建高效的消息系统

    **深入剖析Kafka设计原理:如何构建高效的消息系统** Kafka是一种分布式流处理平台,由LinkedIn开发并贡献给了Apache软件基金会。它最初被设计为一个高吞吐量、低延迟的发布订阅消息系统,现在已经成为大数据领域的...

    kafka概述及原理.pdf

    综上所述,Apache Kafka是一款功能强大、性能优异的分布式流处理平台,通过其独特的分布式架构、高吞吐量、消息持久化、发布-订阅模型等特性,为企业提供了可靠的实时数据处理解决方案。随着大数据和云计算技术的...

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

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

    Kafka简介及使用PHP处理Kafka消息

    1. 以时间复杂度为 O(1) 的方式提供消息持久化能力,即使对 TB 级以上数据也能保证常数时间复杂度的访问性能。 2. 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒 100K 条以上消息的传输。据了解,Kafka...

    kettle kafka 消息者插件

    Kettle Kafka 消息者插件是为 Pentaho Data Integration(也称为 Kettle 或 PDI)设计的一个组件,目的是为了帮助用户将Kafka数据流集成到Pentaho的数据处理流程中。Pentaho Data Integration 是一个强大的ETL...

Global site tag (gtag.js) - Google Analytics