一、基本架构
### --- 消息和批次
~~~ # Kafka的数据单元称为消息。
~~~ 可以把消息看成是数据库里的一个“数据行”或一条“记录”。消息由字节数组组成。
~~~ # 消息有键,键也是一个字节数组。
~~~ 当消息以一种可控的方式写入不同的分区时,会用到键。
~~~ # 为了提高效率,消息被分批写入Kafka。
~~~ 批次就是一组消息,这些消息属于同一个主题和分区。
~~~ # 把消息分成批次可以减少网络开销。
~~~ 批次越大,单位时间内处理的消息就越多,单个消息的传输时间就越长。
~~~ 批次数据会被压缩,这样可以提升数据的传输和存储能力,但是需要更多的计算处理。
### --- 模式
~~~ # 消息模式(schema)有许多可用的选项,
~~~ 以便于理解。如JSON和XML,但是它们缺乏强类型处理能力。
~~~ Kafka的许多开发者喜欢使用Apache Avro。
~~~ Avro提供了一种紧凑的序列化格式,模式和消息体分开。
~~~ 当模式发生变化时,不需要重新生成代码,它还支持强类型和模式进化,
~~~ 其版本既向前兼容,也向后兼容。
~~~ # 数据格式的一致性对Kafka很重要,
~~~ 因为它消除了消息读写操作之间的耦合性。
### --- 主题和分区
~~~ Kafka的消息通过主题进行分类。主题可比是数据库的表或者文件系统里的文件夹。
~~~ 主题可以被分为若干分区,一个主题通过分区分布于Kafka集群中,提供了横向扩展的能力。
### --- 生产者和消费者
~~~ 生产者创建消息。消费者消费消息。
~~~ 一个消息被发布到一个特定的主题上。
~~~ 生产者在默认情况下把消息均衡地分布到主题的所有分区上:
~~~ 1. 直接指定消息的分区
~~~ 2. 根据消息的key散列取模得出分区
~~~ 3. 轮询指定分区。
~~~ 消费者通过偏移量来区分已经读过的消息,从而消费消息。
~~~ 消费者是消费组的一部分。消费组保证每个分区只能被一个消费者使用,避免重复消费。
### --- broker和集群
~~~ 一个独立的Kafka服务器称为broker。
~~~ broker接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。
~~~ broker为消费者提供服务,对读取分区的请求做出响应,返回已经提交到磁盘上的消息。
~~~ 单个broker可以轻松处理数千个分区以及每秒百万级的消息量。
~~~ 每个集群都有一个broker是集群控制器(自动从集群的活跃成员中选举出来)。
~~~ 控制器负责管理工作:
~~~ 将分区分配给broker
~~~ 监控broker
~~~ 集群中一个分区属于一个broker,该broker称为分区首领。
~~~ 一个分区可以分配给多个broker,此时会发生分区复制。
~~~ 分区的复制提供了消息冗余,高可用。副本分区不负责处理消息的读写。