参考:极客时间-Kafka核心技术与实战
kafka术语
消息(Record):kafka要处理的主要对象。
主题(Topic):承载消息的逻辑容器,实际使用中多用来区分具体的业务。
分区(Partition):一个有序不变的消息序列,每个主题下有多个分区。
消息位移(Offset):分区中每条消息的位置信息,是一个单调递增且不变的值。
副本(Replica):分为领导者副本和追随者副本,每个分区可配置多个副本实现高可用。
生产者(Producer):向主题发布新消息的应用系统。
消费者(Consumer):从主题订阅新消息的应用系统。
消费者位移(Consumer Offset):消费者消费进度。
消费者组(Consumer Group):多个消费者实例共同组成的一个组,同时消费多个分区以提高吞吐量。
重平衡(Rebalance):消费者组某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。
kafka线上集群方案
操作系统:
- I/O模型的使用
- 数据网络传输的效率
- 社区支持度
磁盘:
多使用顺序读写,在软件层面实现了高可用和负载均衡,所以用普通磁盘即可。
磁盘容量:
使用率控制在70%。
新增消息数、平均消息大小、消息留存时间、备份数、是否开启消息压缩。
**带宽:****
使用率控制在70%。
每分钟消息数、平均消息大小。
生产者消息分区机制
作用:
提供负载均衡的能力。
策略:
轮询策略、随机策略、按消息键保序策略、其他策略。
生产者压缩算法
生产者压缩,Broker保持,消费者解压。
何时压缩:
生产者端和Broker端。
何时解压:
消费者端和Broker端。
Broker端压缩:
- Broker端指定了和Producer端不同的压缩算法。
- Broker端发生了消息格式转换
如何保证消息不丢失
kafka只对“已提交”的消息做有限度的持久化保证。
已提交:若干个Broker接收并写入了这条消息。
- 使用producer.send(msg, callback)
- 设置acks=all
- 设置retries>0
- 设置unclean.leader.election.enable=false
- replication.factor>=3
- min.insync.replicas>1
消息交付可靠性保证
三种承诺方式:最多一次、至少一次、精确一次。
幂等生产者:保证单分区单会话的精确一次交付。
事务生产者:保证所有分区所有会话的精确一次交付。
消费者组
kafka提供的可扩展且具有容错性的消费者机制。
特性:
- Consumer Group下可以有一个或多个Consumer实例
- Group ID标识唯一个Consumer Group
- Consumer Group订阅主题的分区和Consumer是多对一的关系
消费者位移
位移管理机制:
将消费者位移作为一条条普通的kafka消息,提交到__consumer_offsets中。
创建位移主题:
启动第一个Consumer时。
删除过期信息:
使用Compact策略删除位移主题中的过期消息。
消费者组重平衡
重平衡时机:
- 组成员数量发生变化
- 订阅主题数发生变化
- 订阅主题的分区数发生变化
重平衡的弊端:
- Consumer停止消费
- 重平衡过程慢
- 重平衡效率低
避免不必要的重平衡:
- Consumer心跳超时
- Consumer消费时间过长
CommitFailedException异常处理
出现原因:
消费者组重平衡期间,要提交位移的分区已经分配给了另一个消费者实例。
预防方法:
- 减少单条消息的处理时间
- 增加单位时间处理的消息数
- 减少一次性消费的消息数
- 增加消费一批消息的最大时长