只有累積,沒有奇蹟

2020年4月30日 星期四

[Tool] Redis 管理工具 - Another Redis Desktop Manager

前言
在之前推薦過 Redis 管理工具 [Redis] Redis 管理工具 - Redis Desktop Manager,方便開發者可以輕鬆的使用 GUI 工具查看或設定 Redis 的資訊,如果要下載新版使用則需要另外付費 (4.99/Month ),最近又發現另一款好用的 Redis 管理工具 Another Redis Desktop Manager,在 Github 說明如下
A faster, better and more stable redis desktop manager, compatible with Linux, windows, mac. What's more, it won't crash when loading a large number of keys.
除了支援 Windows、Linux 與 Mac 三種環境之外,語系部分還支援繁體中文說明,經過幾天的使用個人覺得不輸給 Redis Desktop Manager,今天這篇文章就來推坑這款好用的工具,若有問題歡迎提出來一起討論。

安裝
下載位置可以從 Github 頁面 Another Redis Desktop Manager release 進行下載安裝檔的動作,舉例來說目前最新版本為 v1.3.5,裡面就提供各個環境的安裝檔案,如果是使用 Windows 可以選擇 Another.Redis.Desktop.Manager.1.3.5.exe 進行下載的動作

接著就是大家熟悉的安裝流程,點選下一步到完成為止

建立連線
在開啟應用程式之後,第一步就是要連線到 Redis Server,為了 Demo 方便這裡我先使用 Docker 在本機啟用 Redis,port 為預設的 6379,接著是點選左上角的 New connection,輸入要連線到的 Redis Server 內容,按下 OK 選擇下一步

Redis 資訊
與 Redis Server 建立連線成功之後,即可以看到目前 Redis 目前的資訊像是使用 Redis 使用的版本為和、記憶體的使用量,目前的連線數等資訊,另外在右下方也可以看的到目前我們存放在 Redis key 的資料數據,這些數據分別存放在哪一個 Redis 中哪一個 db 位置
Redis Console
如果習慣 command 指令的朋友,也可以在應用程式直接下指令來達到你的目的,舉例來說在 Console 輸入 Ping 則會回覆 PONG 關鍵字

新增 key & 資料
也支援在介面上新增 Redis key 與資料,舉例來說我新增一個 key 為 test 資料型態為 hash,接著可以繼續在介面上新增內容資料,這功能最近在開發新專案時很常用到,可以很方便的加入所需要的資料針對專案與 Redis 的介接與測試,不用在另外熟記指令來進行新增/調整資料的動作 (我比較懶惰...)

感想
另外還有支援繁體中文語系,進階搜尋 Redis key 與切換 dark 介面等功能,整體來說目前使用上功能蠻完善的,使用了幾天也未遇到當機或是異常 crash 等問題,對於 Redis 管理工具有需求的朋友,或許可以嘗試看看 Another Redis Desktop Manager如果有不清楚的地方歡迎一起討論,hope it helps !


參考
AnotherRedisDesktopManager


2020年4月9日 星期四

[筆記] TGONext 架構組 - 架構師的自我修煉

前言
上一篇 TGONext 架構組 - 高併發高流量 分享參加架構一組的書僮筆記,這一篇則是記錄由 Taien 擔任導師的架構三組討論心得,在 TGONext 導師計畫 開學儀式當天小組內的組員有各自做簡單的自我介紹,並針對工作上的痛點做簡單討論,導師與同學分享未來五個月聚會的主題與規劃,以及推薦可以幫助到大家的書籍清單,架構3組三月份討論主題是 架構師的自我修煉,預計討論內容如下
心態與思想
深耕專業技能
團隊合作典範
如何影響團隊
這篇是根據微薄的記憶整理小組討論的筆記,部分內容為了讓初老症狀越來越嚴重的自己更好理解加上自己說明與圖片,若有問題或是錯誤的地方歡迎各位大大一同討論或給予指導

