探索 Seata 項目開源開發之旅

Seata 是一款開源的分佈式事務解決方案,致力於在微服務架構下提供高性能和簡單易用的分佈式事務服務。在今年的開源之夏活動中,我加入了 Apache Seata (Incubator) 社區,完成了開源之夏的課題,並從此一直積極參與社區。我有幸在雲棲大會-開發者秀場上分享了我的開發者經驗。在本文中,我將與大家分享我在 Seata 社區中的開發者之旅,以及在這個旅程中積累的經驗和見解。希望通過我的故事,能夠激勵更多人踏上這充滿挑戰和激勵的開源之路,爲開源社區的繁榮做出自己的貢獻。

相關背景

在正式介紹我的經歷之前,我想先提供一些相關的背景信息,以解釋爲什麼我要參與開源以及如何參與開源。關於參與開源的原因,我相信每個人都有不同的動機。以下是我認爲一些主要的原因:

  • 學習:參與開源使我們有機會爲不同組織開發的開源項目做出貢獻,與行業專家互動,提供了學習的機會。
  • 技能提升:以我爲例,我通常使用 Java 和 Python 進行後端開發。但在參與 Seata 項目時,我有機會學習 Go 語言,拓寬了我的後端技術棧。此外作爲學生,我很難接觸到生產級框架或應用,而開源社區爲我提供了這個機會。
  • 興趣:我身邊的朋友都是熱衷於開源的,他們享受編程,對開源充滿熱情。
  • 求職:參與開源可以豐富我們的作品集,爲簡歷增加分量。
  • 工作需求:有時參與開源是爲了解決工作中遇到的問題或滿足工作需求。

這些都是參與開源的原因,對我來說,學習、技能提升和興趣是我參與開源的主要動機。無論你是在校學生還是在職人員,如果你有參與開源的意願,不要猶豫,任何人都可以爲開源項目做出貢獻。年齡、性別、工作和所在地都不重要,關鍵是你的熱情和對開源項目的好奇心。

我參與開源的契機是參加了中科院軟件所舉辦的開源之夏活動。

開源之夏是一個面向高校開發者的開源活動,社區發佈開源項目,學生開發者在導師的指導下完成項目的開發,結項成果貢獻給社區,合入社區倉庫,獲得項目獎金和證書。開源之夏是踏入開源社區的一個絕佳契機,也是我第一次比較正式地接觸開源項目,而這個經歷爲我打開了一扇全新的大門。自此我深刻地認識到參與開源項目的建設,分享自己的技術成果,讓更多的開發者能夠使用你所貢獻的東西,是一件極富樂趣和意義的事情。

下面我分享的這張圖片是開源之夏官方公開的數據,從 2020 年開始參與的社區數量還有學生數量都在逐年增加,活動也是越辦越好。可以看到今年的參與的社區項目共有 133 個,每個社區又提供了若干個課題,而每位學生只能選擇一個課題。想要在這麼多個社區中找到想要參與的社區和適合自己的課題是一個相對複雜的任務。

綜合考慮社區的活躍程度、技術棧契合度、新人引導情況等,最終我選擇加入 Seata 社區。

Seata 是一款開源的分佈式事務框架,提供了完整的分佈式事務解決方案,包括 AT、TCC、Saga 和 XA 事務模式,可支持多種編程語言和數據存儲方案。從 19 年開源起到今年已經走過了 5 個年頭,社區中有超過 300 多位貢獻者,項目收穫了 24k+ 星標,是一個非常成熟的社區。同時 Seata 兼容 10 餘種主流 RPC 框架和 RDBMS,與 20 多個社區存在集成和被集成的關係,被幾千家客戶應用到業務系統中,可以說是分佈式事務解決方案的事實標準。

2023 年 10 月 29 日,Seata 正式捐贈給了 Apache 軟件基金會,成爲孵化項目。經過孵化之後,Seata 將有望成爲首個 Apache 軟件基金會的分佈式事務框架頂級項目。這次捐贈也將推動 Seata 更廣泛地發展,對生態系統的建設產生深遠的影響,從而使更多的開發者受益。這個重要的里程碑也爲 Seata 帶來更廣闊的發展空間。

開發之旅

介紹完了一些基本情況,後文中我將分享我在 Seata 社區的開發之旅。

