跳到主要內容

黃金級贊助商 - 蝦皮購物:擁抱開源技術,推進架構演進

蝦皮購物是一家服務臺灣、印尼、越南等7個東南亞市場的電商平臺,涵蓋了從C2C拍賣、B2C購物到B2B2C商城等多種業務。從2015年開始上線到如今成為區域性的最大電商平臺,蝦皮的系統架構在這段期間承受住了使用者和訂單火箭般地飛速成長,也伴隨著很多痛並快樂的煩惱。而這些煩惱中,有相當一部分就與蝦皮使用的各種各樣的開源軟體相關。

開源軟體還是商業產品?

很多開源軟體都有對應的商業產品,蝦皮從誕生的第一天起,就經常面臨是使用開源軟體方案還是商業產品方案的選擇。舉個例子來說,像大家開啟蝦皮的時候,所有的請求流量會發到蝦皮的負載均衡器,負載均衡器會做按照預先定義的規則做各種各樣的處理,包括服務發現、動態路由、健康檢查、熔斷、故障轉移等等。大家可以想下,因為所有流量都會經過這樣的一個負載均衡的系統,所以我們對它的效能、可用性、可拓展性的要求就非常高。

在負載均衡器領域,F5、A10和AWS的ELB就是非常出名的商業產品。F5和A10都是基於硬體提供的負載均衡,AWS的ELB則是基於軟體。對於F5和A10這種硬體產品來說,一般採購它們的產品的時候是有一定規格和處理能力上限的,且1Gbps和10Gbps有不同的價格,而蝦皮的流量增長又特別快,假設我們這個月買了一臺1Gbps的F5或A10,過不了多久就會因為當前的F5或A10撐不住而要買另一臺更高規格的來進行升級。而且更麻煩的是,像這些硬體負載均衡器的升級只能是替換成更高階的裝置,且升級的過程會造成相當長的一段時間無法訪問網站。而像某些雲服務提供商的負載均衡方案,我們使用它的時候就完全無法撐住蝦皮的海量請求,當雲服務發生問題時我們完全束手無策。這些雲服務對我們來說是一個黑盒子,裡面程式碼到底是如何執行的,我們完全不瞭解,當遇到問題需要解決的時候,我們需要提ticket,來回溝通的週期特別長,至少都要好幾個星期,而我們對服務的可用性要求有特別高,任何時候有問題,都需要第一時間立刻恢復服務,使用商業產品對我們來說,就不得不面對這樣那樣的矛盾。

所以我們最終是基於LVS和Nginx這樣的開源軟體開發了我們自己的負載均衡系統,相比商業產品,開源軟體的程式碼開放,社群使用者參與活躍,我們參與到其中去,一方面可以基於開源軟體開發出更符合蝦皮業務場景的系統並快速定位和修復問題,另一方面也能在向上遊報BUG,修復BUG的過程中和開源社群一起成長,從而更好地支撐業務的發展,保障蝦皮的使用者體驗。

使用開源軟體 A 還是使用開源軟體 B?

對開源軟體來說,即使是同一類別,可能也會有很多不同的選擇。比方說Cache,常見的就有Memcached和Redis。在蝦皮早期的時候,我們就經常遇到Redis CPU跑滿的問題。我們使用profiling工具一查,發現當用戶請求湧進來的時候,我們的服務短時間建立了大量地連線到Redis,而Redis是單執行緒,只能使用一個CPU Core,導致Redis都在處理連線的建立和斷開,正常的Cache讀寫都無法處理,最終導致服務處理請求時大量超時報錯。那時我們為了避免Redis的CPU跑滿的問題,就換用成是多執行緒模型的Memcached。換了Memcached後效果立竿見影,CPU使用都均攤到了每個CPU Core,非常均衡。當然換成Memcached也帶來了一些不方便的地方,因為Memcached不像Redis一樣支援豐富的不同的資料結構和讀寫命令,中間對系統的改造確實是一個相當痛苦的過程。

