中小型研發團隊架構實踐三要點(轉自原攜程架構師張輝清)

如果你正好處在中小型研發團隊……

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

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

我是一個有十多年經驗的 IT 老兵,曾主導了兩家公司的技術架構升級改造,現拋磚引玉,與大家一起探討這方面的問題。

在接下來的一段時間里,我會陸續推出此系列文章。

根據我們以往的經驗,分享者主講一個小時左右,業務研發就可以快速地進入項目實戰。對于后面新加入的團隊成員,也可通過 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 的安全問題。

?企業支付網關

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

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

本系列文章涉及內容清單如下(并不按這順序發布),其中有感興趣的,歡迎關注:

  • 開篇

  • 緩存 Redis

  • 消息隊列 RabbitMQ

  • 集中式日志 ELK

  • 任務調度 Job

  • 應用監控 Metrics

  • 微服務框架 MSA

  • 搜索利器 Solr

  • 分布式協調器 ZooKeeper

  • 小工具:Dapper.NET/EmitMapper/AutoMapper/Autofac/NuGet

  • 發布工具 Jenkins

  • 總體架構設計

  • 單個項目架構設計

  • 統一應用分層

  • 調試工具 WinDbg

  • 單點登錄

  • 企業支付網關

  • 結篇

  • ?

轉載于:https://www.cnblogs.com/xiaowu54/p/7698559.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/391055.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391055.shtml
英文地址,請注明出處:http://en.pswp.cn/news/391055.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

時間序列預測 預測時間段_應用時間序列預測:美國住宅

時間序列預測 預測時間段1.簡介 (1. Introduction) During these COVID19 months housing sector is rebounding rapidly after a downtime since the early months of the year. New residential house construction was down to about 1 million in April. As of July 1.5 mi…

zabbix之web監控

Web monitoring(web監控)是用來監控Web程序的,可以監控到Web程序的下載速度,返回碼以及響應時間,還支持把一組連續的Web動作作為一個整體進行監控。 1.Web監控的原理 Web監控即對HTTP服務的監控,模擬用戶去訪問網站,對…

如何使用Webpack在HTML,CSS和JavaScript之間共享變量

Earlier this week, I read an article explaining how CSS-in-JS slows down the rendering of some React apps and how static CSS is faster. But CSS-in-JS is very popular because, among other features, you can style dynamically using JavaScript variables.本周初…

Java中獲得了方法名稱的字符串,怎么樣調用該方法

問題: Java中獲得了方法名稱的字符串,怎么樣調用該方法 如果我有以下兩個變量 Object obj; String methodName "getName";在不知道obj的類的情況下,我怎么樣才能調用該類的名叫methodName的方法呢? 這個方法被調用時…

經驗主義 保守主義_為什么我們需要行動主義-始終如此。

經驗主義 保守主義It’s been almost three months since George Floyd was murdered and the mass protests. Three months since the nationwide protests, looting and riots across America.距離喬治弗洛伊德(George Floyd)被謀殺和大規模抗議活動已經快三個月了。 全國抗議…

Begin

Hello everyone, Finally,a technician from feiyang help me solve the question. Even though it is not the linux version i want.emmm...linux mint a new one i dont know about it And, lets make the life regular and delicate轉載于:https://www.cnblogs.com/lxc-run…

redis介紹以及安裝

一、redis介紹 redis是一個key-value存儲系統。和Memcached類似,它支持存儲的values類型相對更多,包括字符串、列表、哈希散列表、集合,有序集合。 這些數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且…

java python算法_用Java,Python和C ++示例解釋的搜索算法

java python算法什么是搜索算法? (What is a Search Algorithm?) This kind of algorithm looks at the problem of re-arranging an array of items in ascending order. The two most classical examples of that is the binary search and the merge sort algor…

Java中怎么把文本追加到已經存在的文件

