再小的應用也有架構,面向架構新手的架構實踐!

来源:https://www.cnblogs.com/xwgblog/archive/2019/11/07/11812244.html

文章主人公:小明,就職於某互聯網公司,從事後端開發工作。最近小明收到通知公司需要開發一款《證件照》應用,需要徵集架構方案,主要功能包括: 小明雖然從事後端開發工作,但是一直很關註架構這方面的知識,以往都是開發大佬們架構好的應用現在有機會自己去實踐下,打算把自己學到的知識應用於實際案例中來。 小明的腦 ...


文章主人公:小明,就職於某互聯網公司,從事後端開發工作。最近小明收到通知公司需要開發一款《證件照》應用,需要徵集架構方案,主要功能包括:

小明雖然從事後端開發工作,但是一直很關註架構這方面的知識,以往都是開發大佬們架構好的應用現在有機會自己去實踐下,打算把自己學到的知識應用於實際案例中來。

小明的腦海裡是回想了下架構的基本三原則:

  • 合適優於業界領先
  • 簡單優於複雜
  • 演化優於一步到位

小明作為架構新手,雖然幹勁十足,但是也像大部分一樣開發人員一樣架構經驗較少,不知道如何下手去開始架構,萬事開頭難啊!小明請教了下公司的西踢毆(CTO),給了一句25字的架構真言:架構設計的主要目的是為瞭解決軟體系統複雜度帶來的問題

小明也算骨骼驚奇,久經沙場(996沒少鍛煉人~~),思考了“架構真言”既然是為瞭解決軟體系統繁雜度的問題,那不得先找出系統的複雜點在哪裡嗎?

發現複雜點

小明根據“架構真言”開始思考《證件照》應用的複雜點,首先它是一款工具類應用,主要功能是進行圖像處理:

小明發現圖像處理和圖像存儲可能比較複雜,公司現階段沒有專門做圖像處理團隊,也沒有大數據團隊,這兩個問題是要優先解決的問題。

小明現在使用的手機是Galaxy s9一張照片大概是6m,如果初期應用日活1w,假設有20%的人會處理圖片,那一天的存儲量大約10g,運行一個月就需要300g的存儲空間,這個配置個幾T的磁碟可以跑個1年左右。不過這隻是1w日活還要考慮到十萬、百萬級別的時候怎麼辦。

經過討論小明列出了一些複雜的地方並按優先順序做了排序:

  1. 圖像存儲
  2. 圖像處理
  3. 訂單處理
  4. 物流處理

設計架構方案

對於圖像存儲複雜性,小明第一個想到的是一個分散式文件存儲方案,這樣數據容量、可用性都可以得到很好的保障。他首先將這個想法和西踢毆交流了下,西踢毆也沒有否認這個方案只是讓小明考慮下成本方面的因素,小明回頭一想確認引入"分散式文件存儲"首先會帶來以下幾點問題:

  • 系統複雜性提高
  • 運維成本提高
  • 系統可用性降低
  • ...

小明思考了下簡單優於複雜原則,決定使用最簡單的本地磁碟存儲圖像文件,但是使用本地磁碟的方案一定要考慮擴展性,將來隨時都可能擴容、遷移數據,於是小明對圖像存儲做了個簡單的抽象層:

小明對於存儲複雜性應用了架構原則中的原則簡單優於複雜演化優於一步到位,同時對於存儲的可變性,通過引入抽像層能夠有效合理的應對未來的變化。

初步定下來圖像存儲後,小明開始對圖像處理複雜性的問題進行設計,一張證件照的製作流程大致如下:

  • 用戶提交圖片
  • 檢測人臉
  • 人像與背景切割
  • 將切割後的圖交給客戶處理
  • 客戶端合成背影、正裝生成證件照

檢測人臉、頭像分割這類技術公司也沒有使用過,基本上自研是不可能的,再說人力成本也不夠,首先合適的方案就是用第三方的服務,一番調研發現百度AI有人像處理的能力,小明開始考慮使用百度AI的服務,於是引入百度AI的服務:

對於圖像處理小明考慮合適優於業界領先原則,考慮人力、物力的成本選擇合適的方案,而不是一開始就說要自研一套圖像處理系統,投入大量的時間和人力去做最後得不償失。經過一番操作,小明最後整理出一張基礎架構圖交給了西踢毆,等待西踢毆的轉身~~

總結

根據架構設計的主要目的是為瞭解決軟體系統複雜度帶來的問題的綜指,小明首先找出系統的複雜點,然後經過優先順序排序,一步步的解決複雜性的問題,最後結合實際情況設計出一套可行的架構方案。架構設計也是有套路可尋的,雖然案例架構比較簡單沒有大規模的分散式、高可用、高併發場景,再小的應用也是有架構,也要經過深思熟慮再去實行不然會是滿地的技術債,後期要花更多的成本去維護重構。





《架構文摘》每天一篇架構領域重磅好文,涉及一線互聯網公司應用架構(高可用、高性 能、高穩定)、大數據、機器學習等各個熱門領域。


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