從今天來看,我們再看看蝦皮到底是使用了Redis還是使用了Memcached。答案是我們都用。蝦皮是由很多不同的分散式系統和服務組成,有不同的場景和業務要求,有些場景用Redis非常合適,直接使用一個Redis自帶的命令就可以解決;有些場景用Memcached就更合適,比方說上面提到的那個例子;有些場景則可以直接上Redis Cluster的方式來繞過Redis單Instance時只能用一個CPU的限制。

在蝦皮的各種不同系統中,從前端到後臺,從資料庫到作業系統,我們使用了大量不同的開源軟體。很多時候並不是非此即彼,用了A就不用B,用了B就不用A。每種開源軟體都有其適合的場景,也有其相對應的優缺點。只要能解決問題,都值得使用嘗試和使用。像Redis和Memcached一樣,他們都是非常優秀的Cache,又有各自適合的場景,對我們來說,都值得使用和學習。

如何正確使用開源軟體和參與開源社群?

在蝦皮,我們使用開源軟體都是當成白盒子來使用。使用開源軟體,意味著也要承擔開源軟體中存在的BUG帶來的風險。在最開始的選型時,我們會去提前瞭解每個開源軟體的內部實現和評估潛在的問題,從而避免使用了不合適的開源軟體,最終折返重頭開始的情況。在使用過程中,遇到問題時和社群保持溝通,修復BUG並回饋patch給社群。

對我們來說,如果使用一個開源軟體,而我們卻不瞭解它內部是如何工作,出問題毫無解決頭緒,無法基於已有的開原始碼做二次修改的話,還不如直接使用相應的商業解決方案,至少商業解決方案有專業支援。比方說Ceph這個分散式檔案儲存系統,蝦皮在使用的過程中,就經常因為各種各樣的原因踩到Ceph的坑,但是Ceph這個分散式的檔案儲存對我們而言又非常重要,每次Ceph出問題都會導致我們的系統當機很長時間,客服人員電話會被海量的使用者投訴打爆,造成非常嚴重的後續影響。這逼著我們不斷地閱讀和熟悉Ceph的各個元件和程式碼,逐漸地糾正之前使用Ceph的錯誤方式,patch相關的地方以便故障時能快速恢復。

而隨著蝦皮使用者量和業務量的不斷增長,很多之前可能是正常工作的開源軟體到了某個瓶頸之後就無法再正常工作。這也讓我們對了解開源軟體的程式碼和內部實現有了更高要求,需要我們能即時定位到效能瓶頸。比方說我們使用Nginx,在過去三年中一直執行的非常穩定,突然前幾天就出現把所有CPU Core跑滿的問題。所幸在過去幾年中,我們基於Nginx的原始碼做了大量工作,對Nginx的程式碼比較熟悉,這次就很快定位到了是一處shared memory lock競爭導致的效能衰退。

蝦皮對這些開源軟體的修改,我們一般會根據實際情況把這些patch提交回上游merge。像Linux Kernel、Docker、Tensorflow等等開源專案中都有蝦皮工程師提交的patch。當然也存在這樣的情況,改動的地方上游覺得不夠好,或者有其他解決方案拒絕或者推遲了我們的patch,或者merge和review的速度非常慢。這個時候可以fork出一個版本,當然也保持開源,這樣其他人如果遇到了和我們一樣的問題的時候,參考我們的改動,也會對他們帶來一定啟發。參與開源社群有很多中方式,不一定提交patch並merge才算,報BUG是一種方式,改進使用說明資料是一種方式,fork出另外的分支也是一種方式,最終都能在開源社群相互交流,共同進步。

蝦皮自研軟體和開源的關係?

在蝦皮,我們廣泛使用了各種各樣的開源專案,但我們也有非常多的核心元件是自行研發。對蝦皮來說,自研和開源並不是對立的,並不是蝦皮自己喜歡重新發明輪子。我們知道,就算是輪子,也分很多種,比方說自行車的輪子和跑車的輪子要求就不一樣,而飛機的輪子又和跑車的輪子要求不同。有些時候,開源社群可能只能找到自行車的輪子,那假設蝦皮要開始造飛機了,在開源社群裡面找不到飛機輪子的實現,那麼沒辦法,我們只能自行研發。

