中小型研發團隊很多,而社區在中小型研發團隊架構實踐方面的探討卻很少。中小型研發團隊特別是50至200人的研發團隊,在早期的業務探索階段,更多關註業務邏輯,快速迭代以驗證商業模式,很少去關註技術架構。這時如果繼續按照原有的架構及研發模式,會出現大量的問題,再也無法玩下去了。能不能有一套可直接落地、基於 ...
中小型研發團隊很多,而社區在中小型研發團隊架構實踐方面的探討卻很少。中小型研發團隊特別是50至200人的研發團隊,在早期的業務探索階段,更多關註業務邏輯,快速迭代以驗證商業模式,很少去關註技術架構。這時如果繼續按照原有的架構及研發模式,會出現大量的問題,再也無法玩下去了。能不能有一套可直接落地、基於開源、成本低,可快速搭建的中間件及架構升級方案呢?我是一個有十多年經驗的IT老兵,曾主導了兩家公司的技術架構升級改造,現拋磚引玉,與大家一起探討這方面的問題。整個系列有18篇文章,可分為三個部分,包括框架篇、架構篇和公共應用篇。框架篇即中間件或工具的使用,如緩存、消息隊列、集中式日誌、度量、微服務框架等,工欲善其事,必先利其器。架構篇主要是設計思想的提升,有企業總體架構、單個項目架構設計、統一應用分層等。公共應用篇是業務與技術的結合,有單點登錄和企業支付網關,以下是具體篇章的介紹:
一、框架篇——工欲善其事,必先利其器
如果說運維是地基,那麼框架就是承重牆。農村建住房是一塊磚一塊磚地往上壘,而城市建大House則是先打地基,再建承重牆,最後才是壘磚,所以中間件的搭建和引進是建設高可用、高性能、易擴展可伸縮的大中型系統的前提。框架篇中的每篇主要由四部分組成:它是什麼、工作原理、使用場景和可直接調試的Demo。其中Demo及中間件是歷經兩家公司四年時間的考驗,涉及幾百個應用,100多個庫1萬多張表,日訂單從幾萬張到十幾萬,年GMV從幾十億到幾百億。所有中間件及工具都是基於開源,早期我們也有部分自主研發如集中式日誌和度量框架。後期在第二家公司時為了快速地搭建,降低成本,易於維護和擴展,全部改為開源。這樣不僅利於個人的學習成長、知識重用和職業生涯,也利於團隊的組建和人才的引進。1、集中式緩存Redis
緩存是電腦的難題之一,分散式緩存亦是如此。Redis看起來非常簡單,但它影響著系統的效率、性能、數據一致性。用好它不容易,具體包括:緩存時長(複雜多維度的計算)、緩存失效處理(主動更新)、緩存鍵(Hash和方便人工干預)、緩存內容及數據結構的選擇、緩存雪崩的處理、緩存穿透的處理等。Redis除了緩存的功能,還有其它功能如Lua計算能力、Limit與Session時間視窗、分散式鎖等。我們使用ServiceStack.Redis做客戶端,使用方法詳見Demo。2、消息隊列RabbitMQ
消息隊列好比葛洲壩,有大量數據的堆積能力,然後再可靠地進行非同步輸出。它是EDA事件驅動架構的核心,也是CQRS同步數據的關鍵。為什麼選擇RabbitMQ而沒有選擇Kafka,因為業務系統有對消息的高可靠性要求,以及對複雜功能如消息確認Ack的要求。3、集中式日誌ELK
日誌主要分為系統日誌和應用日誌兩類。試想一下,你該如何在一個具有幾百台伺服器的集群中定位到問題?如何追蹤每天產生的幾G甚至幾T的數據?集中式日誌就是此類問題的解決方案。早期我們使用自主研發的Log4Net+MongoDB來收集和檢索日誌信息,但隨著數據量的增加,查詢速度卻變得越來越慢。後期改為開源的ELK,雖然易用性有所下降,但它支持海量數據以及與編程語言無關的特征。下圖是ELK的架構圖。4、任務調度Job
任務調度Job如同資料庫作業或Windows計劃任務,是分散式系統中非同步和批處理的關鍵。我們的Job分為WinJob和HttpJob:WinJob是操作系統級別的定時任務,使用開源的框架Quartz.NET實現;而HttpJob則是自主研發實現,採用URL方式可定時調用微服務。HttpJob藉助集群巧妙地解決了WinJob的單點和發佈問題,並集中管理所有的調度規則,調度規則有簡單規則和Cron表達式。HttpJob它簡單易用,但間隔時間不能低於1分鐘,畢竟通過URL方式來調度並不高效。下圖是HttpJob的管理後臺。5、應用監控Metrics
“沒有度量就沒有提升”,度量是改進優化的基礎,是做好一個系統的前置條件。Zabbix一般用於系統級別的監控,Metrics則用於業務應用級別的監控。業務應用是個黑盒子,通過數據埋點來收集應用的實時狀態,然後展示在大屏或看板上。它是報警系統和數字化管理的基礎,還可以結合集中式日誌來快速定位和查找問題。我們的業務監控系統使用Metrics.NET+InfluxDB+Grafana。6、微服務框架MSA
微服務是細粒度業務行為的重用,需要與業務能力及業務階段相匹配。微服務框架是實現微服務及分散式架構的關鍵組件,我們的微服務框架是基於開源ServiceStack來實現。它簡單易用、性能好,文檔自動生成、方便調試測試,調試工具Swagger UI、自動化介面測試工具SoapUI。微服務的介面開放採用我們自主研發的微服務網關,通過治理後臺簡單的配置即可。網關以NIO、IOCP的方式實現高併發,主要功能有鑒權、超時、限流、熔斷、監控等,下圖是Swagger UI調試工具。7、搜索利器Solr
分庫分表後的關聯查詢,大段文本的模糊查詢,這些要如何實現呢?顯然傳統的資料庫沒有很好的解決辦法,這時可以藉助專業的檢索工具。全文檢索工具Solr不僅簡單易用性能好,而且支持海量數據高併發,只需實現系統兩邊數據的準實時或定時同步即可。下圖是Solr的工作原理。8、更多工具
- 分散式協調器ZooKeeper:ZK工作原理、配置中心、Master選舉、Demo,一篇足以;
- ORM框架:Dapper.NET語法簡單、運行速度快,與資料庫無關,SQL自主編寫可控,是一款適合於互聯網系統的資料庫訪問工具;
- 對象映射工具EmitMapper和AutoMapper:EmitMapper性能較高,AutoMapper易用性較好;
- IoC框架:控制反轉IoC輕量級框架Autofac;
- DLL包管理:公司內部DLL包管理工具NuGet,可解決DLL集中存儲、更新、引用、依賴問題;
- 發佈工具Jenkins:一鍵編譯、發佈、自動化測試、一鍵回滾,高效便捷故障低。