中小型研發團隊架構實踐三要點

来源:https://www.cnblogs.com/supersnowyao/archive/2018/01/08/8244946.html
-Advertisement-
Play Games

中小型研發團隊很多,而社區在中小型研發團隊架構實踐方面的探討卻很少。中小型研發團隊特別是 50 至 200 人的研發團隊,在早期的業務探索階段,更多關註業務邏輯,快速迭代以驗證商業模式,很少去關註技術架構。 這時如果繼續按照原有的架構及研發模式,會出現大量的問題,再也無法玩下去了。能不能有一套可直接 ...


     中小型研發團隊很多,而社區在中小型研發團隊架構實踐方面的探討卻很少。中小型研發團隊特別是 50 至 200 人的研發團隊,在早期的業務探索階段,更多關註業務邏輯,快速迭代以驗證商業模式,很少去關註技術架構。

     這時如果繼續按照原有的架構及研發模式,會出現大量的問題,再也無法玩下去了。能不能有一套可直接落地、基於開源、成本低,可快速搭建的中間件及架構升級方案呢?

     根據我們以往的經驗,分享者主講一個小時左右,業務研發就可以快速地進入項目實戰。對於後面新加入的團隊成員,也可通過 WIKI 自主快速學習。這是我們之前對自己的要求,儘量降低工具對人員的要求,簡單實用、降低成本。

     文章中部分 Demo 採用 C# 語言, 但到了框架或架構層面,與語言本身沒有太多直接的關係。如 RabbitMQ、Job、Redis 和集中式日誌,它們服務端的部署是一樣的,只是客戶端語言版本稍有不同。

     所有 Demo 都可直接運行,服務地址及管理後臺也可直接訪問。因為部署在公有雲,牽涉到成本費用的問題,我計劃持續到明年 3 月底。

     這些小小的基礎工作,希望能夠幫到中小型研發團隊,解決大家項目中遇到的實際問題。願與你一起成長,你的分享和點贊是我此次付出的動力,謝謝!

     整個系列文章分為三個部分,包括 框架篇、架構篇 公共應用篇

  • 框架篇:即中間件或工具的使用,如緩存、消息隊列、集中式日誌、度量、微服務框架等,工欲善其事,必先利其器。
  • 架構篇:主要是設計思想的提升,有企業總體架構、單個項目架構設計、統一應用分層等。
  • 公共應用篇:是業務與技術的結合,有單點登錄和企業支付網關。

     以下是篇章的具體介紹:

