1.2.1 消息
消息:字节数据组。消息有一个可选的元数据称为键,也是一个字节数组,在分区时会对键取hash值再模以分区数得到这条数据存进哪个分区。
1.2.2 模式
可以理解为数据的格式:如:json、xml、强类型模式
Avro提供了一种紧凑的序列化格式,模式和消息体是分开的,支持强烈型和模式进化。
数据格式要一致才能解除生产者和消费者之间的耦合。
1.2.3 主题和分区
主题:可以把一个主题看成是从生产者流到消费者的一条数据流。
分区:一个主题可以有多个分区,数据被追加到这些分区,单个分区内到数据是有序的。
分区的好处是数据冗余备份和数据吞吐的伸缩性,分区是负载均衡和冗余备份的单位。
1.2.4 生产者和消费者
生产者:负责把数据写入主题。默认是均衡的把消息写到所有分区,也可以指定分区器,通过消息的键生成一个散列值,将其映射到指定分区上。
消费者:读取主题数据。
偏移量:消费者通过检查偏移量来记录已经读区过的消息,每个分区内的偏移量都是唯一、递增的。每个分区最后读取的偏移量被保存到zookeeper或Kafka中
消费者群组:一个消费者组对应一个主题。一个主题内的一个分区只能被一个消费者所有,但一个消费者可以拥有多个分区。
这样设计的好处在于:
1. 保证了在一个组内,每条消息只被处理一次。
2. 这种方式让消费者组可以负载均衡的消费大量消息的主题,而且还具有容灾的特性。
1.2.5 broker和集群
broker:一个独立的Kafka server就是一个broker
对生产者作用:接收消息->设置偏移量->提交存盘
对消费者作用:响应读取消息的请求
性能:数千分区、每秒百万级别数据
对于分区:一个分区可以存储到多个broker上,其中一个是master负责读写消息,其它的salve负责复制数据备份,master挂了会有一个顶上
集群:集群内会有一个broker作为controller的角色,负责分配分区给broker和监控broker
保留消息:保留一段时间、保留一定大小、紧凑型日志(只有最后一个带有特定键的消息会被保留)
1.3选择kafka的理由
1. 支持多个生产者同时写如一个主题,消费者可以获得统一主题数据
2. 可以重复消费一个主题,一个主题可以由多个消费者并发消费,每个分区只能指定一个消费者,保证了每条消费只被消费一次。
3. 基于磁盘的存储。让消息可以保留、不会阻塞在生产端、消费端可重复消费、消费者离线也不会丢数据
4. 伸缩性好,broker可以从一个逐步扩展到多个