推薦書籍
在每次的聚會之前導師都有推薦的閱讀清單,清單如下
  • QBQ問題背後的問題 : 這本書之前主管 gipi 就很推薦部門同事一定要閱讀,在 T社也是將這本書列為要求新人必讀書籍之一,最近在博客來發現出了30萬冊紀念版,可見其受歡迎的程度。
  • 我編程,我快樂 : 談到程式猿的成長與職涯規劃之道,作者分享自己過去的經驗提醒程式猿不能只注重技術的提升,還要關注自己職涯上的發展,但礙於自己閱讀簡體字有障礙,目前只看一半還沒看完。
  • 軟體架構師的12項修煉 : 作者認為軟技能是架構師的必修課,整理出 3 大方面分別是關係、個人與商務技能,教導程序猿修煉如何將三大項底下的12 項軟技能點滿,才可以算是一位合格的架構師。
除了上述提到的三本書之外,我個人也推薦 高效能程序員的修煉一書,其中一個章節提到程序猿應該培養寫作的習慣,當你學習到一技能/對某項事物有興趣/解決某個難搞的問題等事情都可以寫部落格文章,將所學到的內容消化最後在用自己理解的方式呈現出來,91哥也有寫過一篇文 我為什麼鼓勵工程師寫 blog,有興趣的朋友可以看看。

技能樹
由於組員來自四面八方每個人所擅長的技能都有所不同,組內有前端工程師、後端工程師、AI 資料工程師等,因此導師有先請同學在家整理以下資訊與同學分享
專業技能:Skill Tree
管理:Skill Tree
職涯目標
其中專業技能與管理希望同學用 Mind Map 呈現,並用顏色標示出對於技術的熟悉度,主要用意是希望大家都可以知道哪些技能是應該具備(守備範圍),自己目前已經會了那些,而那些內容是自己還不會或是還沒有機會學到的,這些資訊可以透過整理成 Mind Map 的過程中讓自己更加清楚;由於管理的層面涵蓋很廣,像是溝通管理、時間管理..因此可以盡量延展,沒有標準的對錯與答案,以下分享小弟整理的內容,若有疑問歡迎一起討論

專業技能 Mind Map

身為一位前端低能兒因此這是以 Backend 後端工程師角度出發,如果有經驗的工程師都會知道,開發不僅僅是把 Code 寫好交付就可以,程式上線後還需要進行應用程式的監控等重要的事情,因此在整理時從幾個環節出發分別是分析、設計、Coding、測試、上線、維護監控,從這幾點分別去整理對應到的技能或是工具,其中 CI/CD 與分散式系統設計是這一兩年希望自己加強的重點。在開發應用程式時隨著請求量的倍增,可能會從單一應用程式Scale up/out 擴充為多台應用程式,這時就需要依據當下的情境設計出合適的架構,如何在設計新架構時兼具效能與彈性讓系統可以承受高流量與高併發的考驗,亦有可能需要與舊架構為伍也就是常提到的讓飛行中的飛機換引擎,這之中有非常多的眉眉角角需要探討與研究的,也是自己覺得想挑戰的部分(自虐)。

管理 Mind Map
管理則是由架構師的角度出發,架構師除了基本要具備一定程度的技術能力,對於整個軟體開發流程從需求分析到系統上線後的監控與數據報表分析也都需要了解,從一開始的需求釐清與分析能力需要蒐集高階主管(長官)想要解決的商業問題是甚麼,才有可能在架構設計時選擇適合的方案;技術選型上需要了解選用的解決方案的本質與帶來的side effect為何,還有選用技術/產品的成熟度與穩定性,團隊的能力等多方面的考量出發,而非一昧地追求新技術而忽略帶來的成本與風險;除了技術能力之外軟技能也是不可或缺的項目之一,需要具備 Domain Knowledge 與商業思維而非一昧地以技術的角度出發來解決問題,須具備簡報技巧讓高層願意替你設計的新架構買單;高層 Buy in 後做出來的 POC 方案是否能讓團隊對於新架構是認同;最後是持續學習部分,需要持續學習與了解新技術增加自己的廣度,遇到問題時才有機會有更多解決方案而非單一解。(OS:為了不成為一位嘴砲架構師整理完發現列這麼多條件,覺得好像離架構師還有好長的路 XDDD)

