Kafka原理简易说明
kafka是消息队列。
它是队列,传递消息(信息)用的。
它可以用在系统整合、解耦、消峰等场合。
1、最简单的逻辑流程
kafka的broker(服务器)创建一个Topic(主题)
Producer(生产者)向这个topic发送(push)消息
Consumer(消费者)订阅这个主题,从broker拉取(pull)消息
2、最简单的物理流程
Producer向Broker发送消息
Broker将消息顺序写入磁盘
Consumer决定从什么offset(位置)开始拉取信息
3、提高磁盘效率
现在我们有一块连续的磁盘空间存储消息。如果读和写的压力增大,这块空间的IO压力也会增大。为了缓解这种压力,kafka可以为一个topic设置多个Partition(分区)。broker根据某种规则(比如key取模),将消息分发到对应的Partition中,一个Partition又分成多个segment文件进行存储,还有对应的索引文件。
Partition相当于增加了磁盘IO的并行度。可以想到,Partition设置在不同的磁盘上(不同的服务器上)效率是最高的,同一块磁盘不宜设置过多的Partition,这样会打断磁盘顺序读写。
每一个Consumer或一个组Consumer,对应每一个Partition维护一个offset。
4、提高写效率
可以通过增加Producer的实例来提高发送消息的效率。也可以指定某个Producer向某个Partition发送消息。
发送消息可以接收broker返回是否成功的信息,也可以不接收。
可以设置消息发送成功的条件,有几个broker接收到消息算成功。这个数值越少,发送越快,但可靠性更低。
5、提高读效率
同样可以通过增加Consumer实例来提高读取的效率。
可以把多个Consumer设置在一个group里,一个group里的Consumer使用一个offset,不会重复消费消息。这样就提高了读取的并行度。
Consumer也可以指定从哪个Partition读取数据。
6、提高健壮性
从上面到现在为止,kafka里的消息都没有备份,一旦磁盘发生故障,消息就会有损失。
从0.8版本开始kafka提供partition的Replication(复制)。
Replication的数量过多会影响系统的吞吐量,默认数量是1。
在复制里,每个Partition有一个leader和若干个follower,信息都写到leader上,follower定期批量复制leader上的信息。
通过zookeeper来验证broker是否存活,通过"in sync"的node list来维护follower是否可用。
7、均衡
如果Consumer未指定从某个Partition获取数据,broker会对Consumer做一些均衡处理,使它们尽量平均分配到Partitions中。增加和较少Consumer的数量都有可能触发Rebalance(重均衡)。
8、exactly once
有且仅有一次。
我们希望消息在发送和消费的过程中,被使用且只被使用一次,不过要保证这样则要消耗大量的成本(开发成本、运行时间成本、系统复杂度成本等)。
发送:
保证有一次:设置发送成功返回信息,可保证发送的信息已保存。
保证只有一次:Producer在发送时可以设置幂等,也就是key相同时,只被写入一次。那么如果想实现发送的exactly once就需要业务逻辑上保证每一条消息的key确定且唯一。
消费:
保证有一次:数据保存在kafka里就可以随时读取。kafka默认保存7日数据,可以通过设置改变。
保证只有一次:Consumer要保证exactly once稍微复杂一点,消费消息实际上分为两步:
-
通过offset从partition取数据
-
使用这份数据做业务处理
一种保证消费exactly once的方式:
业务处理成功,则修改offset,业务处理不成功,则回滚。
显然,如果把这两步放在一个Transaction(事务)中,则可以实现消费的exactly once。
这需要在业务处理的地方去维护offset。
但是事务的方式一般是阻塞的,它可以保证消息的消费顺序,但会影响消费的效率。
另一种消费exactly once的方式:
将读取和处理分开,读取到数据就修改offset,保证下一次读取尽快进行。
处理消息时,如果失败,则将该消息重新传出消息队列,或记录在其他地方,后面再做处理。这种方式效率会高一些,但打乱了消息的顺序。而且这种方式其实跟kafka没什么关系,主要是业务逻辑的保障。
相关推荐
### Kafka核心原理与实战 #### 一、Kafka概述与特点 Kafka是一款开源的分布式消息系统,由LinkedIn开发并在2011年开源,现在是Apache顶级项目。其主要设计目的是为了提供一种高吞吐量、低延迟的发布订阅模型,适用...
kafka原理文档1 kafka是一种高吞吐量、基于发布/订阅模式的消息队列系统。下面是kafka的原理文档,涵盖了kafka的架构、设计理念、消息模型、 Partition机制、日志策略、消息可靠性机制等方面。 一、kafka架构 ...
kafka原理优化及参数。 可恢复性 系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。 顺序保证 在...
运维,java开发,消息中间件,Kafka原理剖析及实战演练视频教程,刚刚买的
Kafka是一款高性能、分布式的发布订阅消息系统,由LinkedIn开发并贡献给Apache软件基金会。它被设计成能够处理海量数据,提供高...理解并掌握Kafka的工作原理和使用方法,对于构建高效、可靠的数据处理系统至关重要。
### Apache Kafka概述及原理 #### 一、Apache Kafka简介 Apache Kafka是一款开源的分布式流处理平台,由LinkedIn公司创建,并于2011年捐赠给Apache软件基金会,现已成为Apache顶级项目之一。Kafka主要用于构建实时...
自己花钱买的视频教程,做JAVA开发一定要学习的哦,即使没有在实际项目中使用过,也是面试时的敲门砖,一点都不了解的话,想进互联网企业怕是很困难的,放上来只想赚点积分,方便自己下载别的资源,来支持一个
### Kafka工作原理详解 #### 一、Kafka的角色与组件 Kafka作为一款分布式消息系统,在实际应用中涉及多种角色及组件,它们协同工作确保消息的高效传递。 1. **Broker**:Kafka集群的基本单元,一个Broker可以视为...
《深入理解Kafka:核心设计与实践原理》从Kafka的基础概念切入,循序渐进地转入对其内部原理的剖析。《深入理解Kafka:核心设计与实践原理》主要阐述了Kafka中生产者客户端、消费者客户端、主题与分区、日志存储、...
kafka是一个分步数据流平台,可以分布在单个服务器上,也可以分布在多个服务器上部署形成集群,提供了发布和订阅功能,使用者可以发送数据到kafka中,也可以从kafka中读出数据,kafka具有高吞吐,低延迟,高容错等...
《Kafka 消息队列(高清版)深入理解Kafka:核心设计与实践原理》是一本详尽探讨Apache Kafka的书籍,旨在帮助读者深入掌握Kafka的核心设计理念和实际操作技巧。Kafka是一个分布式流处理平台,广泛应用于大数据处理...
kafka架构原理 1、kafka架构原理简介 2、kafka架构原理深度解析 3、常见问题以及处理方案 4、各种消息中间件的对比 ps:可用于公司技术分享
《深入理解Kafka:核心设计与实践原理》是由朱忠华编著的一本关于Kafka的专业书籍,旨在帮助读者从基础知识到深入原理全面掌握Kafka。这本书以清晰易懂的文字和直观的图形辅助讲解,既适合初学者快速入门,也满足有...
Kafka高可用性实现原理 Kafka 作为一个分布式消息系统,具有高可用性和高吞吐量的特点。其高可用性实现原理可以从以下几个方面来分析: 1. 分布式系统架构 Kafka 的架构是基于分布式系统的,包括 Producer、...
《深入理解Kafka:核心设计与实践原理》是一本深入探讨Apache Kafka这一分布式流处理平台的专业书籍。Kafka是目前大数据领域中广泛使用的实时数据处理工具,它在消息队列、日志聚合以及流处理等多个场景下发挥着关键...
### Kafka核心原理与实战 #### 一、Kafka简介与特点 Kafka是一款开源的分布式消息系统,由LinkedIn开发并在2011年开源,现在是Apache顶级项目。其主要设计目的是提供一种高吞吐量的实时消息处理系统,同时支持离线...
二、Kafka API 说明 1. **Producer API**:生产者API允许应用程序将消息发布到Kafka的主题。它提供了同步和异步两种发送消息的方式,以及控制消息发送的策略,如批处理和错误重试。 2. **Consumer API**:消费者...
Kafka原理剖析及实战演练视频教程,高性能跨语言的分布式发布/订阅消息系统,数据持久化,全分布式,同时支持在线和离线处理