大公司開源怎麼做?SOFAStack 給出一個很好的例子

老王發表於2019-07-22

螞蟻金服的 SOFAStack 作為一個成功地將企業私有專案轉化為開源核心模式的知名案例,我們之前對背後的思考和推動力做過專題分析,但是具體這件事是如何在螞蟻金服內部發生的、是如何實操的,有很多讀者向我們表示非常感興趣,而我覺得這也是其它技術公司所正在探索和思考的方向。

因此,上個月底,老王在參加上海舉辦的 KubeCon 2019 時,遇到了螞蟻金服 SOFA 團隊的餘淮,他目前在螞蟻金服中介軟體團隊服務與框架組具體負責開發框架與 SOFAStack 的開源工作。於是,參會之餘,我和餘淮就 SOFA 開源的實操方面進行了深入的溝通,現將談話所得整理給大家。

餘淮(左)和老王(右)在 KubeCon 2019

SOFA 與開源

2018 年,SOFAStack 開始開源之後,處於關注,我曾向螞蟻金服中介軟體負責人楊冰了解過為什麼要將 SOFA 開源的背後思考,以及 SOFA 發展迭代的歷程

目前,SOFA 的架構已經發展到 SOFA 5 階段,前任的 SOFA 開源負責人魯直也向我介紹過 SOFA 5 中重點推進的方向,主要包括 Service Mesh 和 Serverless,以及分散式事務 Seata 的落地等。而在今年上半年他們又開源了分散式事務框架 Seata 和服務註冊中心 SOFARegistry。

作為一個成功的開源核心模式的專案,我非常關注 SOFA 開源的實操是如何進行的,是如何進行開源治理的,作為 SOFA 團隊的老朋友,我們話題就直接從 SOFA 的開源治理聊起。

以 SOFA 為例:公司內部軟體的開源流程

餘淮說,從 2015 年開始,螞蟻金服開啟了金融科技對外輸出的戰略,SOFAStack 也走出了螞蟻金服,甚至跨越了國界,被更多金融機構與合作伙伴所使用,如天弘基金、信美互信、南京銀行、PayTM、DANA 錢包等。

在與合作伙伴以及客戶的溝通、合作過程中,他們發現了 SOFAStack 的理念和能力也正是很多金融行業的企業所需要的。在螞蟻金融科技對外輸出的過程中,內部已經對 SOFAStack 進行了一定程度的程式碼重構,例如歷史相容邏輯的剝離等,但是並未能達到直接開源的標準。

關於開源,其內部一直有開源的討論,到 2017 年雙十一結束後正式決定開源。經過了一系列的準備,2018 年 4 月,完成了對 SOFA 專案的滿足了開源改造的標準後,SOFAStack 馬上宣佈正式開源框架中部分重要元件。

SOFA 團隊給開源定的策略叫「開源核心Open Core」,顧名思義就是要將介面層以及核心實現都開源,以可擴充套件化的方式來層層構建 SOFAStack 的能力,保證 SOFAStack 的內部版本和開源的版本採用的是同一個核心。為此 SOFAStack 做了大量的改造和重構工作。

在開源的具體考量上,餘淮表示,SOFAStack 的開源改造基本上有三條原則,分別是高可擴充套件性、對內相容歷史版本、對外相容業界標準

以 SOFARPC 重構為例,大概經歷了這樣的過程:

  1. 首先需要將 SOFARPC 進行了一次核心介面和模型抽象,然後增加了擴充套件點機制和事件匯流排機制,所有的對內、對外實現都基於這些核心介面和模型去擴充套件,並且保證這些擴充套件能力都是平等的、可選的;
  2. 接著將核心的處理邏輯實現遷移到這套介面和模型上來,保證 RPC 能力完整可用;
  3. 然後需要將 RPC 裡一些對接內部系統的、相容歷史邏輯的程式碼做成內部擴充套件,並進行全量測試驗證,確保和已有線上的歷史方案的相容,釋出上線;
  4. 最後會調研業界的一些開源標準方案和實現,並對其進行相容,例如 SOFARPC 不僅對接自己的 SOFARegistry 的實現,還相容了 Zookeeper、Etcd、Nacos 等業界優秀的註冊中心方案。