導師有針對大家分享的技能與管理 Mind Map 內容給建議,另外也補充大家在還沒那麼多經驗時可以多看 Github 上比較熱門的 open source 吸取經驗,熱心的同學也在會後在群組補充覺得不錯的 github 專案 system-design-primer 以及 blog 讓大家一起學習。


HTTP Request Smuggling
在討論中導師也提醒同學資安是不可忽視的重點之一,除了可以參考 OWASP TOP 10 之外 另外提醒大家最近一種新的攻擊方式 HTTP Request Smuggling,這種攻擊方式在2005年就被發現但一直被大家所忽略,Portswigger 主管 James Kettle 於2019年再次提醒大家其影響程度,以下就根據 HTTP Desync Attacks: Request Smuggling Reborn 原文做簡單的介紹與說明

原理
當客戶在網站上操作行為時會透過 Front-end 服務器 (nginx、CDN、負載均衡或反向代理) 將 HTTP 請求發送至 Web 後端 (Back-end) 伺服器,為了提高其傳輸速度與效率,通常會經由同一個後端網路來傳送多個請求 (HTTP/1.1 提供 Keep-Alive 允許單個連接上傳送多個請求),HTTP 會按照順序進行發送的動作,收到請求的伺服器會根據 HTTP 中 Request 表頭定義請求結束的位置 (Transfer-Encoding或是Content-Length),如下圖所示

由上圖可以發現,Front-end 與 Back-end 是兩台不同的服務或伺服器,HTTP 請求偷渡是因為 Front-end(反向代理) 與 Back-end 後端處理請求的伺服器對於 HTTP 請求解析處理不一致,駭客可以透過不一致的差異在一個 HTTP 請求中放置 (偷渡) 另一個 HTTP 請求,後端接收到請求後會處理夾帶的攻擊內容 (橘色部分) ,直接在內部網路服務進行攻擊

HTTP Request Smuggling 將 Content-Length標頭和Transfer-Encoding 放在 HTTP 請求中,在透過 CL.TE、TE.CL、TE.TE 漏洞進行請求解析不一致的動作,詳細原理與細節可以參考下列文章有更詳細的說明與內容
Service Level
在定義服務的品質通常會提到 SLA、SLO、SLI,三個名詞的全名如下
  • SLA : Service Level Agreement,服務等級協議
  • SLO : Service Level Objective,服務等級目標
  • SLI : Service Level Indicator,服務等級指標
舉例來說,假設今天開發的是電商系統,為了給客戶更好的品質與速度因此定義 SLA 為 Latency <= 300ms ;為了達到目標,Sevel level 可能會定義如下
  • SLA : Latency <= 300ms
  • SLO : latency <=200ms,會定義比承諾客戶更小數字的目標以達到 SLA 標準
  • SLI : 每分鐘內 http status code 為 200 的 response,比較著重在指標的部分,常見的有throughput、latency、Availability或correctness等測量指標
有管理經驗的朋友可以發現像是在定義部門目標使用 Bottom-Up 的方式向下延伸,從下往上看就是要做到這些指標內容SLA才有可能達到,以上只是簡單的說明,更詳細的內容可以參考 Google Cloud 中的 SLOs, SLIs, SLAs, oh my - CRE life lessons 或是 Ant 大的 軟體技術架構如何正確與商業需求快速對齊:談 MAU 換算至 RPS,SLA 回推至 SLI 兩篇文章內容的詳細說明;因此在架構設計上,除了要考慮到需求情境之外,還需要考量到 SLI、SLO及SLA三者的目標,反思設計出來的架構是否都有包含上述功能性與非功能性需求,不斷反思是否有更好的解決方案。


