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(最好是每臺機器主機名不一樣,那麼就可以用主機名,這樣以後換機器,只要主機名改成一樣的就可以)

 

 

對於上面提到的問題,後續再研究源碼看看。

 

 

 

 

 

 

 

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