更多相關文章
  • 本次接著上次的來介紹版本控制系統,這個講到的將是Git與Github,說一下什麼是Git,什麼是GitHub?他們之間的關係是什麼? 1、Git 是代碼管理的工具 2、GitHub 是基於Git實現的代碼管理的平臺。 這樣就比較清楚兩個不同的作用了,Git更多的是在本地進行代碼的存儲和管理,而Git ...
  • 為了偽造一些儘量真實的假數據,也真是夠費勁的。上一篇筆記記錄了一下獲取一個隨機車輛牌照,這篇筆記記錄一下怎麼獲取一個隨機時間。這篇就不說那麼多廢話了,直接上代碼 在粘一下測試代碼 看一下測試結果 要不是不說點廢話,還真是夠短的……不過這篇沒有什麼疑問,所以到此就結束吧! 參考鏈接:javascrip ...
  • css 位移常用屬性 transform:translate(x,y); transform:translateX(); transform:translateY(); 旋轉屬性 2d旋轉: transform:rotate(); / 繞著中心點轉動 / transform:rotateX(); / ...
  • 起因 為什麼做這個東西,是突然間聽一後端同事說起 "Annie" 這個東西,發現這個東西下載視頻挺方便的,會自動爬取網頁中的視頻,然後整理成列表。發現用命令執行之後是下麵的樣子: 心裡琢磨了下,整一個界面玩一下吧。然後就做成下麵這個樣子了。 列表 下載列表 本文地址倉庫: "https://gith ...
  • 前幾天記錄了一下表單生成器(Form Builder)之表單數據存儲結構mongodb篇,之後便想著偽造一些數據。為什麼要偽造數據呢?說來慚愧,因為拖拉拽設計表單以及表單對應的列表的PC端和移動端該顯示哪些欄位並且是否支持搜索列印(即表單的列表配置)等一系列配置都還沒有做,還有就是前面只說了表單相關 ...
  • 在學習ssh時,一定有不少人對公鑰和私鑰產生過不解。在搜索公鑰跟私鑰的理解時,發現了這篇有趣的圖解小文章,與大家共用。 1. 鮑勃有兩把鑰匙,一把是公鑰,另一把是私鑰。 2. 鮑勃把公鑰送給他的朋友們 帕蒂、道格、蘇珊 每人一把。 3. 蘇珊要給鮑勃寫一封保密的信。她寫完後用鮑勃的公鑰加密,就可以達 ...
  • 最近寫一個需求時遇到一個問題,用戶需要通過點擊一個按鈕直接讀取他自己電腦上D盤的一個txt文件內容顯示到頁面,因為項目現在是用ZK寫的.我對於ZK也是剛剛瞭解不就,很多都還不是很熟.起初我是想用io流去讀取,然後寫完發現,這樣每次讀取的都是伺服器上的D盤下的txt文件,所以在網上找了很久.很多都是獲 ...
  • 場景 Ubuntu Server 16.04 LTS上怎樣安裝下載安裝Nginx並啟動: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102828075 Nginx的配置文件位置以及組成部分結構講解: https://blog. ...
一周排行
  • C 語法糖——持續更新 1. return的switch寫法 ...
  • 0. 前言 繼上一篇,以及上上篇,我們對SqlSugar有了一個大概的認識,但是這並不完美,因為那些都是理論知識,無法描述我們工程開發中實際情況。而這一篇,將帶領小伙伴們一起試著寫一個能在工程中使用的模板類。 1. 創建一個Client SqlSugar在操作的時候需要一個Client,用來管理數據 ...
  • 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //數組:長度不可變,類型單一 6 //ArrayList集合:長度可以任意改變,類型可以不單一 7 8 //創建一個ArrayList對象 9 ArrayList mylist ...
  • .NET 程式下銳浪報表 (Grid++ Report) 的綠色發佈指南 在銳浪報表官方為 CSharp 編寫的開發文檔:“在C#與VB.NET中開始使用說明.txt” 中,關於發佈項目是這麼描述的: ★發佈你的項目,用VS.NET製作安裝程式:1、先創建安裝項目:在解決方案資源管理器的根節點上點右 ...
  • 執行代碼清理時,可以點擊那個掃把小圖片,會按照預設的第一種配置文件來自動修複。也可以點擊下拉三角符合,選擇不同的配置文件,然後進行修複。或者快捷鍵Ctrl+K,Ctrl+E。 針對每一項配置的說明: 刪除不必要的using 儘可能將私有欄位設置為只讀 刪除不必要的類型轉換(針對強類型轉換),像Con ...
  • 1.概念簡述 (1)AR模型 AR 模型(auto regressive model)自回歸模型,模型參量法高解析度譜分析方法之一,也是現代譜估計中常用的模型。 用AR模型法求信具體作法是: ①選擇AR模型,在輸入是衝激函數或白雜訊的情況下,使其輸出等於所研究的信號,至少,應是對該信號的一個好的近似 ...
  • 4.元組 元組的主要特性為: 1.元組在創建之後,具有不可以更改的特性,因此不能直接給元組的元素賦值 2.元組的元素類型可以為任意類型,如字典、字元串、列表等 3.元組常用於在程式的整個生命周期中都不變的場景中 4.1 常用方法 元組大小和內容在定義賦值之後,就不可更改,常用的方法如下所示: cou ...
  • 老孟導讀:今天分享一個類似“孔雀開屏”的動畫效果,打開新的頁面時,新的頁面從屏幕右上角以圓形逐漸打開到全屏。 先來看下具體的效果 不知道這種效果大家叫什麼名字?如果有更合適的名字可以在評論處告訴我,下麵來說下如何實現此效果。 在使用Navigator進入一個新的頁面時,通常用法如下: 就包含了切換頁 ...
  • hashCode() 和equals() 方法的重要性體現在什麼地方? Java中的HashMap使用hashCode()和equals()方法設置值,根據鍵獲取值的時候也會用到這兩個方法。 怎樣 設置 的值? hashCode()獲得 hash值。而hash值用來確定hashmap中內部 Node ...
  • IDEA一些不錯的插件分享 目錄 IDEA一些不錯的插件分享 插件集合 CamelCase Translation LiveEdit MarkDown Navigator Jrebel CheckStyle IDEA Alibaba Java Coding Guidelines Ideavim Ma ...