Design Process
接著導師整理在設計架構時需要注意的的流程與議題
Defining the service (Rough, Structured design, Measurable)
3, and 4: Three-tier architecture (Data Layer[Storage], Biz logic Layer[Compute], Presentation Layer[Networking])
Resiliency, Availabilty, Scalaility, and Disaster Recovery
Security
Capacity planing and Cost Optimization
Deployment, Monitoring and Alerting, and Incident Response
比如說目標是承受同時在線 10萬人,要思考的是設計出來的系統架構可以乘載同時 10萬人的 request量;設計出來的架構是否有彈性與擴充性,遇到災難是要如何進行快速的復原;要如何確保系統的Security,像是密碼一定要做 hash之類;使用量一年會產生多少 cost 是否有 plan ?;最後是如何進行 deployment ? 如何監控線上的環境與機器服務,如何第一時間知道使用者出問題,出問題時要如何處理 ?
為了讓同學們有更好的理解,導師也分享過去工作上架構設計的專案與跟同學說明為什麼這樣設計(原由),也提醒同學簡報技巧也是重要的技能之一,當我們想要說服老闆使用或引入新架構時,從老闆的角度來出發像是思考老闆可能最關注的點像是會增加多少預算、會帶來多少效益以及瓶頸會在那裡跟如何解決,節省老闆的時間也讓決策者方便快速做決策。


Business/Product Methodology
最後導師補充一些與 PM 比較相關的觀念,希望同學在鑽研技術之餘,多去了解或學習一些常用商業模型對架構設計也是有幫助的,由於這領域自己不太熟悉因此在介紹時會加上 wiki 連結介紹,讓有興趣的朋友請自行點擊深入了解,若對於方法論內容理解有錯歡迎糾正。

AARRR
AARRR 模型是一個有名的方法論,每個英文單字都代表指標分別是Acquisition、Activation、Retention、Revenue以及Referral,主要是在談怎麼樣獲取用戶,在導師介紹完模型的說明讓我想起(後知後覺)待過的T社部門職責分工相似,部門分別負責特定指標,公司為了協助達標每個部門都有自己的RD團隊來專心支援前線單位完成其指標,

Lean Startup
Lean Startup 精實創業 : 概念與 scrum 類似,當你今天有一個 idea 時候以最小可行產品(MVP)來實現,提早讓使用者來驗證 idea 想法是否有效,並在使用過程中加上 measure,再透過 measure 產生的 data 思考要如何調整 idea 讓它更好,試圖在 measure 的過程中尋找可能的商機(契機)。這方法論很常在創業的朋友討論中提到,在公司草創初期都希望在最短的時間找到可行的模式,早日度過黑暗期。

Scrum - Most Important is Value
Scrum 敏捷開發 是這幾年很紅的方法論,用小步快跑的方式快速提交最有價值的功能,網路上已經有非常多相關知識這不在多廢話。
另外導師還提到了像是 Steve Blank - Customer Development、Alexander Osterwalder - Business Model Canvas 與 Value Proposition 等方法論,但礙於大腦容量有極限且未接觸過,這就筆記下來日後有機會再自行研究。

心得
這是小組的第一次討論,組員分享自己的技能樹時聽到過去很多自己未接觸到的名詞,可以學到不同領域的知識感覺挺好的;在過去自己對於其守備範圍理解都是較為零碎的,可能是發現甚麼重要就盡力的去點滿其技能,在這次盤點 skill tree 的過程中才真正的去思考自己的目標(Goal)為何 ?自己希望哪些技能是應該具備的,對各技能的熟悉程度與目前還尚缺那些技能,這些資訊擁有之後或許可以訂為日後的長期目標,定期 review 自己完成百分比(自虐again);在兩個半小時的討論過程中,導師也很熱心的與同學分享自己所了解知識與架構設計的經驗,也補充技術以外常見的幾個商業方法論,提醒大家偶爾可以跳脫技術學習不同的解決方案提升自己的商業思維;透過更多實作累積更多經驗,成為一位能夠真正解決問題不嘴砲的架構師。

