producer可能给多个topic,多个partition发送消息,这些消息组成一个事务,这些消息需要对consumer同时可见或者同时不可见。Kafka事务需要在producer端处理,consumer端不需要做特殊处理,跟普通消息消费一样
1.事务流程
整个流程步骤:
事务初始化: InitTransactions,事务初始化是一次性的而事务开启、提交/回滚则一致循环运行
开启事务: beginTransaction
发送消息,向n个topic发送多条:producer.send
提交事务: commitTransaction
回滚事务:abortTransaction
2、事务配置
Producer |
Consumer |
||
|
事务ID,类型为String字符串,默认为空,客户端自定义,例如"order_bus" |
|
事务隔离级别,默认为空,开启事务的话,需要将其设置为"read_committed" |
|
消息幂等开关,true/false,默认为false,当配置了transactional.id,此项一定要设置为true,否则会抛出客户端配置异常 |
||
|
事务超时时间,默认为10秒,最长为15分钟 |
当enable.idempotence
设置为true时,kafka会检查如下一些级联配置
配置项 |
内容要求 |
说明 |
|
要求此配置项必须设置为all |
响应必须要设置为all,也就是leader存储消息,并且所有follower也存储了消息后再返回,保证消息的可靠性 |
|
> 0 |
因为幂等特性保证了数据不会重复,在需要强可靠性的前提下,需要用户设置的重试次数 > 0 |
|
<= 5 |
此项配置是表明在producer还未收到broker应答的最大消息批次数量。该值设置的越大,标识可允许的吞吐越高,同时也越容易造成消息乱序 |
3、事务初始化
参与方:Producer、Broker
事务初始化由producer端触发,执行事务初始化主要做以下两个操作:
a)定位TransactionCoordinator
b)初始化producerId
事务初始化代码: