前面提到了,kafka0.11.0版本引入的幂等性只能保证分区级别的at-exactly-once语义
如图,producer向三个分区分别生产10条数据,前两个生产成功,写第三个分区时,producer挂掉;producer重启后,重新向三个分区写入数据;
此时producer的PID变化,导致消息重复,因此引入了事务,解决该问题
生产者事务
生产者创建时,设置全局唯一的事务ID --- TransactionID;事务ID与PID绑定,当producer重启后,会根据事务ID查找PID,因此能够保证全局at-exactly-once语义
配置方法:transactional.id(注:使用事务的前提是必须开启幂等性)
解决全局精确唯一语义是kafka事务引入的初衷,但是后期又引入的新的功能:producer生产消息的batch在一个原子单元内完成;
也就是说:当前batch的消息要么全部生产成功,要么全部失败,并且故障恢复后,能够保证事务ID不变;
这里需要提一下:事务ID是由用户指定的,而PID是生产者创建成功后,producer向kafka申请的;并且两者为1:1关系