首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >kafka 学习笔记 1 - 简述

kafka 学习笔记 1 - 简述

作者头像
张云飞Vir
发布2020-04-23 16:44:27
5460
发布2020-04-23 16:44:27
举报
文章被收录于专栏:写代码和思考写代码和思考

0. 背景

本文简述 kafka 的相关内容。

kafka

1. 简介

Kafka 是一种高吞吐量的分布式发布订阅消息系统。

有如下特性:

  • 稳定性能:以时间复杂度为O(1)的磁盘数据结构提供消息的持久化,即使TB量级的消息存储也能够保持长时间的稳定性能。
  • 高吞吐量: 即使是非常普通的硬件Kafka也可以支持每秒数百万的消息。
  • 集群: 支持通过Kafka服务器和消费机集群来分区消息。

官方口号:

Kafka 用于构建实时的数据管道和流式的app。它可以水平扩展,高可用,速度快,并且已经运行在数千家公司的生产环境。

简单理解就是:

  • 消息队列(管道)
  • 水平扩展

藉由消息队列和流的特性,Kafka适合什么样的应用场景?

Kafka 适用的场景:

  • 消息队列特性:构造实时流数据管道,它可以在系统或应用之间可靠地获取数据。
  • 流式应用特性:构建实时流式应用程序,对这些流数据进行转换或者影响。

流式应用特性就是流处理,通过kafka stream topic和topic之间内部转换。简单理解就是:

生产者 >--输入流-->  | Kafka流应用(处理输入流,写到输出流) | >--输出流--->  消费者

主要能力:

  • (1) 发布 & 订阅 可以让你发布和订阅流式的记录。这一方面与消息队列或者企业消息系统类似。
  • (2) 流处理 编写可扩展的流处理应用程序,可以在流式记录产生时就进行处理。
  • (3) 流式的记录存储 可以储存流式的记录,并且有较好的容错性。它以安全的方式将流式的数据存储在一个分布式,有副本备份,容错的集群。

后面我们会介绍这三种能力对应的场景,现在让我们了解一些基本概念。

2. 基本概念

一些概念:

  • Kafka作为一个集群,运行在一台或者多台服务器上.
  • Kafka 通过 topic 对存储的流数据进行分类。
  • 每条记录中包含一个key,一个value和一个timestamp(时间戳)。

Kafka有四个核心的API:

  • The Producer API :允许应用程序发布流式的数据到 topic。
  • The Consumer API :允许应用程序订阅 topic ,和对流式数据进行处理。
  • The Streams API :允许应用程序作为一个流处理器,消费topic产生的输入流,进行有效的转换,然后生产输出流到topic中去。
  • The Connector API :允许构建生产者或者消费者,将Kafka topics连接到已存在的应用程序或者数据系统。比如,连接到关系型数据库,监控 表(table)的所有变更内容。

Topics 和 记录集

Topic(主题) 流式的记录集是kafka的核心概念, 即 topic。

Topic 就是 主题,是 数据记录集 发布的地方, 可以用来区分业务系统。

Kafka中的Topics总是多订阅者模式,一个topic可以拥有一个或者多个消费者来订阅它的数据。

分区(Partition) 对于每一个topic, Kafka集群都会维持一个分区(Partition),如下所示:

topic 和 分区

追加到文件 每个分区都是有序且顺序不可变的记录集,并且不断地追加到结构化的记录文件中。

偏移量(offset) 分区中的每一个记录都会分配一个id号来表示顺序,我们称之为offset,offset用来唯一的标识分区中每一条记录。

存活期限 (retention period) Kafka 集群保留所有发布的记录(无论他们是否已被消费),并通过一个可配置的存活期限来控制.。比如, 如果存活策略设置为2天,一条记录发布后2天内,可以随时被消费,两天过后这条记录会被抛弃并释放磁盘空间。

Kafka的性能和数据大小无关,所以长时间存储数据没有什么问题.

image.png

在每一个消费者中唯一保存的是offset(偏移量), 即消费到的记录偏移的位置。

偏移量由消费者所控制: 在读取记录后,消费者会以线性的方式增加偏移量。

实际上,由于这个位置由消费者控制,所以消费者可以采用任何顺序来消费记录。例如,一个消费者可以重置到一个旧的偏移量,从而重新处理过去的数据;也可以从"现在"开始消费。

这些细节说明Kafka 消费者是非常廉价的—消费者的增加和减少,对集群或者其他消费者没有多大的影响。

分布式

Partition(分区)有以下几个用途:

  • 第一,当日志大小超过了单台服务器的限制,方便日志进行扩展。一个主题可能有多个分区,因此可以处理无限量的数据。
  • 第二,可以作为并行的单元集

分区(partition)的特点:

  • 分区 可以分布 在Kafka集群的服务器上。
  • 每个服务器在处理数据和请求时,共享这些分区。
  • 每个分区都会在已配置的服务器上进行备份,确保容错性.

分区的 leader 与 宕机后选举

  • 每个分区都有一台 server 作为 “leader”,零台或者多台server作为 follwers 。
  • leader server 处理一切对 partition (分区)的读写请求,而follwers只需被动的同步leader上的数据。
  • 当leader宕机了,followers 中的一台服务器会自动成为新的 leader。
  • 每台 server 都会成为某些分区的 leader 和某些分区的 follower,因此集群的负载是平衡的。

生产者

生产者可以将数据发布到所选择的topic(主题)中。生产者负责将记录分配到topic的哪一个 分区中。

