kakfa从入门到放弃: 相关概念,幂等性&事务
Posted 浅弋、璃鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kakfa从入门到放弃: 相关概念,幂等性&事务相关的知识,希望对你有一定的参考价值。
文章目录
一、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中保存多条一模一样的数据;
1.3 golang的sarama开启生产者幂等性
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模式)
2.2 事务操作API:
- Producer接口中定义了以下5个事务相关方法;
- initTransactions(初始化事务): 启动一个Kafka事务;
- sendOffsetsToTransaction(提交偏移量): 批量地将分区对应的offset发送到事务中, 方便后续一块提交;
- commitTransaction(提交事务): 提交事务;
- abortTransaction(放弃事务): 取消事务;
2.3 实现:
(TODO…)
以上是关于kakfa从入门到放弃: 相关概念,幂等性&事务的主要内容,如果未能解决你的问题,请参考以下文章