框架篇——工欲善其事,必先利其器

     如果說運維是地基,那麼框架就是承重牆。農村建住房是一塊磚一塊磚地往上壘,而城市建大 House 則是先打地基,再建承重牆,最後才是壘磚,所以中間件的搭建和引進是建設高可用、高性能、易擴展可伸縮的大中型系統的前提。

     框架篇中的每篇主要由四部分組成:它是什麼工作原理使用場景可直接調試的 Demo。其中 Demo 及中間件歷經兩家公司四年時間的考驗,涉及幾百個應用,100 多個庫 1 萬多張表,日訂單從幾萬張到十幾萬,年 GMV 從幾十億到幾百億。

     所有中間件及工具都是基於開源,早期我們也有部分自主研發如集中式日誌和度量框架。後期在第二家公司時為了快速地搭建,降低成本,易於維護和擴展,全部改為開源。這樣不僅利於個人的學習成長、知識重用和職業生涯,也利於團隊的組建和人才的引進。

     集中式緩存 Redis

     緩存是電腦的難題之一,分散式緩存亦是如此。Redis 看起來非常簡單,但它影響著系統的效率、性能、數據一致性。

     用好它不容易,涉及到的問題包括:緩存時長(複雜多維度的計算)、緩存失效處理(主動更新)、緩存鍵(Hash 和方便人工干預)、緩存內容及數據結構的選擇、緩存雪崩的處理、緩存穿透的處理等。

     Redis 除了緩存的功能,還有其它功能如 Lua 計算能力、Limit 與 Session 時間視窗、分散式鎖等。

     消息隊列 RabbitMQ

     消息隊列好比葛洲壩,有大量數據的堆積能力,然後再可靠地進行非同步輸出。它是 EDA 事件驅動架構的核心,也是 CQRS 同步數據的關鍵。為什麼選擇 RabbitMQ 而沒有選擇 Kafka,因為業務系統有對消息的高可靠性要求,以及對複雜功能如消息確認 Ack 的要求。

     集中式日誌ELK

     日誌主要分為系統日誌應用日誌兩類。試想一下,你該如何在一個具有幾百台伺服器的集群中定位到問題?如何追蹤每天產生的幾 G 甚至幾 T 的數據?集中式日誌就是此類問題的解決方案。

     早期我們使用自主研發的 Log4Net+MongoDB 來收集和檢索日誌信息,但隨著數據量的增加,查詢速度卻變得越來越慢。後期改為開源的 ELK,雖然易用性有所下降,但它支持海量數據以及與編程語言無關的特征。下麵是 ELK 的架構圖。

    

     任務調度 Job

     任務調度 Job 如同資料庫作業或 Windows 計劃任務,是分散式系統中非同步和批處理的關鍵。我們的 Job 分為 WinJob 和 HttpJob:WinJob 是操作系統級別的定時任務,使用開源的框架 Quartz.NET 實現;而 HttpJob 則是自主研發實現,採用 URL 方式可定時調用微服務。

     HttpJob 藉助集群巧妙地解決了 WinJob 的單點和發佈問題,並集中管理所有的調度規則,調度規則有簡單規則和 Cron 表達式。HttpJob 它簡單易用,但間隔時間不能低於 1 分鐘,畢竟通過 URL 方式來調度並不高效。下圖是 HttpJob 的管理後臺。

      

     應用監控 Metrics

     “沒有度量就沒有提升”,度量是改進優化的基礎,是做好一個系統的前置條件。Zabbix 一般用於系統級別的監控,Metrics 則用於業務應用級別的監控。

     業務應用是個黑盒子,通過數據埋點來收集應用的實時狀態,然後展示在大屏或看板上。它是報警系統和數字化管理的基礎,還可以結合集中式日誌來快速定位和查找問題。我們的業務監控系統使用 Metrics.NET+InfluxDB+Grafana

      

     微服務框架 MSA

     微服務是細粒度業務行為的重用,需要與業務能力及業務階段相匹配。微服務框架是實現微服務及分散式架構的關鍵組件,我們的微服務框架是基於開源 ServiceStack 來實現。

     它簡單易用、性能好,文檔自動生成、方便調試測試,調試工具 Swagger UI、自動化介面測試工具 SoapUI。微服務的介面開放採用我們自主研發的微服務網關,通過治理後臺簡單的配置即可。網關以 NIO、IOCP 的方式實現高併發,主要功能有鑒權、超時、限流、熔斷、監控等,下圖是 Swagger UI 調試工具。

      

     搜索利器 Solr

     分庫分表後的關聯查詢,大段文本的模糊查詢,這些要如何實現呢?顯然傳統的資料庫沒有很好的解決辦法,這時可以藉助專業的檢索工具。

     全文檢索工具 Solr 不僅簡單易用性能好,而且支持海量數據高併發,只需實現系統兩邊數據的準實時或定時同步即可。下圖是 Solr 的工作原理。

      

     更多工具

  • 分散式協調器 ZooKeeper
    ZK 工作原理、配置中心、Master 選舉、Demo,一篇足以。
  • ORM 框架
    Dapper.NET 語法簡單、運行速度快,與資料庫無關,SQL 自主編寫可控,是一款適合於互聯網系統的資料庫訪問工具。
  • 對象映射工具 EmitMapper 和 AutoMapper
    EmitMapper 性能較高,AutoMapper 易用性較好。
  • IoC 框架
    控制反轉 IoC 輕量級框架 Autofac。
  • DLL 包管理
    公司內部 DLL 包管理工具 NuGet,可解決 DLL 集中存儲、更新、引用、依賴問題。
  • 發佈工具 Jenkins
    一鍵編譯、發佈、自動化測試、一鍵回滾,高效便捷故障低。

架構篇——思想提升

     會使用以上框架並不一定能成為優秀的架構師,但一位優秀架構師一定會使用框架。架構師除了會使用工具外,還需要設計思想的提升和性能調優技能。

     此篇以真實項目為背景,思想方法追求簡單有效,主要內容包括 企業總體架構單個項目架構設計統一應用分層調試工具 WinDbg

     企業總體架構

     當我們有了幾百個上千個應用後,不僅僅需要單個項目的架構設計,還需要企業總體架構做頂層思考和指導。大公司與小商販的商業思維是一樣的,但大公司比較難看到商業全貌和本質。而小公司又缺乏客戶流量和中間件的應用場景,中型公司則兼而有之,所以企業總體架構也相對好落地。

     企業總體架構需要在 技術業務管理 之間游刃有餘地切換,它包括業務架構、應用架構、數據架構和技術架構。附檔是一份脫敏感信息後的真實案例,有參考 TOGAF 標準。但內容以解決公司系統的架構問題為導向、以時間為主線,包括企業商務模型、架構現狀、架構規劃和架構實施。

     單個項目架構設計

     單個項目的架構設計如同施工圖紙,能直接指導工程代碼的實施。上一環是功能需求,下一環是代碼實施,這是架構設計的價值所在。從功能需求到用例,到用例活動圖,到領域圖、架構分層,到核心代碼,它們之間環環相扣。

     做不好領域圖可能源自沒有做好用例活動圖,因為用例活動圖是領域圖的上一環。關註職責、邊界、應用關係、存儲、部署是架構設計的核心,下圖是具體案例參考。

      

     統一應用分層

     給應用分層這件事情很簡單,但是讓一家公司的幾百個應用採用統一的分層結構,這可不是件簡單的事情。它要做到可大可小、簡單易用、支持多種場景,我們使用 IPO 方式:I 表示 Input、O 表示 Output、P 表示 Process,一進一齣一處理。應用系統的本質就是機器,是處理設備,也是一進一齣一處理,IPO 方式相對於 DDD 而言更為簡單實用。

    

     調試工具 WinDbg

     生產環境偶爾會出現一些異常問題,而 WinDbg 或 GDB 就是解決此類問題的利器。調試工具 WinDbg 如同醫生的聽診器,是系統生病時做問題診斷的逆向分析工具,Dump 文件類似於飛機的黑匣子,記錄著生產環境程式運行的狀態。

     主要介紹調試工具 WinDbg 和抓包工具 ProcDump 的使用,並分享一個真實的案例。N 年前不知誰寫的代碼,導致每一兩個月偶爾出現 CPU 飆高的現象。

     我們先使用 ProcDump 在生產環境中抓取異常進程的 Dump 文件,然後在不瞭解代碼的情況下通過 WinDbg 命令進行分析,最終定位到有問題的那行代碼。

    

