本文简述 kafka 的相关内容。
kafka
Kafka 是一种高吞吐量的分布式发布订阅消息系统。
有如下特性:
官方口号:
Kafka 用于构建实时的数据管道和流式的app。它可以水平扩展,高可用,速度快,并且已经运行在数千家公司的生产环境。
简单理解就是:
藉由消息队列和流的特性,Kafka适合什么样的应用场景?
Kafka 适用的场景:
流式应用特性就是流处理,通过kafka stream topic和topic之间内部转换。简单理解就是:
生产者 >--输入流--> | Kafka流应用(处理输入流,写到输出流) | >--输出流---> 消费者
主要能力:
后面我们会介绍这三种能力对应的场景,现在让我们了解一些基本概念。
一些概念:
Kafka有四个核心的API:
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)的特点:
分区的 leader 与 宕机后选举
生产者可以将数据发布到所选择的topic(主题)中。生产者负责将记录分配到topic的哪一个 分区中。
生产时负载均衡
消费者使用一个 消费组 名称来进行标识,发布到topic中的每条记录被分配给订阅消费组中的一个消费者实例.消费者实例可以分布在多个进程中或者多个机器上。
high-level Kafka给予以下保证:
kafka 可以作为 消息系统,存储系统,流处理,它和这些传统的系统相比,也有其自身的特性,下面逐一讨论。
传统的消息系统 传统的消息系统有两个模块: 队列 和 发布-订阅。 (1)在队列中,消费者从消息队列读取消息记录,每条记录被一个消费者消费; (2)在发布订阅中,记录被广播到所有的消费者。 两者均有优缺点: (1) 队列的优点在于它允许你将处理数据的过程分给多个消费者实例,使你可以扩展处理过程。 缺点是:一旦一个进程读取了数据,数据就会被丢弃。 (2)而发布-订阅系统允许你广播数据到多个进程,但是无法进行扩展处理,因为每条消息都会发送给所有的订阅者。
消费组在Kafka有两层概念
Kafka的优势在于:每个topic都有可以扩展处理
并且允许多订阅者模式(不只选其中一个).
Kafka 比传统消息队列有更严格的顺序保证
异步传递给消费者, 因此记录可能会无序的到达不同的消费者
。在并行消费的情况下, 记录的顺序是丢失的。因此消息系统通常使用“唯一消费者”的概念,即只让一个进程从队列中消费, 但这就无法并行处理。每个分区由消费组中的一个消费者消费
。通过这样,我们能够确保消费者是该分区的唯一读者,并按顺序消费数据。 众多分区保证了多个消费者实例间的负载均衡。但请注意,消费者组中的消费者实例个数不能超过分区的数量。
(1)写入,备份,确保继续写入 数据写入Kafka后被写到磁盘,并且进行备份以便容错。直到完全备份,Kafka才让生产者认为完成写入,即使写入失败Kafka也会确保继续写入。 (2)扩展性 Kafka使用磁盘结构,具有很好的扩展性—50kb和50TB的数据在server上表现一致。 (3)可以存储大量数据 可以存储大量数据,并且可通过客户端控制它读取数据的位置。
您可认为Kafka是一种高性能、低延迟、具备日志存储、备份和传播功能的分布式文件系统。
Kafka 流处理不仅仅用来读写和存储流式数据,它最终的目的是为了能够进行实时的流处理。
在Kafka中,“流处理器
” 不断地从 “输入的topic
” 获取流数据,处理数据后,再不断将“产生的流数据
” 写入到 “输出的topic
” 中去。
例如,零售应用程序可能会接收销售和出货的输入流,经过价格调整计算后,再输出一串流式数据。
简单的数据处理可以直接用生产者和消费者的API。对于复杂的数据变换,Kafka提供了Streams API。 Stream API 允许应用做一些复杂的处理,比如将流数据聚合或者join。
一般来说,我们可能已经有了很多的历史数据,同时又要处理存储新来的数据,和准备持续处理未来的数据。
流式应用程序 通过低延迟订阅和组合存储,流式应用程序可以以同样的方式处理过去和未来的数据。 一个单一的应用程序可以处理历史记录的数据,并且可以持续不断地处理以后到达的数据,而不是在到达最后一条记录时结束进程。 这是一个广泛的流处理概念,其中包含批处理以及消息驱动应用程序。
低延迟 作为流数据管道,能够订阅实时事件使得Kafk具有非常低的延迟; 组合存储 同时Kafka还具有可靠存储数据的特性,可用来存储重要的支付数据, 或者与离线系统进行交互,系统可间歇性地加载数据,也可在停机维护后再次加载数据。
总结就是:“kafka 具有对数据批处理的能力”
官网 http://kafka.apache.org/ 中文 http://kafka.apachecn.org/ https://www.cnblogs.com/qingyunzong/p/9004509.html https://www.jianshu.com/p/430454d9e30b