看懂架構設計中的服務隔離

前言

我們在做系統架構設計的時候,經常離不開的一個話題就是進行服務的隔離設計。

那什么是「服務隔離」呢?

顧名思義,它是指將系統按照一定的原則劃分為若干個服務模塊,各個模塊之間相對獨立,無強依賴。當有故障發生時,能將問題和影響隔離在某個模塊內部,而不擴散風險,不波及其它模塊,不影響整體的系統服務。

其實隔離設計并非軟件行業獨創,它是借鑒于造船行業。
看懂架構設計中的服務隔離
行業有一個專業術語叫做「艙壁隔離」。利用艙壁將不同的船艙隔離起來,如果某一個船艙進了水,那么就可以立即封閉艙門,形成艙壁隔離,只損失那一個船艙,其他船艙不受影響,整個船只還是可以正常航行。

一、為什么要做服務隔離設計呢?

我們在做系統設計的時候,必須有一個清楚的認知是:任何軟件系統,故障是不可避免的,并且大多數還是不可預測的,因此,我們只能在系統的設計之初就充分的考慮好應對措施,如何在故障發生時,去盡最大可能的止損和減少故障范圍。

沒有人敢說他的系統是百分百可用,我們能做的就是,使用一切方法去減少故障的影響面,盡可能的去提高系統的整體可用率。

而把系統分離成子服務,將子服務進行一定程度隔離的做法,能保證在有不可預測的故障發生時,縮小故障范圍的最佳手段。

二、服務隔離應該怎么做?

那在實際項目中,一般通過什么方法去做服務隔離呢?主要有以下兩種:

按服務/功能做隔離

按用戶分類隔離

首先說一下按照服務進行隔離的做法。
看懂架構設計中的服務隔離
網上找了一張圖,雖然原圖的作用不是用來表述這個的,但是也類似,將就看吧。

比如上圖里面,微博項目可以把 Feed信息流、用戶系統、評論系統 都分拆為獨立業務模塊,這些模塊無論是對外的接口應用、還是到數據庫、到底層硬件資源都是完全隔離的。其中任何一個模塊的故障,理論上都不會影響到其它模塊。

再舉個例子,如果我們要設計個電商平臺,可以將其中的 用戶系統、訂單系統、支付系統、倉儲系統 都分別進行獨立隔離,這樣做就是從服務層面實現了故障的隔離效果。

那按照服務隔離有沒有弊端呢?有,肯定有。

當我們某個功能操作需要關聯多個服務模塊或者同時查詢所個模塊數據的時候,代碼寫起來就會相對麻煩一些了,其中涉及到多模塊調用的性能問題、數據一致性問題、事物問題等。

不同服務模塊之間的交互也會比較復雜一些,因為要做服務隔離,避免服務強依賴,所以模塊之間的交互調用最好是走異步模式,需要通過異步線程或消息中間件來傳遞實現。

在進行運營大數據分析的時候,由于數據是散落在不同服務模塊的,因此需要做額外的匯聚操作,還得有唯一字段保證數據在不同模塊產生的先后順序。

接下來說一下按用戶隔離的做法
看懂架構設計中的服務隔離
繼續網上找圖,雖然原圖的作用不是用來表述這個的,但是也類似。粉絲又不多,我又懶得畫圖,將就看吧,多發揮一下想象力,哈哈。

簡單一句話解釋就是:我們先部署多套一模一樣的業務服務,然后將用戶根據一定的特征去做分類,讓不同分類的用戶去訪問不同的業務實例,達到分流和隔離的效果。

怎么給用戶分類?

可以用按照用戶是否VIP、用戶等級、用戶IP等等,方法很多,要結合自己實際業務的特性來做。

其實這也是一種「多租戶架構」,在SaaS服務中用得比較多。

多租戶模式有三種形式:

完全的隔離,即服務和數據都是完全獨立的。

公共服務、獨立數據源,即多個租戶是用的同一臺服務程序,但是底層的數據源是獨立的。

公用服務、公用數據源,即多個租戶的服務程序與數據庫源都是共享的,不同數據可能會做分區分表來獨立。

上述三種方式,從下到上,獨立性和安全性越來越高,資源利用率越來越低,根據業務特性去選擇,一般選擇折中方案。