公共應用篇

     先工具再框架,然後架構設計,最後深入公共應用。公共應用因為與業務系統結合緊密,但又具有一定的獨立性,所以一般自主開發,不使用開源也不方便開源。公共應用主要包括單點登錄、企業支付網關、CTI 通訊網關(簡訊郵件微信),此次分享單點登錄和企業支付網關。

     單點登錄

     應用拆分後總要合在一起,拆分是應用實施層面的拆分,合成是用戶層面的合成,而合成必須解決認證和導航問題。單點登錄 SSO 即只需要登錄一次,便可到處訪問,它是建立在用戶系統、許可權系統、認證系統和企業門戶的基礎上。我們的憑證數據 Token 使用 JWT 標準,以解決不同語言、不同客戶端、跨 WebAPI 的安全問題。

     企業支付網關

     企業支付網關集中和封裝了公司的各大支付,例如支付寶、財付通、微信、預付款等。它統一了業務系統調用各支付介面的方式,簡化了業務系統與支付系統的交互。

     它將各種支付介面統一為支付、代扣、分潤、退款、退分潤、補差、轉賬、凍結、解凍、預付款等,調用時只需選擇支付類型即可。企業支付網關將各大支付系統進行集中的設計、研發、部署、監控、維護,提供統一的加解密、序列化、日誌記錄,安全隔離。

 

 文章轉載自:http://www.infoq.com/cn/articles/key-points-to-setup-middle-small-size-dev-team?utm_source=infoq&utm_campaign=user_page&utm_medium=link


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在IT界,需要大量的 JavaScript 開發者。如果你的能力能夠勝任這一角色,那麼你將獲得許多換工作和提高薪水的機會。但是在你被公司錄取之前,你需要展現你的技術,以便通過面試環節。在這篇文章中,我會為你展示前端面試會被問到的 5 個典型問題及相關解決方法,這 5 個問題常被用來測試面試者的 Ja ...
  • 下一個compilation來源於以下代碼: 之前簡單分析該處的apply,此處只看非數組單入口的情況,此時會引入SingleEntryDependency模塊,與compilation相關的內容如下: 此處用到了ES6新加的數據結構Map,SingleEntryDependency是個沒什麼營養的 ...
  • Promise 是非同步編程的一種方案,簡單說就是一個容器,裡面保存著某個未來才會結束的事件的 結果,Promise 是一個對象,從它,可以獲取非同步操作的消息。 Promise 對象有以下兩個特點。 (1)對象的狀態不受外界影響。Promise 對象代表一個非同步操作,有是三種狀態。pendding ( ...
  • 一切皆是對象嗎 ...
  • 當我們的app開發完成之後,無可避免的以後會進行產品升級,那麼我們希望在客戶的手機上讓app進行自動升級,可以分為自動升級和手動升級。 自動升級:一般在客戶app第一次打開首頁的時候。 手動升級:在app界面提供一個升級的入口。 界面效果演示如下: 代碼其實也很簡單,不過針對ios和android要 ...
  • HTTP結構 轉載請註明出處: "HTTP結構簡介" HTTP通信過程包括從客戶端發往伺服器的請求和伺服器返回客戶端的響應,這篇文章就簡單的瞭解一下HTTP請求和響應的結構與協議本身的狀態管理。 用戶HTTP協議交互的信息被稱為HTTP報文,HTTP報文可分為請求報文和響應報文。請求報文包括請求行、 ...
  • 例如: var yearArray = new Array("三二一", "三二一", "學歷", "學歷", "dsa", "das"); $.unique(yearArray); 效果: ...
  • 在ES6中,增加了2個聲明變數的關鍵字:let 和 const。在這裡將詳細介紹let與var的區別、Babel對let的處理以及const的簡單使用。 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...