kafka事务transactional.id相关

 

https://www.cnblogs.com/jingangtx/p/11330338.html

https://blog.csdn.net/oTengYue/article/details/104727512/

 

看了这两篇关于事务id的资料,

我有些疑问:

 

两篇文章里都讲了transactional.id是用户自己设置的,而且transactional.id与producerId在事务管理器中是一一对应关系。

即transactional.id作为key,producerId作为value这样的键值对方式存储在事务管理器中,

当producer恢复时,会通过用户自己指定的transactional.id从事务管理器获取producerId,以此来确保幂等性不同会话之间发送数据的幂等性。

 

但是,一般都是多个producer会向同一个topic的同一个partition发送数据,而我们开发时,如果把transactional.id写死在代码中,或者写在.properties和.yaml中,那么我们集群部署producer(多个spring boot项目),那么这多个spring boot项目的kafka producer的transactional.id岂不是都一样?

当多个producer的transactional.id都一样时,在这篇文章中又有如下描述:

文章链接:https://www.cnblogs.com/middleware/p/9477133.html

按这篇文章说的,如果具有相同的transactional.id的producer只能同时有一个正在工作,但生产者不可能只有一个在工作,肯定是多个生产生都生产数据到指定topic的不同分区。要么没有key而采用轮询等策略、要么就是使用key求hash再求余、又或者指定分区号。

但这些都表明肯定有多个producer一起生产数据。

所以,如果某个producer宕机重启前后两次不同的会话的producerID要一样,那么就必须每个producer都拥有一个固定且又不同的transactional.id,

是否如此??

 

如果是这么回事的话,那么transactional.id就不能通过写死的方式解决,或者说,需要根据producer部署在不同机器上之后,再给每个机器上的producer设置一个特定的transactional.id。

这样做会很麻烦,因为自动化部署的时候,比如使用jenkins,maven打包项目、部署项目这些东西都是同一套,配置文件也是一模一样的。除非部署时写脚本根据不同机器设置不同的transactional.id,但这样,以后出了问题解决困难。

最后想到一种不知是否可行:

获取本机ip作为transactional.id(最好是每台机器主机名不一样,那么就可以用主机名,这样以后换机器,只要主机名改成一样的就可以)

 

 

对于上面提到的问题,后续再研究源码看看。

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章