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中指定的协调器发送心跳方式,来维护消费者与群组之间的从属关系。

 

posted @ 2024-05-17 14:07  使用D  阅读(7)  评论(0编辑  收藏  举报