1 kafka架构与工作原理

1  什么是kafka?

官方定义:Kafka is used for building real-time data pipelines and streaming apps. It is horizontally scalable, fault-tolerant, wicked fast, and runs in production in thousands of companies.

翻译为中文:Kafka 用于构建实时数据管道和流式传输应用程序。它具有水平可扩展性、容错性、速度极快的特点,并在数千家公司中投入生产。

大致意思就是,kafka是一个实时数据处理系统,就是对数据进行实时处理。在当今流行的微服务开发中,最常用的实时数据处理平台有RabbitMQ、RocketMQ等消息中间件。

这些中间件有以下两个主要特点:

  1. 服务解耦(Service Decoupling);是指在软件架构设计中,通过减少服务之间的依赖关系,使得服务之间相对独立、松散耦合,从而提高系统的灵活性、可维护性、扩展性和容错性。解耦的目标是使各个服务的变化不会影响其他服务,进而减少系统的复杂度和提升系统的稳定性。
  2. 流量削峰(Traffic Shaping or Traffic Throttling);是指通过控制和调整网络流量的方式,平滑流量的波动,避免网络或系统在高峰时段出现过载、延迟或崩溃。削峰的目标是将突然间涌入的流量(通常是峰值流量)平稳地分布到可接受的范围内,从而保证系统的稳定性和性能。

2  kafka出现的背景

2.1   队列数据拥挤

在早期的 web 应用程序开发中,当请求量突然上来了时候,我们会将要处理的数据推送到一个队列通道中,然后另起一个线程来不断轮训拉取队列中的数据,从而加快程序的运行效率。

但是随着请求量不断的增大,并且队列通道的数据一致处于高负载,在这种情况下,应用程序的内存占用率会非常高,稍有不慎,会出现内存不足,造成程序内存溢出,从而导致服务不可用。

2.2  如何解决数据拥挤

随着业务量的不断扩张,在一个应用程序内,使用这种模式已然无法满足需求,因此之后,就诞生了各种消息中间件,例如 ActiveMQ、RabbitMQ、RocketMQ等中间件。

采用这种模型,本质就是将要推送的数据,不在存放在当前应用程序的内存中,而是将数据存放到另一个专门负责数据处理的应用程序中,从而实现服务解耦。

消息中间件:主要的职责就是保证能接受到消息,并将消息存储到磁盘,即使其他服务都挂了,数据也不会丢失,同时还可以对数据消费情况做好监控工作。

应用程序:只需要将消息推送到消息中间件,然后启用一个线程来不断从消息中间件中拉取数据,进行消费确认即可!

引入消息中间件之后,整个服务开发会变得更加简单,各负其责。

2.3  kafka的出现

Kafka 本质其实也是消息中间件的一种,Kafka 出自于 LinkedIn 公司,与 2010 年开源到 github。

LinkedIn 的开发团队,为了解决数据管道问题,起初采用了 ActiveMQ 来进行数据交换,大约是在 2010 年前后,那时的 ActiveMQ 还远远无法满足 LinkedIn 对数据传递系统的要求,经常由于各种缺陷而导致消息阻塞或者服务无法正常访问,为了能够解决这个问题,LinkedIn 决定研发自己的消息传递系统,Kafka 由此诞生

在 LinkedIn 公司,Kafka 可以有效地处理每天数十亿条消息的指标和用户活动跟踪,其强大的处理能力,已经被业界所认可,并成为大数据流水线的首选技术。

3 kafka的架构介绍

3.1  核心架构组成

下图为kafka生产与消费的核心架构模型

如图所示,其内的各部分构成分别为:

  • Producer:Producer 即生产者,消息的产生者,是消息的入口

  • Broker:Broker 是 kafka 一个实例,每个服务器上有一个或多个 kafka 的实例,简单的理解就是一台 kafka 服务器,kafka cluster表示集群的意思

  • Topic:消息的主题,可以理解为消息队列,kafka的数据就保存在topic。在每个 broker 上都可以创建多个 topic 。

  • Partition:Topic的分区,每个 topic 可以有多个分区,分区的作用是做负载,提高 kafka 的吞吐量。同一个 topic 在不同的分区的数据是不重复的,partition 的表现形式就是一个一个的文件夹

  • Replication:每一个分区都有多个副本,副本的作用是做备胎,主分区(Leader)会将数据同步到从分区(Follower)。当主分区(Leader)故障的时候会选择一个备胎(Follower)上位,成为 Leader。在kafka中默认副本的最大数量是10个,且副本的数量不能大于Broker的数量,follower和leader绝对是在不同的机器,同一机器对同一个分区也只可能存放一个副本

  • Message:每一条发送的消息主体。

  • Consumer:消费者,即消息的消费方,是消息的出口。

  • Consumer Group:我们可以将多个消费组组成一个消费者组,在 kafka 的设计中同一个分区的数据只能被消费者组中的某一个消费者消费。同一个消费者组的消费者可以消费同一个topic的不同分区的数据,这也是为了提高kafka的吞吐量

  • Zookeeper:kafka 集群依赖 zookeeper 来保存集群的的元信息,来保证系统的可用性。

3.2  主要特点

  • 使用推拉模型将生产者和消费者分离

  • 为消息传递系统中的消息数据提供持久性,以允许多个消费者

  • 提供高可用集群服务,主从模式,同时支持横向水平扩展

3.3  与其它消息中间件的不同之处

与 ActiveMQ、RabbitMQ、RocketMQ 不同的地方在于,它有一个**分区Partition**的概念。

这个分区的意思就是说,如果你创建的topic有5个分区,当你一次性向 kafka 中推 1000 条数据时,这 1000 条数据默认会分配到 5 个分区中,其中每个分区存储 200 条数据。

这样做的目的,就是方便消费者从不同的分区拉取数据,假如你启动 5 个线程同时拉取数据,每个线程拉取一个分区,消费速度会非常非常快!

这是 kafka 与其他的消息系统最大的不同!

4  数据的发送与消费

4.1 发送数据

和其他的中间件一样,kafka 每次发送数据都是向Leader分区发送数据,并顺序写入到磁盘,然后Leader分区会将数据同步到各个从分区Follower,即使主分区挂了,也不会影响服务的正常运行。

kafka 根据以下三个原则将将数据写入到对应的分区:

  • 1、数据在写入的时候可以指定需要写入的分区,如果有指定,则写入对应的分区

  • 2、如果没有指定分区,但是设置了数据的key,则会根据key的值hash出一个分区

  • 3、如果既没指定分区,又没有设置key,则会轮询选出一个分区;

4.2  消费数据

与生产者一样,消费者主动的去kafka集群拉取消息时,也是从Leader分区去拉取数据。

这里我们需要重点了解一个名词:消费组

考虑到多个消费者的场景,kafka 在设计的时候,可以由多个消费者组成一个消费组,同一个消费组者的消费者可以消费同一个 topic 下不同分区的数据,同一个分区只会被一个消费组内的某个消费者所消费,防止出现重复消费的问题!

但是不同的组,可以消费同一个分区的数据!

你可以这样理解,一个消费组就是一个客户端,一个客户端可以由很多个消费者组成,以便加快消息的消费能力。

但是,如果一个组下的消费者数量大于分区数量,就会出现很多的消费者闲置。

如果分区数量大于一个组下的消费者数量,会出现一个消费者负责多个分区的消费,会出现消费性能不均衡的情况。

因此,在实际的应用中,建议消费者组的consumer的数量与partition的数量保持一致!

5  感谢原作者

原文链接如下,感谢作者的分享!

图解 kafka 架构与工作原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值