雖然上面重構過程聽上去沒那麼複雜,但是在實際過程中還是非常考驗團隊的技術能力的,特別是在抽象核心介面和模型的時候,為了做到既相容內部又相容外部,這需要進行大量的調研工作,才能做好這層較為通用抽象。其次在對內邏輯相容的時候,由於內部的歷史負擔還是比較重的,為了能讓重構的程式碼安全上線,團隊也做了很多事情。

還是舉 SOFARPC 的例子,螞蟻內部的服務路由過程比開源是要複雜很多的,特別是配合螞蟻特有的單元化部署以及異地多活的能力,有時候需要多層路由才能找到目標地址。為了驗證重構後邏輯的正確性,除了在開原始碼裡有單元測試用例外,SOFA 團隊在內部也構建了一套非常完善的整合框架,專門用來測試已有邏輯的相容性及正確性。

基於開源核心這套思想建設 SOFAStack 以後,其實對開發人員的工作量來不會變少,反而可能是增多的。這是因為在寫程式碼的同時,需要更多的考慮內部外部的使用情況,對程式碼質量也提出了更高的要求,開發流程會變得更加複雜。

例如,內部新增一個特性,在以前可能直接修改程式碼經過測試就釋出上線了,但現在的話會去思考這其中哪些能力是通用的,把這些能力抽象一下放到開源版本里去,然後開源版測試後釋出,這個時候內部版本在基於這個開源版進行擴充套件,再經過測試後釋出上線。

雖然開發人員工作變多了,但是這樣的話可以讓 SOFAStack 的核心程式碼被更多的開發者評審,在更多的系統中執行,在更多的場景下進行驗證,對 SOFAStack 的品質保證有非常大的幫助。

此外在開源進度上,餘淮表示, SOFAStack 並不追求開源全部內部的元件,而是會根據產品的特性和開源準備的情況有選擇的開源。

例如 SOFAStack 下的分庫、分表元件,因為產品特性和 OB 等內部結合緊密就暫時不會開源。金融級分散式架構下未開源部分能力,SOFAStack 會和與業界其它優秀的開源專案做整合,保證整個金融級分散式架構功能的完整性和多樣性

所以對於 SOFAStack 來說,並不只有自己開源的產品,而更多關注的是,和整個社群裡所有開源優秀的產品一起,打造一套快速構建金融級分散式架構的套件。

開源專案的管理

開源一個專案,作為背後推動的公司事實上要付出相當多的人力和資金成本,同時,也不可避免的會涉及到審批流程。隨著螞蟻金服越來越多領域的專案開源,包括 SOFAStack、AI、區塊鏈等,螞蟻金服內部出臺了相應的嚴格的稽核機制,包括技術、合規、法務、安全等部門進行稽核,同時還會考察專案開源對公司的意義,以及是否對社群有價值,在稽核透過之後專案就會正式開源與大家見面了。

螞蟻金服對於開源文化是十分友好的,其內部的程式碼也大多都是公開在內網的 GitLab 倉庫,經常會有業務團隊對 SOFAStack 提交一些合併請求(拉取請求)來幫助專案的發展。

同時,螞蟻金服的工程師也普遍地擁抱開源,開源能夠幫助專案產生更多、更好的想法,同時也可以吸收來自社群的貢獻,讓專案本身能夠做的更好,這是大家所喜聞樂見的。

SOFA 的社群治理

開源專案並不是開放原始碼就是終點,事實上,這只是開始,之後持續不斷的開源治理才是開源之路。而如何將一個開源專案從最開始的由開源專案背後的公司主導轉變為社群性專案,這是一個值得思考和探索的課題。

基於目前的開源模式和社群建設力度,SOFA 團隊也在儘可能去吸引外部的貢獻者。不過 SOFAStack 專案由於大量應用在螞蟻金服及不少企業線上環境,所以目前對於開發者技術能力以及程式碼質量要求相對較高,因此,這項任務還需要較多的工作。