在正式開始開發之前,我進行了許多準備工作。因爲 Seata 已經經歷了五年的發展,積累了數十萬行代碼,因此直接參與開發需要一定的上手成本。我分享了一些準備經驗,希望能夠爲大家提供一些啓發。

1. 文檔和博客是第一手材料

文檔和博客這類的文本材料可以幫助社區新人迅速瞭解項目背景和代碼結構。

首先,官方文檔是最主要的參考資料,從這裏可以瞭解到一切官方認爲你需要了解的東西。

博客,僅次於官方文檔的材料,一般是開發者或者是深度用戶編寫的,和文檔不同的點在於博客可能會更深入到某個專項上去介紹,比如一些項目的理論模型、項目結構、某個模塊的源碼分析等等。

公衆號,和博客類似,一般是偏技術性的文章,公衆號還有個優點是可以訂閱推送,利用碎片時間閱讀一些技術。

此外,開源社區的一些在線分享或線下 Meetup 公開的幻燈片也是非常有意義的文本資料。

除了官方資料之外,還有許多第三方資料可供學習,比如可以通過用戶分享的 use cases 瞭解項目的具體實施和實踐;通過第三方社區的集成文檔瞭解項目的生態;還有就是通過第三方的視頻教程來學習。但在所有這些資料中,我認爲官方文檔和博客是最有幫助的。

2. 熟悉使用框架

當然剛纔說的這些文本資料肯定不需要面面俱到的看完,紙上得來終覺淺,看到感覺差不多明白了就可以去實踐了。可以按照官方文檔的"Get Started"章節逐步瞭解項目的基本流程。另一種方法是查找官方提供的示例或演示,構建並運行它們,理解代碼和配置的含義,並通過使用項目瞭解項目的需求、目標以及現有功能和架構。

例如,Seata有一個名爲 seata-samples 的倉庫,其中包含20多種用例,比如 Seata 和 Dubbo 集成,和 SCA, Nacos 集成的案例,基本可以覆蓋到支持的所有場景。

3. 粗略閱讀源代碼把握主要邏輯

在準備階段,粗略地閱讀源代碼以把握項目的主要邏輯也很重要。瞭解如何高效地把握項目的主要內容是一個需要長期積累的技能。首先,通過前述的準備步驟,瞭解項目的概念、交互和流程模型是很有幫助的。

以 Seata 爲例,通過官方文檔和實際操作,可以瞭解 Seata 事務領域的三個角色:TC(Transaction Coordinator)、TM(Transaction Manager)和 RM(Resource Manager)。TC 作爲獨立部署的 Server 用於維護全局和分支事務的狀態,是 Seata 實現高可用的關鍵;TM 用於與 TC 交互,定義全局事務的開始、提交或回滾;RM 用於管理分支事務處理的資源,與 TC 交互以註冊分支事務和報告分支事務的狀態,並驅動分支事務提交或回滾。粗略地瞭解這些角色之間的交互後,可以更輕鬆地把握項目的主要邏輯。

腦海裏刻下了這些模型的印象,對源碼的主幹提取就相對得心應手了一些。比如 Seata TC 事務協調者,作爲 Server 端,是一個獨立於業務部署的單獨應用。那爲了分析源碼,就可以直接在本地把 server 起起來,通過啓動類開始追蹤。可以分析到一些初始化的邏輯比如服務註冊、全局鎖的初始化等等。還有可以通過 RPC 的調用來追蹤到交互邏輯的代碼,比如 TC 是如何對全局事務和分支事務進行持久化,如何驅動全局事務提交或者回滾的。

然而內嵌客戶端的框架代碼,沒有一個啓動類入口可以入手分析。那其實可以從一個 sample 入手,找到其對框架代碼的引用從而進行閱讀。比如 Seata 一個很重要的註解是 GlobalTransaction,用於標識一個全局事務。想要知道 TM 是如何對這個註解分析的,那我們通過 IDE 的搜索功能,找到 GlobalTransaction 的攔截器即可分析其中的邏輯。

還有一個小 tips 分享給大家,往往來說單測注重於單一模塊的職能,可以通過閱讀單測可以瞭解一個模塊的輸入輸出、邏輯邊界,也可以順着單測的調用鏈去閱讀代碼,也是理解源碼一個很重要的手段。

萬事俱備只欠東風,做完充足的準備,下一步就是區積極參與到社區之中。

