Kafka 入门

Kafka 入门 概述 Kafka 最初是为了解决 LinkedIn 数据管道问题应运而生的。它的设计目的是提供一个高性能的消息系统,可以处理多种数据类型,并能够实时提供纯净且结构化的用户活动数据和系统度量指标。 它不只是一个数据存储系统(类似于传统的关系型数据库、键值存储引擎、搜索引擎或缓存系统),还是一个持续变化和不断增长的流处理系统。现在 Kafka 已经被广泛地应用在社交网络的实时数据流处理当中,成为了下一代数据架构的基础。Kafka 经常会被拿来与现有的企业级消息系统、大数据系统(如 Hadoop)和数据集成 ETL 工具等技术作比较。 从发布和订阅消息流的角度来看,Kafka 类似于 ActiveMQ、RabbitMQ 或 IBM 的 MQSeries 等产品,其特点在于它以集群的方式运行,可以自由伸缩,处理大量的应用程序;其次,Kafka 可以按照要求持久化数据,即提供了数据传递的保证——可复制、持久化,保留多长时间完全可以由开发者决定。此外,消息系统只会传递消息,而 Kafka 的流式处理能力让我们只用很少的代码就能够动态地处理派生流和数据集。 1 基础概念 消息代理 在一个基于发布与订阅的消息系统中,数据消息的发送者不直接把消息发送给接收者,而是通过一个消息代理 message broker 传递消息,接收者订阅消息代理,并以特定的方式接收消息。Kafka 就是一个消息代理。 消息代理 message broker 是一种针对处理消息流而优化的数据库,它作为独立的中间服务运行,生产者和消费者作为客户端连接到消息代理服务,在使用消息代理的架构中主要有 3 种角色: 生产者将消息写入消息代理;生产者一般是异步架构的,当生产者发送消息时,它只会等待消息代理确认消息已经被缓存,而不等待消息被消费者处理 消息代理负责消息的存储,发送、重传等,一般会包含多个消息队列 message queue 消费者从消息代理接收消息并进行处理;消费者只依赖于消息代理,与生产者完全隔离 消息代理的优势主要有以下几点: 实现异步处理,提升性能 把消息处理流程使用消息代理异步化,不会阻塞生产者服务,生产者服务可以在得到处理结果之前继续执行,并提高其并发处理的能力。 提高系统的可伸缩性 生产者将大量消息推送到消息代理中,消息代理可以将这些消息分发给不同的消费者,使得多个消费者并行地处理消息,当消费者负载变化时,可以很容易地对消费者服务进行水平伸缩 削峰填谷 当生产者推送消息的速度比消费者处理消息的速度更快时,可以使用消息队列作为消息的缓冲,来削弱峰值流量,防止系统被短时间内的流量冲垮 应用解耦 使用消息代理后,生产者和消费者即可解耦,不再需要有任何联系,也不需要受对方的影响,只要保持使用一致的消息格式即可。 消息和批次 Kafka 的数据单元被称为消息,消息类似于关系型数据库里的一个数据行或一条记录;消息由字节数组组成,当消息以一种可控的方式写入不同的分区时,会用到 key,Kafka 会为 key 生成一个一致性散列值,然后使用散列值对主题分区数进行取模,为消息选取分区。这样可以保证具有相同 key 的消息总是被写到相同的分区上。 如果每一个消息都单独发送,会导致大量的网络开销。为了提高效率,消息会被分批次写入Kafka;批次 batch 是一组消息,这些消息属于同一个主题和分区;批次数据在传输时会被压缩,这样可以提升数据的传输和存储能力;单个 batch 的消息数量越大,单位时间内处理的消息就越多,但单个 batch 的传输时间就越长,因此需要在时延和吞吐量之间作出权衡。 主题和分区 Kafka 的消息通过主题 topic 进行分类,主题就好比关系型数据库的表,或者文件系统里的目录;同一个主题可以被分为若干个分区 partition,一个 partition 即一个提交日志,消息以追加的方式写入 partition,然后以先入先出的顺序读取。一个 topic 一般包含多个 partition,因此无法在整个 topic 的维度保证消息的顺序,只能保证消息在单个 partition 内的顺序。 ...

November 29, 2021 · 14 min