Kafka生产者事务和幂等

目录

1 生产者幂等性

1.1 引入

1.2 幂等性实现

1.2.1 PID 和 Sequence Number

1.2.2 生成PID的流程

1.3 幂等性的应用实例

2 事务属性

2.1 事务属性理解

2.2 引入事务目的

2.3 事务操作的API

3 事务属性的应用实例

3.1 相关属性配置

3.2 只有写

3.3 消费-生产并存(consume-transform-produce)

3.4 只有读

4 生产者事务的实现

4.1 相关配置

4.1.1 Broker configs

4.1.2 Producer configs

4.1.3 Consumer configs

4.2  幂等性和事务性的关系

4.2.1 两者关系

4.2.2 tranaction id 、productid 和 epoch

4.3 事务最佳实践-单实例的事务性

4.4  Consume-transform-Produce 的流程

4.4.1 文件类型和查看命令

4.4.2 ControlMessage和Transaction markers

4.4.3 Transaction Coordinator 和 Transaction Log

4.5 消费读取事务消息(READ_COMMITED)

4.5.1 老版本-读取事务消息顺序

4.5.2 新版本-读取事务消息顺序

4.5.3 Absorted Transaction Index

4.5.3  问题

5 其他思考


本文概览:在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幂等。

1

实现幂等之后

2

1.2.2 生成PID的流程

在执行创建事务时,如下

 

 

1

  Producer<String, String> producer = new KafkaProducer<String, String>(props);

 

会创建一个Sender,并启动线程,执行如下run方法,在maybeWaitForProducerId()中生成一个producerId,如下:

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

====================================

类名:Sender

====================================

 

void run(long now) {

        if (transactionManager != null) {

            try {

                 ........

                if (!transactionManager.isTransactional()) {

                    // 为idempotent producer生成一个producer id

                    maybeWaitForProducerId();

                } else if (transactionManager.hasUnresolvedSequences() && !transactionManager.hasFatalError()) {

                   ........

 

1.3 幂等性的应用实例

1、配置属性

需要设置:

  • enable.idempotence,需要设置为ture,此时就会默认把acks设置为all,所以不需要再设置acks属性了。

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

private Producer buildIdempotProducer(){

 

        // create instance for properties to access producer configs

        Properties props = new Properties();

 

        // bootstrap.servers是Kafka集群的IP地址。多个时,使用逗号隔开

        props.put("bootstrap.servers", "localhost:9092");

 

        props.put("

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值