同樣的,在考量解決方案的時候,我們會先看看是否已有開源的方案能解決我們的需求,如果有的話,已有的開源方案是否足夠成功,設計足夠好,執行是否足夠穩定,如果不成熟的話,我們是否可以在這個基礎上,在上面再開發改進。如果整個開源軟體設計優秀,很容易擴充套件和改進,和我們期望的解決方案比較匹配,那麼我們就會採用,一方面節約了資源的投入,同時又能少走一些彎路,而且開源社群不止蝦皮,很多組織都在參與,在整個生態系統中,每個參與的團體做的改進其他團體都能受益。

但也存在開源社群中我們無法找到相對應的實現或者滿足我們要求的實現的情況,這個時候我們會自行研發解決方案。大家知道像蝦皮支援的業務型別非常多,對核心系統和元件有各種各樣的業務要求以及效能上的考量,在廣泛使用開源軟體的同時,蝦皮也有大量自行研發的元件,共同支撐了業務的飛速成長。

蝦皮成立三年來業務飛速成長,離不開各種優秀的開源專案,也在不斷地回饋開源社群,如果你熱愛開源,熱愛Coding,就快快加入我們一起共同成長吧。心動不如馬上行動,火速開啟 https://careers.shopee.com/ 投遞簡歷吧!

留言

這個網誌中的熱門文章

COSCUP 啄事今蜚會前快報 第一期

COSCUP 啄事今蜚會前快報 第一期 2014年06月18日發行 距離大會剩下一個月的時間, 精彩的議程內容即將就定位,讓小啄帶大家來看看今年有些什麼精彩的吧! 從沒有人到超多人: g0v社群經驗 g0v.tw 是一個跨界的開源社群,由一些熟悉軟體開源文化的人開始,從最初期就致力拓展到其他非資訊領域,因此在社群的推動上有各種不同努力。將近兩年來,關注社群人數爆炸性成長,社群因此經歷數次危機。但透過 g0v 與NGO、政府等實體組織互動、加強社群基礎建設、深化參與的文化,社群核心價值與開幹精神至今能量依然不減。此 talk 將以 g0v 為例,分享跨界社群的成長經驗,以及從開源社群拓展到民主深化的初步成果。 State of the unison: g0v 村情咨文 從 2012 底開始的 g0v 運動,成功集結開放源碼社群,並輸出開源文化至各領域,促使公民高效率協作,解決問題。本次演講將回顧 g0v 社群的成果,包括專案、與 gov 合作、國際交流,以及未來展望。 DevRel 的再思考   俺可以来讲讲大陆开源技术社区这12年. 相似演讲: - 幻灯: https://speakerdeck.com/ zoomquiet/140330-ostc-just4fun - 录音: http://zoomq.qiniudn.com/ CPyUG/140330-OSTC/ 140330_ostc_pm1_zoomquiet.MP3 - 录像: http://v.youku.com/v_show/ id_XNjk2OTcyODQ4.html" 更多議程請見 http://coscup.org/2014/zh-tw/program/

COSCon 中國開源年會特別軌:「COSCUP 議程軌」徵稿開始!