另外,功能隔離和用戶隔離 兩種方式并非互斥的,是可以結合在一起使用的。

三、服務隔離的注意事項

我們在做服務隔離的時候,還是有一些原則和事項需要注意的:

不可越界:能在隔離模塊內完成的邏輯,就盡量不要跨模塊調用,減少依賴。

不可共享:數據和資源能獨享的就盡量不要共享,不然很容易造成隔離失效。

考慮效率:設計隔離模塊的時候,要根據業務情況而定,充分的考慮到未來的拓補結構,減少調用效率的損失。

考慮顆粒度:隔離模塊設計的大小問題,過大和過小都不合適,需充分考慮。

服務的全面監控:既然服務或用戶進行隔離了,那么系統的復雜度肯定是比之前要高了,那么針對多服務的全鏈路監控是必不可少的。

服務隔離的設計模式能降低依賴服務對整個系統的影響,保護有限的資源不被耗盡,提高了整個系統的可用性。本文參考了很多其它資料,屬于拋磚引玉,希望大家能一起交流,提出更好的架構設計思路。

歡迎工作一到五年的Java工程師朋友們加入Java爬坑之路:860113481

群內提供免費的Java架構學習資料(里面有高可用、高并發、高性能及分布式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!

轉載于:https://blog.51cto.com/13732225/2172933

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

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

相關文章

2018最新蘋果APP上架App Store流程(超詳細)

內容很豐富,點擊查看博文 https://blog.csdn.net/xxw888/article/details/73618837/

[五] JavaIO之InputStream OutputStream簡介 方法列表說明

InputStream 和 OutputStream 對于字節流的輸入和輸出 是作為協議的存在 所以有必要了解下這兩個類提供出來的基本約定 這兩個類是抽象類,而且基本上沒什么實現,都是依賴于子類具體的去實現 但是他是對于其子類 協議綱領一般的存在 了解清楚每一個方法含義,對于后續具體的子類將…

Mysql yum 安裝后,一些重要的文件路徑

默認配置文件路徑: 配置文件:/etc/my.cnf 日志文件:/var/log//var/log/mysqld.log 服務啟動腳本:/usr/lib/systemd/system/mysqld.service socket文件:/var/run/mysqld/mysqld.pid #(a)數據庫目錄 /var/lib/mysql…

mysql雙機熱備 配置文件,MYSQL 雙機熱備配置手冊()

[原創] MYSQL 雙機熱備配置手冊[原創]http://www.chinaunix.net 作者:squall1 發表于:2007-07-23 19:01:43【發表評論】【查看原文】【存儲備份之家討論區】【關閉】作者:CU-squall發表于:2005年4月18日 8:21 可以不經作者同意自由傳播&…

[轉]資本經營董事長班告訴你:不只企業有商業模式,個人商業價值更重要

本文轉自:http://blog.sina.com.cn/s/blog_181b5b47e0102xz4v.html 東方財智-資本經營董事長班>>> 經營者如何輕松駕馭金融工具為企業發展加速、升級互聯網工具實現品牌營銷裂變、利用管理工具優化公司內部結構,把握前沿視角,實現快…

CentOS 7添加開機啟動服務腳本

原文路徑:https://blog.csdn.net/wang123459/article/details/79063703 --------------------------------------------------------- 一、添加開機自啟服務 在CentOS 7中添加開機自啟服務非常方便,只需要兩條命令(以Jenkins為例): system…

php 彩票系統,hsyl12141511 一套完整的PHP版彩票系統 - 下載 - 搜珍網

文件名大小更新時間BOEKJ02017-12-14BOEKJ\.idea02017-12-13BOEKJ\.idea\BOEKJ.iml2812017-04-28BOEKJ\.idea\modules.xml2622017-04-28BOEKJ\.idea\workspace.xml100272017-04-28BOEKJ\String-ext.js10402015-05-30BOEKJ\TianHeng.exe230402015-05-05BOEKJ\config.js309232017…

CPR認證-建材CE認證-305/2011/EU

建材CPR認證 - Regulation (EU) No 305/2011  2011年3月,歐盟頒布了新建筑產品法規RETULATION (EU) No 305/2011 – CPR,并通告了新法規于2013年7月進入強制執行,取代了老CPD指令89/106/EEC。  新的建材CPR認證也是…

python支持復數類型以下什么說法是錯誤的,【Python】專項練習題(1)

1.python代碼如下:foo [1,2]foo1 foofoo.append(3)A.foo 值為[1,2]B.foo 值為[1,2,3]C.foo1 值為[1,2]D.foo1 值為[1,2,3]答案:B D鏈接:https://www.nowcoder.com/profile/153165401/myFollowings/detail/20055659來源:牛客網2.下列程序打印…

ios10不能定位 window.navigator.geolocation.getCurrentPosition(定位第一節)

原文連接: https://blog.csdn.net/michael_ouyang/article/details/54137709 --------------------------------------------------------- 問題分析: 目前由于許多蘋果用戶都升級到了iOS系統,蘋果的iOS 10已經正式對外推送,…

php網站無法顯示,php – 在UTF-8網站上無法正確顯示的字符

我已經完成了我能想到的一切,但是在這個網頁上沒有正確顯示特殊字符.例如,在數據庫中它是:但在網站上它是:Nouveaux R�alistes這是我檢查過的一切……數據庫設置為UTF-8:該頁面是用NetBeans編寫的,文檔編碼設置為UTF-8&#xff1a…

ios如何獲取gps坐標(定位第二節)

原文連接: https://blog.csdn.net/michael_ouyang/article/details/54378338 -------------------------------------------------------------------- 在上一篇文章,解決ios 10不能定位的問題,把navigator.geolocation.getCurrentPosition…

java并發編程——線程池的工作原理與源碼解讀

2019獨角獸企業重金招聘Python工程師標準>>> 線程池的簡單介紹 基于多核CPU的發展,使得多線程開發日趨流行。然而線程的創建和銷毀,都涉及到系統調用,比較消耗系統資源,所以就引入了線程池技術,避免頻繁的線…

php pcre回溯攻擊,php preg_match pcre回溯繞過

原理需要知識:正則NFA回溯原理,php的pcre.backtrack_limit設置。正則NFA回溯原理正則表達式是一個可以被"有限狀態自動機"接受的語言類。"有限狀態自動機",擁有有限數量的狀態,每個狀態可以遷移到零個或多個狀態,輸入字串決定執行哪個狀態的遷移…

電驢更新地址

emule是通過ED2K網絡和KAD網絡尋找、連接其他emule客戶端的,所以服務器列表和KAD節點文件是emule的必需文件。 有些新手由于下載官方原版emule壓縮包或其他未集成這些必需文件的emule壓縮包,從而出現“連接不上ED2K與KAD”問題。所以學會下載更新服務器…

Vue CLI 3 可以使用 TypeScript 生成新工程

TypeScript 支持 在 Vue 2.5.0 中,我們大大改進了類型聲明以更好地使用默認的基于對象的 API。同時此版本也引入了一些其它變化,需要開發者作出相應的升級。閱讀博客文章了解更多詳情。 發布為 NPM 包的官方聲明文件 靜態類型系統能幫助你有效防止許多潛…

手機端本地圖片或者拍照的上傳功能

原文連接 https://blog.csdn.net/m0_37852904/article/details/78550136 ---------------------------------------------------------- 最近剛好在做手機端的圖片上傳功能&#xff0c;便記錄下 html&#xff1a; <input type"file" class"hide" i…

php scandir sftp,CentOS 下使用SFTP實現網站自動生成FTP賬號,實現Chroot功能

背景 手上有一個這樣的系統&#xff1a;后臺可以直接新建項目(網站)&#xff0c;只需輸入項目名稱、訪問域名(二級)以及其他一些額外信息&#xff0c;就可自動生成一個模板網站。大致原理是&#xff1a;提交這些信息的時候&#xff0c;后臺會給項目新建一個目錄&#xff0c;并把…

IOS內購詳解

介紹 最近開發的一款APP上架被駁回了&#xff0c;理由是&#xff1a; 上架的APP是培訓類&#xff0c;里面金牌視頻課程需要購買&#xff0c;Android端使用支付寶&#xff0c;微信支付。 蘋果規定 數字化內容、App功能以及服務等&#xff0c;需要使用內購 真實世界中的服務(…