參與的方式也有很多種,最常見的參與方式是查看項目的 Issues 列表,社區通常會爲新貢獻者標記一些帶有特殊標籤的 Issue,如“good-first-issue”、“contributions-welcome”和“help-wanted”等。可以通過這些標籤篩選感興趣的任務。

除了 Issues,GitHub 還提供了討論的功能,可以參與一些公開的討論並獲取新的想法。

此外,社區通常會定期舉行會議,比如週會或雙週會,可以通過參加這些會議來了解社區的最新進展,提出問題以及與其他社區成員交流。

總結與心得

我加入 Seata 社區最初是通過開源之夏活動。我完成了我的課題,爲 Seata Saga 實現了一些新的功能,也做了一系列的優化。但我不止於此,因爲在 Seata 的開源經歷中我獲得了學生生涯中最寶貴的一次開發者體驗,在之後的時間我也持續通過上述參與方式持續活躍在社區中。這主要得益於以下幾個方面:

  • 溝通與社交

導師制度爲我提供了重要的支持。在開發過程中,我與我的導師亦夏之間的密切合作對我適應社區文化和工作流程起到了關鍵作用。他不僅幫助我適應了社區,還爲我提供了程序設計的思路,也與我分享了一些在工作中的經驗和見解,這些都對我的發展非常有幫助。此外,Seata 社區創始人清銘也提供了很多幫助,包括建立了與其他同學的聯繫,幫助我進行 Code Review,也爲我提供了許多機會。

  • 正反饋

在 Seata 的開發過程中,我經歷了一個良性的循環。許多細節爲我提供了許多正反饋,例如我的貢獻能被用戶廣泛使用和受益,比如開發得到了社區的認可。這些正反饋加強了我繼續在 Seata 社區貢獻的意願。

  • 技能提升

再就是參與 Seata 開發,對我能力的提升也是巨大的。在這裏,我能學習到生產級別的代碼,包括性能優化,接口設計,邊界判斷的技巧。可以直接參與一個開源項目的運作,包括項目計劃,安排,溝通等。當然還了解一個分佈式事務框架是如何設計並實現的。

除了這些寶貴的開發者體驗,我也從這次經歷中體悟到了一些關於參與開源的個人心得,爲激勵其他有興趣參與開源社區的同學,我做了簡單的總結:

  • 瞭解和學習社區文化和價值觀

每個開源社區都有不同的文化和價值觀。瞭解社區的文化和價值觀對於成功參與社區至關重要。觀察和了解社區其他成員的日常開發和交流方式是學習社區文化的好方法。在社區中要尊重他人的意見和包容不同的觀點。

  • 敢於邁出第一步

不要害怕面對困難,邁出第一步是參與開源社區的關鍵。可以通過領取標有"good-first-issue"等標籤的 Issue,編寫文檔、單元測試等方式來開始。重要的是要克服畏難情緒,積極嘗試並學習。

  • 對自己的工作要充滿信心

不要懷疑自己的能力。每個人都是從零開始的,沒有人天生就是專家。參與開源社區是一個學習和成長的過程,需要不斷的實踐和積累經驗。

  • 積極參與討論,持續學習不同技術

不要害怕提出問題,無論是關於項目的具體技術還是開發過程中的挑戰。同時也不要侷限於一個領域。嘗試學習和掌握不同編程語言、框架和工具,這可以拓寬技術視野,爲項目提供有價值的洞見。

通過我的開源之旅,我積累了寶貴的經驗和技能,這些不僅幫助我成長爲一個更有價值的開發者,也讓我深刻地瞭解了開源社區的力量。然而,我不僅僅是個別的參與者,我代表着 Seata 社區的一部分。Seata 作爲一個正在不斷成長和演變的開源項目,有着巨大的潛力,同時也面臨着新的挑戰。因此我要強調 Seata 社區的重要性和未來的潛力,它已經進入 Apache 軟件基金會的孵化階段,這個重要的里程碑將爲 Seata 帶來更廣闊的發展空間。Seata 歡迎更多的開發者和貢獻者的加入,讓我們共同推動這個開源項目的發展,爲分佈式事務領域的進步貢獻一份力量。

作者:尹祥琨,清華大學,Seata 開源之夏學生參與者

原文鏈接

本文爲阿里雲原創內容,未經允許不得轉載。

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