1.1 发布与订阅消息系统
消息的发送者(发布者)不会直接把消息发送给接受者,这是发布与订阅消息系统的一个特点。
发布者以某种方式对消息进行分类,接受者订阅它们,以便接收特定类型的消息。
发布与订阅系统一般有一个 broker,也就是发布消息的中心点。
1.2 Kafka 登场
它一般被称为“分布式提交日志”或者“分布式流平台”。
Kafka 的数据是按照一定顺序持久化保存的,可以按需读取。此外,Kafka 的数据分布在整个系统里,具备数据故障保护和性能伸缩能力。
1.2.1 消息和批次
Kafka 的数据单元被称为消息。消息由字节数组组成。消息可以有一个可选的元数据,也就是键,当消息以一种可控的方式写入不同分区的时候会用到。
为了提高效率,消息被分批写入 Kafka。批次就是一组消息,这些消息属于同一个主题和分区。这样可以减少网络开销。
1.2.2 模式
数据格式的一致性对 Kafka 非常重要,它消除了消息读写操作之间的耦合性。
Kafka 许多开发者喜欢使用 Apache Avro。
1.2.3 主题和分区
消息通过主题进行分类,主题可以分为若干个分区。消息以追加的方式写入分区,然后以先入先出的顺序读取。
因为一般主题有多个分区,所以无法在主题范围内保证消息的顺序,但可以保证单个分区内的顺序。
通过分区实现了数据冗余和伸缩性,分区是可以分布在不同的服务器上的。
流是一组从生产者移动到消费者的数据。Kafka Streams 就是做的流式处理。
1.2.4 生产者和消费者
Kafka Connect API 和用于流式处理的 Kafka Streams 是高级客户端 API。
生产者创建消息。
消费者读取消息。消费者通过检查消息的偏移量来区分已经读过的数据。
偏移量是一种元数据,它是一个不断递增的整数值。在给定的分区里,每个消息的偏移量都是唯一的。消费者把每个分区最后读取的消息偏移量保存在 ZooKeeper 或 Kafka 上。
消费者是消费者群组(Consumer Group)的一部分,群组保证每个分区只能被一个消费者使用。消费者与分区之间的映射通常被称为消费者对分区的所有权关系。
1.2.5 broker 和集群
一个独立的 Kafka 服务器被称为 broker。它接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。broker 为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘上的消息。
broker 是集群的组成部分。每个集群中都有一个 broker 充当集群控制器的角色。
在集群中,一个分区从属于一个 broker,该 broker 被称为分区的首领。一个分区可以分配给多个 broker,这个时候会发生分区复制。
保留消息是一个重要特性。默认的消息保留策略是:要么保存一段时间,要么达到一定的字节数。达到上限后,这些数据就会被删除。主题可以配置自己的保留策略。
1.2.6 多集群
使用多集群的原因:
1)数据类型分离
2)安全需求隔离
3)多数据中心(灾难恢复)
但是,Kafka 的消息复制机制只能在单个集群中进行,不能在多个集群之间进行。
Kafka 提供了一个 MirrorMaker 的工具,可以实现集群间的复制。核心组件包含了一个生产者和一个消费者,两者之间通过一个队列相连。
1.3 为什么选择 Kafka
1.3.1 多个生产者
很适合从多个前端系统收集数据,并以统一的格式对外提供数据。
1.3.2 多个消费者
支持多个消费者从一个单独的消息流上读取数据。
1.3.3 基于磁盘的数据存储
允许消费者非实时地获取数据。
1.3.4 伸缩性
具有灵活的伸缩性。
1.3.5 高性能
通过横向扩展生产者、消费者和 broker,可以处理巨大的消息流,并保证亚秒级的延迟。
1.4 数据生态系统