一、kafka中的重要概念:
1.broker:2. zookeeper:3. producer生产者:4. consumer消费者:5. consumer group 消费者组:6. partition 分区:7. replicas 副本:8. topic 主题:9 offset 偏移量:10.消费者组 二、kafka生产者幂等性与事务:
1. 幂等性:
1.1 简介: 1.2 kafka生产者幂等性:
1.3 golang的sarama开启生产者幂等性1.4 幂等性原理: 2. 事务:
2.1 简介:2.2 事务操作API:2.3 实现:
一、kafka中的重要概念: 1.broker:一个kafka的集群通常由多个broker组成, 这样才能实现 负载均衡 以及 容错;broker是 无状态(Stateless) 的, 它们是通过zookeeper来维护集群状态;一个kafka的broker每秒可以处理数十万次读写, 每个broker都可以处理TB消息而不影响性能; 2. zookeeper:
ZK用来管理和协调broker, 并且存储了kafka的元数据, 例如: 有多少topic,partition, consumer;ZK服务主要用来通知生产者和消费者kafka集群中有新加入的broker加入, 或者kafka句群中出现故障的broker;PS: kafka正在逐步想办法将zookeeper剥离, 维护两套集群成本较高, 社区提出KIP-500,就是要替换掉zookeeper的依赖; “kafka-on-kafka”-- 让kafka自己来管理自己的元数据; 3. producer生产者:
生产者负责将数据推送给broker的topic;
4. consumer消费者:消费者负责从broker的topic中拉取数据, 并自己进行处理;
5. consumer group 消费者组:consumer group是kafka提供的可扩展且容错的消费者机制;一个消费者组可以包含多个消费者;一个消费者有唯一的ID(group id);组内的消费者一起消费主题的所分区有数据; 6. partition 分区:
在kafka集群中, 主题被分为多个分区;
7. replicas 副本:副本可以确保某个服务器出现故障时, 确保数据依然可用;在kafka中, 一般会设计副本的个数>1; 8. topic 主题:
主题是一个逻辑概念, 用于生产数据, 消费者拉取数据;kafka中的主题必须要有标志符, 而且是唯一的, kafka中可以有任意数量的主题, 没有数量上的限制;在主题中的消息是有结构的, 一般一个主题包含某一类消息;一旦生产者发送消息到主题中, 这些消息就不能被更新; 9 offset 偏移量:
offset记录着下一条将要发送给consumer的消息的序号;默认kafka将offset存储在zookeeper中;在一个分区中, 消息是顺序的方式存储的, 每个在分区的消费者都是一个递增的id; 这个就是偏移量offset;偏移量在分区中才是有意义的; 在分区之间, offset没有意义; 10.消费者组
一个消费者组中可以包含多个消费者, 共同来消费topic中的数据;一个topic中如果只有一个分区, 那么这个分区只能被这个组中的某个消费者消费;有多少个分区, 就可以被同一个组内的多少个消费者消费;topic能抗多少个并发, 分区数起到重要的作用; 二、kafka生产者幂等性与事务: 1. 幂等性: 1.1 简介:
拿http距离来说, 一个或多次请求, 得到的响应是一致的(网络等问题除外); 即: 执行多次操作与执行一次操作的影响是一样的;
1.2 kafka生产者幂等性:
在生产者生产消息时, 如果出现retry时, 有可能会一条消息被发送多次, 如果kafak不具备幂等性, 就有可能会在partition中保存多条一模一样的数据;
conf := sarama.NewConfig() conf.Producer.Idempotent = true // 开启幂等性1.4 幂等性原理:
为了实现生产者的幂等性, kafka引入了Producer ID(PID) 和 Sequence Number 的概念;
PID: 每个Producer在初始化时, 都会分配一个唯一的PID, 这个PID对用户来说是透明的;Sequence Number: 针对每个生产者(对应PID)发送到指定的主题分区的消息都对应一个从0开始递增的Sequence Number;
流程:
当kafak的生产者生产消息时, 会增加一个pid和sequence number(针对消息的一个递增序列);发送消息, 会连同pid和sequence number一块发送;kafak接收到消息, 会将消息和pid, sequence number一并保存下来;如果ack响应失败, 生产者重试, 再次发送消息时, kafka会根据pid和sequence number判断是否需要这条消息;判断依据: 生产者发送过来的sequence number是否小于等于partition中消息对应的sequence; 2. 事务: 2.1 简介:
Kafka事务是2017年Kafka 0.11.0.0引入的新特性, 类似于数据库的事务;
Kafka事务指的是生产者生产消息以及消费者提交offset的操作可以在一个原子操作中, 要么都成功, 要么都失败;尤其是在生产者、消费者并存时, 事务的保障尤其重要(consumer-transform-producer模式)
Producer接口中定义了以下5个事务相关方法;initTransactions(初始化事务): 启动一个Kafka事务;sendOffsetsToTransaction(提交偏移量): 批量地将分区对应的offset发送到事务中, 方便后续一块提交;commitTransaction(提交事务): 提交事务;abortTransaction(放弃事务): 取消事务; 2.3 实现:
(TODO…)