參考
AARRR
Lean Startup 精實創業
Scrum 敏捷開發
The Four Steps to the Epiphany
Business Model Canvas
Value proposition
架構師的修練
深度剖析什么是 SLI、SLO和SLA?
SLOs, SLIs, SLAs, oh my - CRE life lessons
從零建立商業技術團隊
[ModernWeb2019] Taien - 高併發的道與術
HTTP-Request-Smuggling (pdf)
HTTP request smuggling
HTTP Request Smuggling (HTTP 請求走私)
軟體技術架構如何正確與商業需求快速對齊

2020年3月25日 星期三

[筆記] TGONext 架構組 - 高併發高流量

前言
在偶然的機會發現 TGONetworks 正在舉辦 TGONext 導師計畫 活動,活動邀請在 技術管理、技術創業技術架構有經驗的科技領袖 (大神) 擔任各組的老師,在五個月之間老師會帶領小組的組員深入討論相關的議題,身為一位打雜多年的工程師,看到可以與諸位大神近距離的學習的機會當然也不會錯過,運氣不錯的也順利通過兩階段的面試錄取,每個月都有小組的聚會討論,TGONext 也鼓勵不同組的組員彼此交流學習,有幸參加了由 Ant 帶領的技術架構一組聚會三月份討論主題是高併發高流量,當天討論議題如下
Database 跟高併發的關係(Ex. NoSQL / RDBMS 在不同場景的負載能力,然後討論到原本的問題要怎麼選擇跟評估)
Server 端口的集中管理 / 微服務的必要性及適用場景 的規劃(Ex. 已經了解整個 Application 的基本配置,要怎麼做出拓展然後發展出 SOA、微服務的架構)
Domain Driven Design 對拓展性的影響(Ex. 傳統單體式的設計跟 MVC 的相關性,要拆分成微服務後 DDD 的設計是否更有利、為什麼有些語言的框架設計都是採取 DDD 的方式)
如何設計一個電商系統,可承載 100 萬人同時在線上,SLA 可達到 99.9% 的架構?(回顧題)
請問 Computer Science 的 Bound Categories 有哪些?可以如何偵測出來?
Cache 的缺點有哪些?模式有哪些?什麼時候應該採用?
高併發高流量與程式語言的哪些特性有關?程式語言選用時可以注意什麼?
高併發高流量在各階段的架構演進可以如何設計?分布式模型的引用?一致性的需求? 
這篇是根據微薄的記憶整理旁聽的筆記,部分內容為了讓初老症狀越來越嚴重的自己更好理解加上自己說明與圖片,若有問題或是錯誤的地方歡迎各位大大一同討論或給予指導

架構的演進
在討論的一開始 Ant 先回覆同學們詢問開幕式提到的 SLA 的計算方式,接著進入到主題高併發高流量,請大家先思考應用程式架構是如何演進的,開始畫圖向大家說明常見的 Application 演進的過程

Monolithic Architecture
在初期 (可能) 會規劃 Application 與 Database 放置在同一台 Server,節省資源與費用避免不必要的浪費,也就是大家常聽到的傳統單體式設計 Monolithic Architecture