COSCUP 於中國的國際交流特別議程軌開跑了!! 想從台灣交換至中國演講的朋友們別錯過了! COSCon 2023 官網 業界最具影響力的開源年度盛會 2023 第八屆中國開源年會 (COSCon’23) 將於 2023 年 10 月 28 日(星期六)- 29 日(星期日)在四川省成都市高新區菁蓉匯由開源社舉辦。 COSCon 以其獨特定位及日益增加的影響力,吸引越來越多的頂級企業和國際基金會的大力支持。與一般企業、IT 媒體、行業協會或國外基金會在國內所舉辦的行業大會大不相同的是,COSCon 除了吸引跨企業和跨項目社區的不同用戶之外,也專註於吸引國內外大咖開源開發者、貢獻者和提交者的關註及參與項目及其社區。 今年的 COSCon 以「開源:川流不息、山海相映」為主題。 我們相信,開源之水將如山川間的溪流,生生不息,永不枯竭,無論是「峰會」還是「海會」,總有一個能容納心向開源的你。 在「後新冠時代」的第一年,我們將採用「烽火模式」,即在主會議後再在有意向的城市舉辦 After Party,將全球聚集而來「開源火種」在全國傳遞,以促進各個城市的開源文化傳播和開源人交流。 目前擬舉辦 After Party 的城市有北京、上海、成都(如果您所在的城市也希望舉辦 Affer Party 歡迎和我們取得聯系)…… 我們策劃的論壇主題包括但不限於:人工智能、開源商業、雲計算、大數據、區塊鏈、物聯網、開源教育、開源文化、開源治理、開源硬件、開源操作系統、女性論壇、開源公益、Web應用開發、開源百寶箱以及閃電演講等。除了各種會議,我們還將舉辦極具特色的“開源市集”,“開源市集”除了有展商的展台,還有各種有意思的小活動、小遊戲,通過遊戲化、娛樂化的方式普及開源文化,倡導開源精神。 COSCUP 今年與 COSCon 進行講者交流合作,於台灣及中國之間交換講者,建立國際交流的重要機會,讓雙方講者都能夠來往交流,特別是提供台灣的開源人更有機會到中國發表演講。 我想要投稿✋ 徵稿期間:即日起~9/13 止 徵稿對象:願意配合 COSCUP / COSCon 對此專案相關宣傳及訪問者; (及需要有被中國接受的證件才能出國。) 徵稿內容:各式 Open Source 相關議題皆可投稿; 請參考 COSCon 今年徵稿論壇類別 (上述) 。 演講

補文:Conference: Impossible! 的 COSCUP 2009

COSCUP 2009 總召 pingooo 在 2009 年寫了三篇有關 COSCUP 的文章,這是 第三篇 ,轉貼到 COSCUP 部落格留個記錄。 唉呀,都 2010 年了,才來寫舉辦 COSCUP 2009 研討會的回顧不會太慢了嗎? 這實在是我自己懶,加上有些帳款比較晚才收到(好像也和我有關 :p),整個 COSCUP 2009 的會計帳前一陣子才結清,要謝謝辛苦對帳的 Layla 和 Jouston。 我另有一篇有關 COSCUP 2009 籌備時期點滴的「 pingooo 總召的碎碎唸 」,是為了大會手冊在大會前三週寫的。辦活動是越接近活動日越緊張,這篇就來寫寫最後那幾週刺激好玩的事、順便 把一些總帳算一算 講講夥伴們不可磨滅的功勞、也履行一下之前說會公開研討會財務的承諾好了。 難得見面的熱血工作夥伴 既歡樂又驚險的大會手冊 COSCUP 物流中心 北京烤鴨爐 COSCUP 花絮照片 COSCUP 名句 好好玩的閃電秀 人客來買唷! 書展 COSCUP 精品街 我們也有吉祥物! 記憶足跡 互相漏氣求進步 數據來了! 誌謝 結束了... 片尾功勞簿 難得見面的熱血工作夥伴 還記得 2008 年底的時候,說話一向一針見血的 Pofeng 發了一封信問幾個朋友 COSCUP 2009 要不要辦,說: 不過我要提醒一下 Ping ; COSCUP 的籌備人力一直不足 休息一年, 我也覺得無妨, 如果 COSCUP 2010 再需要小弟, 小弟也願效犬馬之勞 還好有輔導長 lman 的組織動員能力和各工頭的努力招募,往年一向籌備人力不足的 COSCUP,在 2009 年有了戲劇性的轉變。COSCUP 2009 雖然在台北舉行,但工作夥伴來自各地:台北、基隆、桃園、新竹、台中、嘉義、台南、高雄。都是志工的夥伴們,只能靠工作之餘的時間投入,彼此之間很少見面,完全依賴各種網路工具來討論、協調大小事,這樣也可以辦出一個 兩天兩地450人的歡樂研討會 ,現在想起來還是覺得不可思議!所有夥伴的熱血、主動積極、體諒彼此和相互扶持,是這一切成功的原因。 既歡樂又驚險的大會手冊 在 Ijs 的設計之下,COSCUP 2009 有一本印刷精美的大會手冊,整個研討會的