跳到主要內容

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

蝦皮購物是一家服務臺灣、印尼、越南等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 2025 BoF / Hacking Corners 參與辦法及使用規則

你想在 COSCUP 現場發起一場自由討論、技術分享,或是臨時揪團寫 code 嗎?COSCUP 在會場安排了 BoF(Birds of a Feather)與 Hacking Corner 空間,鼓勵參與者除了聽議程,也能有更多樣的交流機會。以下說明本屆參與辦法與使用規則。 Want to initiate a spontaneous discussion, technical sharing, or impromptu code sprint at COSCUP? As always, COSCUP offers BoF (Birds of a Feather) and Hacking Corner spaces at the venue to encourage participants to engage beyond just attending sessions. Below are the participation guidelines and usage rules for these spaces. (English below) 1. 什麼是 BoF?和議程有什麼不一樣? BoF(Birds of a Feather)是一種由與會社群或參與者自主發起的小型聚會,形式彈性、主題不限。不同於主議程由大會策劃與審核,BoF 鼓勵任何人針對特定議題自發討論、交流,強調「興趣導向」與「雙向參與」。 2. 如何舉辦 BoF? 今年大會提供 TR310-2 作為 BoF 場地,建議會前於 電子佈告欄 預約空間使用及宣傳曝光。亦請詳閱 注意事項 。 3. 如何參加 BoF? 事前在電子佈告欄的 揪團區 +1 也可在現場直接前往 BoF Room(TR310-2)門口查看最新告示,無需報名,自由進出與參與討論 4. 會場外也有 BoF! COSCUP 是各地開源社群難得一年一度聚在一起的機會,很多社群會利用大會兩天晚上,甚至大會前後一兩周的時間舉辦聚會!無論想舉辦或想參與,都可以隨時利用 電子佈告欄 宣傳或查詢。 5. 什麼是 Hacking Corner? Hacking Corner 是現場開放空間(過去稱為 Hacking Room),讓會眾可臨時揪團進行共創、開發、技術交流等非正式活動。每個位置可約容納 10 人,不需...

COSCUP Lightning Talks - 2025 ⚡️

COSCUP 2025 閃電秀 / Lightning talks Photo by COSCUP 2024 紀錄組 閃電秀是一個由多場超短時的議程發表構成的一個表演性質居多的活動,通常會被放在獨佔時段,所有會眾都會聚集到這個會議廳觀賞這齣表演,稱之為閃電秀 (Lightning Talks)。 今年的閃電秀將於 2025 Aug 10 週日的下午 16:15 - 17:00 在 RB105 議程軌開講。 本次閃電秀的參加規則如下: 每個講題 3 分鐘,時間一到就會立刻切掉您的畫面,並邀請觀眾拍手掌聲鼓勵。 歡迎將您想曝光的 Projects、Idea 或小議題在這裡跟大家分享! 應遵守 COSCUP 的 CoC 規則 的原則之下進行發表演說,主持人有權基於本規則的判斷將不適合的發表暫停,並向大家說明理由。 需要再時限內完成報名 敬請自備筆電(和 HDMI 轉接器)上台 需要提早一場議程 (在結束前) 到 Main Hall (RB105) 報到 沒有限制發表語言,但建議可以使用英文或中文,大部分的現場觀眾能夠識別這兩種語言 *所有時區皆為 UTC+8 Lightning Talks is an event featuring multiple short speeches or presentations, typically held within an exclusive time slot. All attendees gather in the main hall to watch the show. This year, the Lightning talks is on Aug 10th from 16:15 - 17:00 (UCT+8) at Room RB105! Each talk is limited to 3 minutes. Once the time is up, your screen will be cut off immediately, and the audience will be invited to applaud and show encouragement. You're welcome to share any projects, ideas, or small topics you...

Kronos 如何做到世界級的成績

  由資深華爾街投資人領軍於 2018 年成立,Kronos Research 結合人工智慧、機器學習、高速網路等先進技術,透過進階的資料分析開發出獨家的量化交易預測模型,並使用全自動的交易策略自營,同時作為加密貨幣造市商,提供全球加密貨幣商品的即時報價。至今四年的時間,便擠身全球前五大的加密貨幣量交易團隊,創下 2021 年每日平均交易額 50 億美金,單日最高交易額 230 億美金的記錄。 人才和技術是 Kronos 最重要的兩大要素,團隊採開放式合作、解決問題導向、美式工作風格,Kronos 期許任何職位的夥伴,都能信任彼此、安心發問、共同快速解決問題。主管的管理策略,不同於傳統上對下的管理,而是以幫助者的角色,解決不同的需求,放大每個職位的生產力。我們希望這個產業在台灣能夠茁壯,讓台灣的技術人才知道有這個國際舞台可以發揮。 一窺量化交易技術及團隊 高頻交易跟一般大家熟知的交易最大的差距在於自動化。我們熟知的交易模式多半透過人工,由交易員綜合市場資訊後向交易所下單;高頻交易則是由程式自動判斷市場資訊並且下單。高頻交易多半關注短時間的市場波動,在收到市場報價後,在極短時間透過預先訓練的統計模型做出買賣決策。在高額報酬的背後,結合了不同專業:包括資料科學、統計與機器學習、底層系統優化、以及分散式系統。 高頻交易的流程,從 Market Data Parser 作為源頭持續搜集來自交易所的歷史資料,交由 Alpha Modeling 訓練出可預測未來短時間市場變動的模型。接著交易團隊撰寫策略程式,並依據策略需要套用選擇合適的 Alpha 模型,由極低延遲的交易程式向交易所下單。以下是各模塊的介紹: Market Data Parser(Data Team):高頻交易是一個資料驅動的行業,全面且高正確率的資料對於後續訓練很重要。Kronos Research 在全球十多個機房內有數百台服務器,每天 24 小時不間斷錄製來自交易所的報價單。面對每天 10TB+ 的巨量資料,data team 大量使用雲端分散技術以及自動化技術確保資料流的穩定。 Alpha Modeling(Alpha Team):在投資市場中,Alpha 代表著高於大盤的超額收益,Alpha Model 則代表預測將來市場的數學模型。Alpha Team 透過統計以及機器學習,以敏銳的邏輯跟觀...