Application 與 Database 分離
當使用者逐漸變多時,由於 Application 與 Database 是存放在同一台伺服器主機,共用相同 CPU 與 Memory 資源,可以選擇將 Application 與 Database 分開存放在不同主機以避免資源互搶的狀況發生,以提高可負擔的 Request 請求量。
這時導師拋出一個問題讓大家思考
導師 : 假設單純的 Application 遇到性能瓶頸問題,一般來說第一件事會做甚麼 ? 
Cache Server
最常見的作法就是加上 Cache 機制,舉例來說電商平台首頁大多都有商品介紹,用戶在瀏覽商品資料或是相關頁面時,會發送讀取商品資料的請求至資料庫伺服器,如果同時有 100 位用戶在瀏覽就會有至少100+ 個 Request 請求發送至 Web Server,加上 cache server 可以考慮將這些資料異動不頻繁,或是不那麼重要的資料庫查詢結果資料放置在 Cache Server 中,以提高 Application 回應速度與分擔 Database loading。

導師 : Cache 的優缺點是什麼 ? 什麼時候該採用呢 ? 
Cache 優點部分主要可以降低伺服器的負擔與增加回應速度,還可以減少網路頻寬的浪費與保護資料庫的功能;但在導入之前團隊也必須要了解 Cache 的問題不能只靠乖乖保佑,避免異常發生時不知道該如何處理只能大眼瞪小眼,可能需要注意的有下列幾點
  • 適合情境 : 什麼樣的資料需要放在 Cache 中 ? 假設今天 Database 資料已更新的時候,快取內的就會是未更新的資料(贓資料),用戶讀取到舊的資料影響會是甚麼? 
  • 資料一致性 : 當資料發生不一致時,更新快取的策略是甚麼 ? 是使用 CronJob 排程定時去資料庫更新快取、還是設定快取有效時間讓快取自動失效、或是更新資料庫時同步更新快取內容、或是先淘汰快取後再寫到資料庫 (小弟目前是使用這種方式)。
  • 異常處理 : 當快取 Server 發生異常或是故障時,團隊是否了解該如何快速恢復,如何在一開始建立快取的 HA 機制 ? (如果是使用 Redis 可以設定 master-Slave 與 Sentinel,透過 Sentinel 的哨兵機制,可以在 master 發生異常時快速切換到 slave instance 機器,不用手動進行切換;如果沒有設定 master-Slave 機制,可以使用 Redis 的持久化設定 進行還原的動作 )

  • 雪崩效應 (Avalanche effect)
    在討論的過程中,導師也提到了高併發高流量可能會遇到的雪崩效應,發生情境可能是單一時間同時湧入大量的請求(ex : 五月天搶票),當 cache server 無法承受發生異常或重啟時,由於 Application 是先打 cache server 取得資料,當 Cache server 重啟後沒有資料時會先向 Database 資料庫撈取相關資料再存放到 cache (或是排程固定撈資料),如果程式判斷沒有處理好或是資料庫語法沒寫好的情況下,有可能就會發送多個請求向 Database 撈取同樣的 cache 資料,資料庫同時接受到大量的 cache 資料處理請求短時間無法回應,使用者同時又不斷點擊向 Web Server 送出更多的請求,最後造成 Database 無法提供服務,接著 Web Server 跟 Cache 也因為前面的 Request 請求未處理完塞車的關係相繼的無法使用,應用程式被用戶各個擊破(誤,示意圖如下
    在討論時導師拋出了這些引入 Cache 快取可能存在的問題,因此提醒學員開發團隊在使用前必須先釐清上述可能會遇到的問題,像是Cache 資料的一致性或是更新策略,到後來 Cache 異常時處理方式,團隊成員如果對於 cache 解決方案不夠熟悉而盲目導入的話,又不巧的遇到高流量的請求時 cache server 異常,就會發生團隊無法處理而延長了網站恢復的時間的憾事發生。

    Microservice 微服務
    隨著新的商業需求越來越多,開發者會不斷的在原本的 Application 添加新功能,原先的代碼可能會隨著時間的關係變得更加龐大難以維護,結構變得模糊質量也隨著下降,代碼的建置與部屬周期時間都相對的拉長,單體架構的問題會陸續浮上檯面,為了解決此問題,有人提出使用最近幾年很流行的微服務來解決此問題,世界上有些著名的公司也在使用微服務架構像是 Netflix、eBay和 Paypal。接著導師請大家思考下列的問題,希望決定架構前,必須先了解架構本質上的問題以及導入後帶來的影響
    導師 : 微服務的本質是什麼 ? 什麼時候需要導入微服務呢 ? 
    在討論微服務時前導師先提到 Performance 鐵三角 觀念
    Throughput 
    Latency 
    Memory footprint 
    如同三角形的三邊,任何一邊的改變都會影響到另外兩邊。Microservices 將系統拆分為多個部分將職責相同的功能或模組區分為單一個服務,提高內聚力與降低彼此耦合度,開發與布署時不在互相依賴,各自服務可獨立擴充與伸縮,可使用不同的語言進行開發或合適的資料庫存放資料。了解完本質之後,接著來看導入微服務會帶來哪些挑戰
  • 服務如何拆分 : 首先遇到的問題會是系統要如何拆分為不同的服務,服務之間的業務領域守備範圍該如何定義,如何界定服務的系統邊界 ? 這幾個問題可能會是設計階段需要討論的,因此,在 InfoQ Using Domain-Driven Design When Creating Microservices 文章中提到在微服務使用 領域驅動設計 ( Domain-Driven Design DDD ) 在架構設計上會幫助。
  • 服務之間如何溝通 : 在過去單體式架構可能起一個 Thread 或是 Task 就可以完成的事情,在微服務中可能變為呼叫多個服務才有機會取得結果,在服務之間的通訊機制(溝通)方式是什麼 ? HTTP、TCP 或是其他更適合的溝通方式 ?
  • 部署與監控方式 : 在微服務的架構下服務數量也相對提升,代碼的建置到部署到也隨之變的複雜,如何做到每個服務的監控,像是取得應用程式CPU、記憶體、網路傳輸量等基本資訊,甚至到業務邏輯點的應用程式 Request 執行成功或錯誤率,是否有 Log 視覺化工具可以協助快速將問題定位 ?並在服務發生異常時,並第一時間做出處理與事後根本問題分析。

  • 基礎建設也是微服務重要的環節之一,導師接著提到在微服務中常見的名詞像是 Service Mesh、API Gateway、Zookeeper 等基礎建設,並請學員們思考這些服務/Pattern 分別是為了解決甚麼問題,優缺點是什麼 ? 

    Service Mesh
    在微服務中服務可以使用不同的程式語言來進行開發,但使用不同的程式語言會發現有些 [功能] 是可以共用的,像是驗證機制、監控方式、配置設定、Logging、流量控管、Healthcheck、Circuit Breaking 等功能,以上功能都需要使用各自的程式語言實作出符合某項規範,緊密的耦合相對了也增加了應用程式的整體複雜性,Service Mesh 可以將這種複雜性與應用程式分離開來,提供像是流量管理、Logging、監控、身分驗證、Circuit Breaking 等基礎(通用)功能,讓應用程式可以專心關注處理負責業務邏輯。可以透過設計模式中的 Sidecar Pattern 實現,如果有看過美國隊長電影的人可以回想有一幕美國隊長騎著軍用摩托車,旁邊有加裝一台沒有輪子的側車依附在軍用摩托車上,這是所謂的 sidecar,同樣的在軟體結構中 sidecar 也連結到主應用程式並擴充與增強其功能,示意圖如下
    如果對 Service Mesh 演進有興趣可以參考 Pattern: Service Mesh;另外 The Rise of Service Mesh Architecture 與 Sidecar Design Pattern in your Microservices Ecosystem 對於 Service Mesh 與 Sidecar 優缺點都有更進一步的說明,有興趣的彭油可以參考看看。

    另外,在 Martin fowler 部落格有篇文章 MicroservicePrerequisites 也有提到,建議沒有具備 Basic Monitoring、Rapid provisioning、Rapid application deployment 這三種能力之前,不應該考慮使用微服務架構;另外在 MicroservicePremium 文章也提到微服務帶來的複雜性,當盲目導入可能會帶來更大的麻煩,舉例來說如果今天遇到的問題是系統效能不佳,閉著眼睛導入微服務架構不會改善問題 (加了K8S也不會!!),微服務解決的 Throughput 無法降低 Lateency。因此,架構師或是技術團隊高層必須謹慎的評估,在組織定的商業目標與技術發展兼做出抉擇,選定適合的技術解決方案。

    補充 : Monolithic > SOA > Microservice 
    在提到簡化系統的方法也會讓人聯想到 SOA (Service Oriented Architecture) 架構模型,將可重用的部分抽成服務 Service,降低其複雜性與提高服務的可重用性,在找尋相關資料中幸運發現 Best Architecture for an MVP: Monolith, SOA, Microservices, or Serverless? 文章中解釋 Monolithic、SOA 與微服務三個架構簡單的示意圖


    架構與組織的關係
    系統架構與公司的組織的關係也是密不可分的,也是所謂的康威定律 ( Conaway's Law),wiki 說明如下
    設計系統的架構受制於產生這些設計的組織的溝通結構。  
    舉例來說,當系統規模不大時可能初期會使用單體式架構(Monolithic),背後開發人員會是有一個團隊擔任維護與開發的動作,隨著生意越做越大組織架構可能會跟著調整,陸續因為需求量越來越大而開發團隊加入更多的開發人員(新鮮的肝),接著代碼越來越雜亂與溝通成本越來越高,演變為每個服務後面都會是一個團隊 Team 來進行開發,以加速整體的開發速度,示意圖如下
    同樣的,如果今天是跨國企業不同國開發人員都會有不同的開發專案,彼此要溝通時會透過討論定義 API 簽章內容,降低直接在不熟的情況下修改對方專案造成改A壞B或是資料異常的延伸問題。

    資料庫選擇
    在討論資料庫時候提出下列問題
  • RMDBS、NoSQL、NewSQL 本質的差異 ?
  • RMDBS、NoSQL、NewSQL 優缺點是甚麼 ?
  • NoSQL 興起的原因為何 ? 優於 RMDBS 的原因是什麼 ? 
  • 如何選擇資料庫 ? 
  • 這部分的討論由於小弟在處理公司事務,因此筆記可以參考兩位認真上的同學的筆記內容(被打
  • TGONext: 從缺點選擇架構
  • TGONext - 高併發高流量 

  • 心得
    在討論架構演進的過程中很多名詞過去可能在 meetup 都曾經聽過,可以觀察到在這次的討論中導師不斷引導在場的同學們,希望大家思考這些名詞與技術《本質》是甚麼 ? 解決什麼樣的問題 ? 學習或是引進一門技術時不只是要看它的優點,還要了解它帶來的影響或 side effect 是什麼,可以提出他的優缺點才算是真正了解。也因為如此讓我在寫這篇旁聽筆記時花更多時間思考關於《本質》這件事,學習到用不同的角度來看待事情,謝謝 TGONext 讓我們有這機會可以與技術領域的高手們學習的機會,也期許自己在每次的聚會中學到更多的知識可以分享給更多需要的朋友 :)

    參考
    martinfowler microservice 系列文章
    Microservice Trade-Offs
    How to extract a data-rich service from a monolith
    Microservices and the First Law of Distributed Objects
    Best Architecture for an MVP: Monolith, SOA, Microservices, or Serverless?
    Microservices - Not A Free Lunch!
    Microservices Journey from Netflix OSS to Istio Service Mesh
    瞭解 Microservices 架構
    什么是Service Mesh
    微服務架構 #1, WHY Microservices?
    微服務架構應用指南

    Copyright © m@rcus 學習筆記 | Powered by Blogger

    Design by Anders Noren | Blogger Theme by NewBloggerThemes.com