Java中怎么把文本追加到已經存在的文件 我需要重復把文本追加到現有文件中。我應該怎么辦? 回答一 你是想實現日志的目的嗎?如果是的話,這里有幾個庫可供選擇,最熱門的兩個就是Log4j 和 Logback了 Java 7 對于一次性的任務&a…

python機器學習預測_使用Python和機器學習預測未來的股市趨勢

python機器學習預測Note from Towards Data Science’s editors: While we allow independent authors to publish articles in accordance with our rules and guidelines, we do not endorse each author’s contribution. You should not rely on an author’s works withou…

線程系列3--Java線程同步通信技術

上一篇文章我們講解了線程間的互斥技術,使用關鍵字synchronize來實現線程間的互斥技術。根據不同的業務情況,我們可以選擇某一種互斥的方法來實現線程間的互斥調用。例如:自定義對象實現互斥(synchronize("自定義對象")…

Python數據結構之四——set(集合)

Python版本:3.6.2 操作系統:Windows 作者:SmallWZQ 經過幾天的回顧和學習,我終于把Python 3.x中的基礎知識介紹好啦。下面將要繼續什么呢?讓我想想先~~~嗯,還是先整理一下近期有關Python基礎知識的隨筆吧…

volatile關鍵字有什么用

問題:volatile關鍵字有什么用 在工作的時候,我碰到了volatile關鍵字。但是我不是非常了解它。我發現了這個解釋 這篇文章已經解釋了問題中的關鍵字的細節了,你們曾經用過它嗎或者見過正確使用這個關鍵字的樣例 回答 Java中同步的實現大多是…

knn 機器學習_機器學習:通過預測意大利葡萄酒的品種來觀察KNN的工作方式

knn 機器學習Introduction介紹 For this article, I’d like to introduce you to KNN with a practical example.對于本文,我想通過一個實際的例子向您介紹KNN。 I will consider one of my project that you can find in my GitHub profile. For this project, …

MMU內存管理單元(看書筆記)

http://note.youdao.com/noteshare?id8e12abd45bba955f73874450e5d62b5b&subD09C7B51049D4F88959668B60B1263B5 筆記放在了有道云上面了,不想再寫一遍了。 韋東山《嵌入式linux完全開發手冊》看書筆記轉載于:https://www.cnblogs.com/coversky/p/7709381.html

Java中如何讀取文件夾下的所有文件

問題:Java中如何讀取文件夾下的所有文件 Java里面是如何讀取一個文件夾下的所有文件的? 回答一 public void listFilesForFolder(final File folder) {for (final File fileEntry : folder.listFiles()) {if (fileEntry.isDirectory()) {listFilesFor…

github pages_如何使用GitHub Actions和Pages發布GitHub事件數據

github pagesTeams who work on GitHub rely on event data to collaborate. The data recorded as issues, pull requests, and comments become vital to understanding the project.在GitHub上工作的團隊依靠事件數據進行協作。 記錄為問題,請求和注釋的數據對于…

c# .Net 緩存 使用System.Runtime.Caching 做緩存 平滑過期,絕對過期

1 public class CacheHeloer2 {3 4 /// <summary>5 /// 默認緩存6 /// </summary>7 private static CacheHeloer Default { get { return new CacheHeloer(); } }8 9 /// <summary>10 /// 緩存初始化11 /// </summary>12 …

python 實現分步累加_Python網頁爬取分步指南

python 實現分步累加As data scientists, we are always on the look for new data and information to analyze and manipulate. One of the main approaches to find data right now is scraping the web for a particular inquiry.作為數據科學家&#xff0c;我們一直在尋找…

Java 到底有沒有析構函數呢?

Java 到底有沒有析構函數呢&#xff1f; ? ? Java 到底有沒有析構函數呢&#xff1f;我沒能找到任何有關找個的文檔。如果沒有的話&#xff0c;我要怎么樣才能達到一樣的效果&#xff1f; ? ? ? 為了使得我的問題更加具體&#xff0c;我寫了一個應用程序去處理數據并且說…