文章目录

  • 一、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 都有其他partion的备份吗_幂等性

  • 一个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 消费者组:

kafka的 每个broker 都有其他partion的备份吗_分布式_02

  • consumer group是kafka提供的可扩展且容错的消费者机制;
  • 一个消费者组可以包含多个消费者;
  • 一个消费者有唯一的ID(group id);
  • 组内的消费者一起消费主题的所分区有数据;

6. partition 分区:

kafka的 每个broker 都有其他partion的备份吗_数据_03

在kafka集群中, 主题被分为多个分区;

7. replicas 副本:

kafka的 每个broker 都有其他partion的备份吗_幂等性_04

  • 副本可以确保某个服务器出现故障时, 确保数据依然可用;
  • 在kafka中, 一般会设计副本的个数>1;

8. topic 主题:

kafka的 每个broker 都有其他partion的备份吗_数据_05

  • 主题是一个逻辑概念, 用于生产数据, 消费者拉取数据;
  • kafka中的主题必须要有标志符, 而且是唯一的, kafka中可以有任意数量的主题, 没有数量上的限制;
  • 在主题中的消息是有结构的, 一般一个主题包含某一类消息;
  • 一旦生产者发送消息到主题中, 这些消息就不能被更新;

9 offset 偏移量:

kafka的 每个broker 都有其他partion的备份吗_分布式_06

  • offset记录着下一条将要发送给consumer的消息的序号;
  • 默认kafka将offset存储在zookeeper中;
  • 在一个分区中, 消息是顺序的方式存储的, 每个在分区的消费者都是一个递增的id; 这个就是偏移量offset;
  • 偏移量在分区中才是有意义的; 在分区之间, offset没有意义;

10.消费者组

  • 一个消费者组中可以包含多个消费者, 共同来消费topic中的数据;
  • 一个topic中如果只有一个分区, 那么这个分区只能被这个组中的某个消费者消费;
  • 有多少个分区, 就可以被同一个组内的多少个消费者消费;
  • topic能抗多少个并发, 分区数起到重要的作用;

二、kafka生产者幂等性与事务:

1. 幂等性:

1.1 简介:

拿http距离来说, 一个或多次请求, 得到的响应是一致的(网络等问题除外); 即: 执行多次操作与执行一次操作的影响是一样的;

1.2 kafka生产者幂等性:

kafka的 每个broker 都有其他partion的备份吗_数据_07


在生产者生产消息时, 如果出现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;

kafka的 每个broker 都有其他partion的备份吗_kafka_08


流程:

  • 当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模式)

kafka的 每个broker 都有其他partion的备份吗_kafka_09

2.2 事务操作API:

  • Producer接口中定义了以下5个事务相关方法;
  • initTransactions(初始化事务): 启动一个Kafka事务;
  • sendOffsetsToTransaction(提交偏移量): 批量地将分区对应的offset发送到事务中, 方便后续一块提交;
  • commitTransaction(提交事务): 提交事务;
  • abortTransaction(放弃事务): 取消事务;

2.3 实现:

(TODO…)