Kafka优化总结 (不错)
/zjh_746140129/article/details/88779640
Kafka面试题参考(不错)
/linke1183982890/article/details/83303003
Kafak(04) Kafka生产者事务和幂等(很好)
Kafak(04) Kafka生产者事务和幂等
本文概览:在Kafka 0.11.0.0引入了 EOS(exactly once semantics,精确一次处理语义)的特性,这个特性包括kafka幂等性和kafka事务两个属性。本小节对这个属性进行介绍。
1 生产者幂等性
1.1 引入
幂等性引入目的:
生产者重复生产消息。生产者进行retry会产生重试时,会重复产生消息。有了幂等性之后,在进行retry重试时,只会生成一个消息。
1.2 幂等性实现
1.2.1 PID 和 Sequence Number
为了实现Producer的幂等性,Kafka引入了Producer ID(即PID)和Sequence Number。
PID。每个新的Producer在初始化的时候会被分配一个唯一的PID,这个PID对用户是不可见的。Sequence Numbler。(对于每个PID,该Producer发送数据的每个<Topic, Partition>都对应一个从0开始单调递增的Sequence Number。
Broker端在缓存中保存了这seq number,对于接收的每条消息,如果其序号比Broker缓存中序号大于1则接受它,否则将其丢弃。这样就可以实现了消息重复提交了。但是,只能保证单个Producer对于同一个<Topic, Partition>的Exactly Once语义。不能保证同一个Producer一个topic不同的partion幂等。
实现幂等之后
2 事务属性
2.1 事务属性理解
事务属性是Kafka 0.11.0.0引入的新特性。类似于数据库事务,只是这里的数据源是Kafka,kafka事务属性是指一系列的生产者生产消息和消费者提交偏移量的操作在一个事务,或者说是是一个原子操作),同时成功或者失败。
注意:在理解消息的事务时,一直处于一个错误理解就是如下代码中,把操作db的业务逻辑跟操作消息当成是一个事务。其实这个是有问题的,操作DB数据库的数据源是DB,消息数据源是kfaka,这是完全不同两个数据,一种数据源(如mysql,kafka)对应一个事务,所以它们是两个独立的事务:kafka事务指kafka一系列 生产、消费消息等操作组成一个原子操作;db事务是指操作数据库的一系列增删改操作组成一个原子操作。voidkakfa_in_tranction(){
// 1.kafa的操作:读取消息或者生产消息
kafkaOperation();
// 2.db操作
dbOperation()
}2.2 引入事务目的
在事务属性之前先引入了生产者幂等性,它的作用为:
(1)生产者多次发送消息可以封装成一个原子操作,要么都成功,要么失败
(2)consumer-transform-producer模式下,因为消费者提交偏移量出现问题,导致在重复消费消息时,生产者重复生产消息。需要将这个模式下消费者提交偏移量操作和生成者一系列生成消息的操作封装成一个原子操作。
消费者提交偏移量导致重复消费消息的场景:消费者在消费消息完成提交偏移量o2之前挂掉了(假设它最近提交的偏移量是o1),此时执行再均衡时,其它消费者会重复消费消息(o1到o2之间的消息)。
在一个原子操作中,根据包含的操作类型,可以分为三种情况:
(1) 只有Producer生产消息;
(2) 消费消息和生产消息并存,这个是事务场景中最常用的情况,就是我们常说的“consume-transform-produce ”模式
(3) 只有consumer消费消息,
前两种情况是事务引入的场景,最后一种情况没有使用价值(跟使用手动提交效果一样)