目前 SOFA 社群已經湧現了不少積極的開發者和貢獻者,解決了社群提出的一些重要需求。這其中一些功能元件的完成,貢獻者提供了相當重要的程式碼基礎,而 SOFA 社群成員也積極參與到功能的完善和規範化工作中,甚至有的拉取請求要經過十幾個來回才能被合併入功能分支。

餘淮同時也談到,下一步會引入更友好的流程和工具,讓更多的開發者能夠更容易地加入到 SOFAStack 社群的開發和貢獻當中,為 SOFAStack 的共同發展做出包括貢獻程式碼、文件完善和推廣宣傳等各個方面的貢獻。

在社群團隊方面,SOFAStack 也設計了諸如貢獻者Contributor提交者Committer委員會成員PMC等多個層面的貢獻者認證機制,以讓各個層級的熱情、精力不同的人能夠加入到專案的貢獻中。

SOFAStack 開源至今社群已經有 120 多位貢獻者共建社群,也有十來位外部提交者透過其貢獻的程式碼獲得社群的認可,並進一步取得對社群發展的影響力。談及這一點,餘淮表示,為了保證程式碼質量,來自社群的程式碼貢獻往往需要 SOFAStack 社群已有成員和貢獻者許多次的往復修改和完善才能進入到程式碼主幹,但是透過這些互動,才能真正遴選出來社群的中堅分子,也進一步將專案融入到社群中。

在社群建設方面,除了在 Github 上、釘釘微信群的一些交流外,SOFAStack 社群還會有豐富的線上線下的活動。每週類似週報形式的 SOFA Weekly,幫助大家瞭解社群的最新資訊和專案進展;社群共建的 SOFALab 原始碼解析實驗室,和社群同學一起學習和解析原始碼,整理成冊,幫助大家更好的學習專案;每月若干次的 SOFAChannel 直播,可以線上和講師進行溝通交流。與此同時,SOFAStack 也會定期在全國各地舉行線下的 SOFAMeetup 活動,大家一起面對面交流,目前已經在全國五個城市舉辦了 7 場,共有一千多人到現場;也會舉辦 Workshop 和 CodeLab 等實踐類的活動,像本次的 KubeCon 就有一場 Workshop,手把手帶著大家一起實踐 SOFAStack。

在社群合作方面,社群裡有很多優秀的開發者和開源專案,SOFA 團隊也經常和社群互相學習、分享、交流技術,目前SOFAStack 已經和很多開源社群建立了良好的關係,包括國內 ServiceMesher,K8S 中國,ShardingSephere,SkyWalking,Ant Design,EggJS 等,也包括國外的 light4j 等。

此外,餘淮還談到,SOFAStack 在今年還會結合實際業務方面和開源社群做更多的能力整合提升,他舉例說到 SOFAStack 今年會和做 Spring Cloud 更深入的整合和增強,例如 Spring Cloud 還是檔案級別的配置更新,配合 SOFAStack可以做到更細粒度的配置更新等。

總結

要說我對哪個國內開源專案研究的最深入,那非 SOFAStack 莫屬。自從 SOFAStack 開源以來,我先後和楊冰、魯直從 SOFA 開源的思想、戰略層面進行過深入溝通,而這次,我希望可以從戰術上,從實操層面分享他們在 SOFA 開源方面的經驗給廣大的開源社群和開源企業。

大公司開源怎麼做?SOFAStack 給出一個很好的例子

“穿山甲專訪”欄目是 Linux 中國社群推出的面向開源界、網際網路技術圈的重要領軍人物的系列採訪,將為大家介紹中國開源領域中一些積極推動開源,諳熟開源思想的技術人,並辨析其思考、挖掘其動因,揭示其背後所發生的事情,為關注開源、有志於開源的企業和技術人標出一條路徑。

取名為“穿山甲”寓意有二:取穿山甲挖掘、深入之意來象徵技術進步和表徵技術領袖的作用;穿山甲是珍稀保護動物,宣傳公益。

大公司開源怎麼做?SOFAStack 給出一個很好的例子

相關文章