kafka权威指南
消息有字节数组组成
消息Key也是一个字节数组
根据消息key的哈希码进行取模后写入不同分区,保证具有相同key的消息总是被写入到相同分区中
为了提供消息写入效率,支持消息的分批次写入,批次就是一组消息,每个批次的消息输入同一个主体和分区
为了减少网络消耗,批次数据会被压缩
kakfa使用AVRO格式进行消息的序列化,支持向后兼容
主体与分区
消息以主题进行分类
主题可以被分为多个不同分区,一个分区就是一个提交日志,
消息以追加方式写入分区。
消息被追加到每个分区的尾部。
消息在一个分区中可以被先入先出的方式被读取。
一个主题可以包含多个分区,因此无法保证整体主题范围内的顺序,但是可以保证消息在单个分区内的顺序。
kafka通过分区实现数据冗余和伸缩性。
分区可以分布到不同服务器上。
一个主题可以跨多个服务器。
生产者与消费者
默认情况下消息会被均匀分布到主题下的所有分区上。
消息可以被写入到指定分区上,需要通过消息键和分区器来实现。
分区器为消息生成一个散列值,并将期映射到指定的分区上,这样保证了同一个key的消息被写入到同一个分区中。
消费者可以订阅一个或者多个主题,并且按照消息生成的顺序读取消息。
消费者通过检查消息的偏移量来区分是否已读取过的消息。
偏移量是一种元数据,是一个不断底层的整数值,在创建消息会把偏移量写入消息中。
每个分区中偏移量都是唯一的。
消费者把每个分区最后读取的偏移量保存在zookeeper或者kafka中。
多个消费者组成一个消费组。
消费组保证每个分区只能被一个消费者消息。
所有权:消费者与分区的关系映射。
如果一个消费者失效,消费组中的其他消费者会接管失效消费者的工作。
一个独立的kafka被称为一个broker。
broker接收消息,并为消息设置偏移量,并提交消息到磁盘保存。
broker是集群的一部分。
每个集群都有一个broker作为“集群管理器”的角色。
集群中,一个分区从属于一个broker,这个broker称为分区首领。
一个分区可以分配给多个broker,这时会发生分区复制。
消息可以被保存在磁盘中,可以设置消息在磁盘中的流程时间,7天或者一个月等。
消息在保存在磁盘中,可以设置保留时间或者字节大小。
过期的消息从磁盘中删除掉。
kakfa支持多个消费者读取同意主题,并且相互直接不影响。
消费组保证每个消息只被处理一次。
kafka支持消费者非实时的读取消息,主要归功于消息可以被保存到磁盘中。
kakfa与zookeeper
kafka使用zookeeper保存集群的(broker、主题、分区)元数据、消费信息。
由于zookeeper使用了一致性协议,如果zookeeper节点过多会降低集群的性能。
broker常规配置参数
broker.id、port、zookeeper.connect
log.dirs:kafka消息保存在磁盘中的路径
num.recovery.threads.per.data.dir:使用配置的线程数量打开或者关闭日志片段。
创建主题时机:生成消息时、消费消息时、客户端向主图发送元数据请求时
主题常规配置
每个主题包含的分区数量
消息被保留在磁盘中的时间,默认一周(日志片段最后修改时间)
消息被保留在磁盘中的大小限制,默认每个分区1G。
log.segement.bytes:日志片段大小限制,例如设置为1G时,如果日志片段达到1G后,会创建一个新日志片段。
message.max.bytes:限制单个消息大小,默认1M
垃圾回收器选项
默认使用G1回收器
可以设置最大暂停时间
每轮垃圾回收前可以使用的堆内存百分比。
发送消息三种方式
发送并忘记:无法保证消息不丢失
同步发送:同步阻塞,有Future
异步发送:支持回调
发送消息到kafka
生产者调用send方法发送消息,需要指定主题和key值对象。
消息先被发放进缓冲区中,然后使用单独线程发送到服务器端。
需要捕获消息发送的异常信息,尽心重试
生产者配置
可靠性确认参数acks:
acks=0:无需等待来自kafka的确认消息
acks=:只要集群的首领节点确认,生产者会收到一个来自服务器的确认消息。
acks=all:需要所有参与复制节点的全部确认消息,生产者才会收到一个来自服务器的确认消息。
buffer.memory:生产者内存缓冲区大小,生产者使用它缓冲要发送到服务器的消息。
压缩类型
重试次数
batch.size:批次数量
发送消息的大小
tcp socket接收和发送数据包的缓冲区大小。
分区
key为null时,分区器使用轮训算法发送消息到各个分区中。
key有值时,根据key的散列值路由到各个分区中。
建议在创建主题时同步把分区创建
消费者与消费者群里
每个消费者从属于一个消费者群组。
可以多个消费者对同一个主题读取消息,对消息进行分流。
一个消费者群组里的消费者订阅的都是同一个主题,每个消费者接收主题的一部分分区的消息。
消费者群里中增加消费者提现了横向伸缩能力。
分区再均衡:分区的所有权从一个消费者变更到其他消费者时,会发生再均衡。
分区再均衡阶段消费者无法读取消息,造成整个消费者集群一小段时间不可用。
消费者通过向broker中指定的协调器发送心跳方式,来维护消费者与群组之间的从属关系。