生产时负载均衡

  • 可以使用循环的方式来简单地实现负载均衡
  • 也可以根据某些语义分区函数(例如:记录中的key)来完成。

消费者

消费者使用一个 消费组 名称来进行标识,发布到topic中的每条记录被分配给订阅消费组中的一个消费者实例.消费者实例可以分布在多个进程中或者多个机器上。

  • 如果所有的消费者实例在同一消费组中,消息记录会负载平衡到每一个消费者实例.
  • 如果所有的消费者实例在不同的消费组中,每条消息记录会广播到所有的消费者进程.

保证

high-level Kafka给予以下保证:

  • 生产者 发送到特定分区的消息将按照发送顺序处理。
  • 一个消费者实例按照日志中的顺序查看记录.
  • 对于具有N个副本的主题,我们最多容忍N-1个服务器故障,从而保证不会丢失。

4. kafka 应用

kafka 可以作为 消息系统,存储系统,流处理,它和这些传统的系统相比,也有其自身的特性,下面逐一讨论。

4.1 Kafka作为消息系统

传统的消息系统 传统的消息系统有两个模块: 队列 和 发布-订阅。 (1)在队列中,消费者从消息队列读取消息记录,每条记录被一个消费者消费; (2)在发布订阅中,记录被广播到所有的消费者。 两者均有优缺点: (1) 队列的优点在于它允许你将处理数据的过程分给多个消费者实例,使你可以扩展处理过程。 缺点是:一旦一个进程读取了数据,数据就会被丢弃。 (2)而发布-订阅系统允许你广播数据到多个进程,但是无法进行扩展处理,因为每条消息都会发送给所有的订阅者。

消费组在Kafka有两层概念

  • 在队列中,消费组允许你将处理过程分发给一系列进程(消费组中的成员)。
  • 在发布订阅中,Kafka允许你将消息广播给多个消费组。

Kafka的优势在于:每个topic都有可以扩展处理并且允许多订阅者模式(不只选其中一个).

Kafka 比传统消息队列有更严格的顺序保证

  • 传统队列在服务器上保存着有序的记录,如果多个消费者消费队列中的数据, 服务器将按照存储顺序输出记录。 记录被异步传递给消费者, 因此记录可能会无序的到达不同的消费者。在并行消费的情况下, 记录的顺序是丢失的。因此消息系统通常使用“唯一消费者”的概念,即只让一个进程从队列中消费, 但这就无法并行处理。
  • Kafka 设计的更好。topic中的partition是一个并行的概念。 Kafka通过将topic中的不同 partition 分配给消费者组中的消费者来提供顺序保证和负载平衡, 以便每个分区由消费组中的一个消费者消费

通过这样,我们能够确保消费者是该分区的唯一读者,并按顺序消费数据。 众多分区保证了多个消费者实例间的负载均衡。但请注意,消费者组中的消费者实例个数不能超过分区的数量。

4.2 Kafka作为存储系统

(1)写入,备份,确保继续写入 数据写入Kafka后被写到磁盘,并且进行备份以便容错。直到完全备份,Kafka才让生产者认为完成写入,即使写入失败Kafka也会确保继续写入。 (2)扩展性 Kafka使用磁盘结构,具有很好的扩展性—50kb和50TB的数据在server上表现一致。 (3)可以存储大量数据 可以存储大量数据,并且可通过客户端控制它读取数据的位置。

您可认为Kafka是一种高性能、低延迟、具备日志存储、备份和传播功能的分布式文件系统。

4.3 Kafka作为流处理

Kafka 流处理不仅仅用来读写和存储流式数据,它最终的目的是为了能够进行实时的流处理。

在Kafka中,“流处理器” 不断地从 “输入的topic” 获取流数据,处理数据后,再不断将“产生的流数据” 写入到 “输出的topic” 中去。

例如,零售应用程序可能会接收销售和出货的输入流,经过价格调整计算后,再输出一串流式数据。

简单的数据处理可以直接用生产者和消费者的API。对于复杂的数据变换,Kafka提供了Streams API。 Stream API 允许应用做一些复杂的处理,比如将流数据聚合或者join。

4.4 总结

一般来说,我们可能已经有了很多的历史数据,同时又要处理存储新来的数据,和准备持续处理未来的数据。

流式应用程序 通过低延迟订阅和组合存储,流式应用程序可以以同样的方式处理过去和未来的数据。 一个单一的应用程序可以处理历史记录的数据,并且可以持续不断地处理以后到达的数据,而不是在到达最后一条记录时结束进程。 这是一个广泛的流处理概念,其中包含批处理以及消息驱动应用程序。

低延迟 作为流数据管道,能够订阅实时事件使得Kafk具有非常低的延迟; 组合存储 同时Kafka还具有可靠存储数据的特性,可用来存储重要的支付数据, 或者与离线系统进行交互,系统可间歇性地加载数据,也可在停机维护后再次加载数据。

总结就是:“kafka 具有对数据批处理的能力”

5. 参考

官网 http://kafka.apache.org/ 中文 http://kafka.apachecn.org/ https://www.cnblogs.com/qingyunzong/p/9004509.html https://www.jianshu.com/p/430454d9e30b

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0. 背景
  • 1. 简介
  • 2. 基本概念
    • Topics 和 记录集
      • 分布式
        • 生产者
          • 消费者
            • 保证
            • 4. kafka 应用
              • 4.1 Kafka作为消息系统
                • 4.2 Kafka作为存储系统
                  • 4.3 Kafka作为流处理
                    • 4.4 总结
                    • 5. 参考
                    相关产品与服务
                    消息队列 CMQ 版
                    消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档