Kafka

本文介绍了ApacheKafka,一个强大的分布式流处理平台,它以消息系统、存储系统和流处理器的身份运作,涵盖了Kafka的核心组件、系统架构、API以及其快速性能的实现机制,如零拷贝、消息压缩和顺序写入等。

目录

什么是 Kafka

Kafka 的应用

作为消息系统

作为存储系统

作为流处理器

Kafka 系统架构

核心 API

Kafka 为何如此之快

        零拷贝

        消息压缩

        顺序读写

        分批发送

Kafka 基本概念

broker

producer 生产者

consumer 消费者

Topic 主题

partition 分区 

segment 段


什么是 Kafka

Kafka 是一个分布式流式平台,它有三个关键能力

  1. 订阅发布记录流,它类似于企业中的消息队列 或 企业消息传递系统

  2. 容错的方式存储记录流

  3. 实时记录

Kafka 的应用

  • 作为消息系统
    • 三个基本组件

      • Producer : 发布消息的客户端

      • Broker:一个从生产者接受并存储消息的客户端

      • Consumer : 消费者从 Broker 中读取消息

  • 作为存储系统
    • Kafka 运行在一个或多个数据中心的服务器上作为集群运行

    • Kafka 集群存储消息记录的目录被称为 topics

    • 每一条消息记录包含三个要素:键(key)、值(value)、时间戳(Timestamp)

  • 作为流处理器
    • Kafka 可以建立流数据管道,可靠性的在系统或应用之间获取数据。

    • 建立流式应用传输和响应数据。

Kafka 系统架构

Kafka 系统架构

如上图所示,一个典型的 Kafka 集群中包含

  • 若干Producer(可以是web前端产生的Page View,或者是服务器日志,系统CPU、Memory等),
  • 若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),
  • 若干Consumer Group
  • 以及一个Zookeeper集群
    • Kafka通过Zookeeper管理集群配置,选举leader,
    • 以及在Consumer Group发生变化时进行rebalance。
    • Producer使用push模式将消息发布到broker,
    • Consumer使用pull模式从broker订阅并消费消息。

核心 API

apis

Kafka 有四个核心API,它们分别是

  • Producer API,它允许应用程序向一个或多个 topics 上发送消息记录
  • Consumer API,允许应用程序订阅一个或多个 topics 并处理为其生成的记录流
  • Streams API,它允许应用程序作为流处理器,从一个或多个主题中消费输入流并为其生成输出流,有效的将输入流转换为输出流。
  • Connector API,它允许构建和运行将 Kafka 主题连接到现有应用程序或数据系统的可用生产者和消费者。例如,关系数据库的连接器可能会捕获对表的所有更改

Kafka 为何如此之快

  • 零拷贝
    • Kafka 实现了零拷贝原理来快速移动数据,避免了内核之间的切换。
  • 消息压缩
    • 批处理能够进行更有效的数据压缩并减少 I/O 延迟
  • 顺序读写
    • Kafka 采取顺序写入磁盘的方式,避免了随机磁盘寻址的浪费。
  • 分批发送
    • Kafka 可以将数据记录分批发送,从生产者到文件系统(Kafka 主题日志)到消费者,可以端到端的查看这些批次的数据。

Kafka 基本概念

  • broker

    • Kafka 集群包含一个或多个服务器,每个 Kafka 集群中服务器被称为 broker。

      • broker 是集群的组成部分,每个集群中都会有一个 broker 同时充当了 集群控制器(Leader)的角色,它是由集群中的活跃成员选举出来的。

      • 每个集群中的成员都有可能充当 Leader,Leader 负责管理工作,包括将分区分配给 broker 和监控 broker。

      • 集群中,一个分区从属于一个 Leader,但是一个分区可以分配给多个 broker(非Leader),这时候会发生分区复制。这种复制的机制为分区提供了消息冗余,如果一个 broker 失效,那么其他活跃用户会重新选举一个 Leader 接管。

    • broker 接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。

    • broker 为消费者提供服务,对读取分区请求作出响应,返回已经提交到磁盘上的消息

  • producer 生产者

    • 消息的发布者,会将某 topic 的消息发布到相应的 partition 中。
    • 生产者在默认情况下把消息均衡地分布到主题的所有分区上,而并不关心特定消息会被写到哪个分区
    • 不过,在某些情况下,生产者会把消息直接写到指定的分区。
  • consumer 消费者

    • 消息的使用者,一个消费者可以消费多个 topic 的消息,
    • 对于某一个 topic 的消息,其只会消费同一个 partition 中的消息

疑问:一条消息划分topic后,topic(主题) 中的消息会被分割为一个或多个的 partition(分区),并且在默认情况下把消息均衡地分布到主题的所有分区上,以追加的形式写入分区,那么如果消费者对于某一个 topic 的消息,其只会消费同一个 partition 中的消息,那么只得到了消息的一部分信息?

        在消费者组的概念下,单一消费者并不需要获取全部的消息

        实际运用中可以指定生产者将消息写入指定分区,同时消费者可以决定消费指定分区的消息,消费者组中的消费者不会消费同一分区:

  • Topic 主题
    • kafka 使用一个类别属性来划分消息的所属类,划分消息的这个类称为 topic。
    • topic 相当于消息的分配标签,是一个逻辑概念。主题好比是数据库的表,或者文件系统中的文件夹
  • partition 分区 
    • topic 中的消息被分割为一个或多个的 partition,它是一个物理概念,对应到系统上的就是一个或若干个目录,一个分区就是一个 提交日志
    • 消息以追加的形式写入分区,先后以顺序的方式读取
    • 单个 Partition 分区可以保证有序

  • 由于一个主题包含无数个分区,因此无法保证在整个 topic 中有序,
  • 但是单个 Partition 分区可以保证有序。
    • 消息被迫加写入每个分区的尾部。
    • Kafka 通过分区来实现数据冗余和伸缩性
  • 分区可以分布在不同的服务器上
    • 既一个主题可以跨越多个服务器,以此来提供比单个服务器更强大的性能。
  • segment 段
    • 将 Partition 进一步细分为若干个 segment,每个 segment 文件的大小相等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值