問題與挑戰:某公司為了實現某馬總造福全人類,紅旗插遍全球的宏偉目標,為應對后續用戶量激增的問題。特別安排了一次針對全體用戶的秒殺活動:于XXXX年XX月XX日XX時XX分XX秒開始的秒殺五毛錢一百個QQ幣的活動。每個賬戶僅限一次,總數1000萬個。公司董事會經過有關人員書面提議,大家集體開會討論,經過慎重決策,確定該項目正式立項,成立項目管理委員會,開始項目招標流程。我們成功中標該項目。在相關項目合作手續辦理完成以后,我們成立了五毛QQ項目組。
立項之初,我們分析了項目特點,認識到項目建設難度大。由于業主方是一個廣受歡迎的社交大廠,可以預見到五毛QQ一旦發布,巨大的用戶群體會引來海量用戶注冊、登錄、秒殺,享受各種服務,包括不限于網上商城,QQ空間,QQ游戲,QQ博客等。因此甲方公司對于整體系統性能要求極高。我們必須在架構設計時保持嚴謹、正確、科學的設計方法,才能對項目的功能和質量目標起到保障作用。因此我們決定運用分布式存儲,微服務,負載均衡,DNS等多種分布式架構理論及設計方法,結合分層設計的架構思想,力爭實現業主方提出的1000萬最大并發用戶、3000萬tps、延時最高不超過500ms的秒殺場景的質量需求。下文將從系統分層的角度,詳述在該項目中如何實施分布式架構方法。
一、分布式存儲
由于存儲層的各項性能指標將決定整個系統的性能,因此存儲層的架構設計至關重要。本項目對分布式存儲數據進行了分區,分區方式有水平分區和垂直分區兩種。本項目對分布式存儲數據進行了分區,分區方式有水平分區和垂直分區兩種。水平分區是按照一定的分布策略,將數據分布到不同的節點(庫,表等)去存儲,常見的策略有范圍分區、列表分區(枚舉分區)、hash分區。垂直分區是按照業務字段進行分類并拆分表格,分布存儲到不同的節點。采用分區方案后,針對本項目讀多寫少,我們對每個存儲節點設計成“主從集群”方式實現“讀寫分離”和數據的“多節點備份”。這樣的設計方案適用于性能要求較高的大規模存儲系統,既提升了系統的整體并發性、數據存儲的高可靠性,又保證了數據的可靠性。
在該項目中,3000萬tps的訂單數量數據要高效地、可靠地保存到數據庫,只靠單點集中式數據庫是無法實現的。業務方要求性能的同時,也對存儲服務的可用性、數據存儲的可靠性提出了需求,例如可用性要達到99.9999%,數據丟失率要小于0.00001%,因此分布式存儲的架構方案是該項目的不二之選。我們采取的措施如下:
(1)確定基礎技術的選型。我們選用MySQL開源數據庫作為基礎構件,來搭建分區的每個節點。在每個節點使用兩個MySQL組成“主從復制集群”,通過MySQL的復制,保證兩者數據的一致性。當主庫出現問題時,自動化執行“主從切換”,升級從庫為主庫,繼續提供數據讀寫服務,保證兩者數據的一致性。當主庫出現問題時,自動化執行“主從切換”,升級從庫為主庫,繼續提供數據讀寫服務,保證可用性。
(2)確定分區策略。為了確保數據存儲的均勻性,采用了hash的分布策略。對每一個訂單的關鍵信息進行hash運算,并對節點數進行取模后,得到該訂單應該歸屬的存儲節點。
(3)確定分區數量。經過負載測試,我們得到每個存儲節點上的MySQL主從集群在16核32G內存500G普通SSD磁盤的配置下,在可接受的延時范圍內,能夠達到3萬的tps的性能指標。因此我們決定用1000個分區節點來達到3000萬tps指標。
(4)確定透明性等級。為了讓應用層更方面的訪問數據庫,我們選用了Sharing Proxy數據庫代理構件,向應用層屏蔽了存儲層的細節,達到了“分片透明性”登記。這樣應用層訪問分布式數據庫時,就像訪問單點數據庫一樣簡單。
在落實這些策略以后,我們滿足了客戶所要求的數據存取性能指標,為整個系統的質量達標奠定了基礎。
二、微服務化
“微服務化”主張將傳統的單體應用拆分成一組小的服務,服務之間互相協作,實現務功能。每個服務運行在獨立的進程中,采用輕量級的通信機制協作,保證了每個小服務的封裝性、可重用性、易維護性、易擴展性,用以解決業務的復雜性問題。拆解出來的多個小服務有利于實現系統的高并發、高性能、高可用性。
應用層架構需要滿足業主方提出的最大1000萬并發用戶指標。因此我們采用了微服務設計方案,微服務能提供服務的彈性擴展能力,以及并發的擴展能力。業務上我們選用Java的Spring框架,來實現面向用戶的業務服務,把電子商城的訂單、支付、防偽、溯源,封裝成Web Service。在3000萬tps的模擬用戶壓力測試下,不斷調整和優化微服務的數量,讓應用層的整體資源使用率保持在75%左右,由此確定了各業務微服務的集群數量。
三、負載均衡
通常接入層都會有一個Web服務器,它首先接受客戶端的請求,然后將請求傳遞給應用層的某臺服務器去處理。此時它就充當了“負載均衡”功能,決定如何選取應用服務器。
常見的負載均衡策略有輪詢法、隨機法、源地址哈希法等靜態策略,還有最小連接數法、最快響應速度法動態策略。它對于整個系統的分布式架構具有”導流”的作用,也可以提供”限流””熔斷”等高級負載均衡策略。
本項目中,應用層擁有龐大的應用層服務器,需要在接入層選用高性能的Web服務器,來充當負載均衡器。經過仔細研究分析和調研,我們最終選擇了Nginx來擔當Web服務器,并選取了最小連接數法作為負載均衡策略。這可以讓每個應用層服務器獲取平均網絡連接數,使得每個服務的響應用戶數基本相等,從而盡可能地提高應用層服務器的利用效率。
在該項目中,由于有秒殺業務壓測的場景,所以為了避免單機房的流量瓶頸,更靠近用戶來提供服務。由此,我們采用了建設多機房的方案,我們在北京,上海,武漢,深圳,貴陽五地建設了5個機房,分別服務華北、華東、華中、華南、華西的用戶。每個機房都有兩個接入IP,全部綁定同一個域名。DNS會將域名解析為離訪問用戶最近的IP地址,這樣就可以把全國的用戶按照地理位置分配給不同的機房,從而實現更高層面的”負載均衡”。
系統在測試過程中,我們使用漏掃工具發現不少的系統安全漏洞。因此,我們采取了一系列措施提升系統的安全性,例如采取支持HTTPS的傳輸協議,通過SSL鏈路實現數據防篡改、數據加密等功能。采用堡壘機監控平臺的運維活動,審計所有的運維操作,實現操作系統、數據庫、應用等日志統一采集和分析處理。同時充分將代碼審查、漏洞掃描、滲透測試等安全檢查工作貫穿于維護活動中。
得益于各層面分布式架構方案的綜合實施,”五毛QQ”項目質量指標順利達成。
問題:
1. 如何保障該項目的商業收益?拉新與留存的思考?最重要的3個點?思考過程?
2. 對于該設計您有什么好的想法?您認為最重要的3個點是什么?您是基于什么樣的權衡層面來進行思考的,您的權衡過程是什么?
3. 如何保證每個人只能薅一次羊毛?
4. 這個系統的可靠性,安全性能有什么更好的方案,請詳述最重要的3點,以及您是怎么思考的?
5. 后續業務的挑戰與演化的方向,以及應對最重要的3個點是啥?
6. 馬總,這個活動我們打算啥時候開展啊?2024年春節可以不?