初識(shí)架構(gòu)05--應(yīng)用

來源: 《從0開始學(xué)架構(gòu)》(極客時(shí)間) ---李運(yùn)華

技術(shù)演進(jìn)的方向

動(dòng)力

一個(gè)行業(yè)的發(fā)展,歸根到底就是業(yè)務(wù)的發(fā)展锤躁。而影響一個(gè)企業(yè)業(yè)務(wù)的發(fā)展主要有 3 個(gè)因素:市場涯呻、技術(shù)、管理面徽,這三者構(gòu)成支撐業(yè)務(wù)發(fā)展的鐵三角艳丛,任何一個(gè)因素的不足匣掸,都可能導(dǎo)致企業(yè)的業(yè)務(wù)停滯不前。

在這個(gè)鐵三角中氮双,業(yè)務(wù)處于三角形的中心碰酝,毫不夸張地說,市場戴差、技術(shù)送爸、管理都是為了支撐企業(yè)業(yè)務(wù)的發(fā)展。

我們可以簡單地將企業(yè)的業(yè)務(wù)分為兩類:一類是產(chǎn)品類暖释,一類是服務(wù)類碱璃。

  • 對(duì)于產(chǎn)品類業(yè)務(wù),技術(shù)創(chuàng)新推動(dòng)業(yè)務(wù)發(fā)展饭入!

原因在于用戶選擇一個(gè)產(chǎn)品的根本驅(qū)動(dòng)力在于產(chǎn)品的功能是否能夠更好地幫助自己完成任務(wù)嵌器。用戶會(huì)自然而然地選擇那些功能更加強(qiáng)大、性能更加先進(jìn)谐丢、體驗(yàn)更加順暢爽航、外觀更加漂亮的產(chǎn)品,而功能乾忱、性能讥珍、體驗(yàn)、外觀等都需要強(qiáng)大的技術(shù)支撐窄瘟。

  • 對(duì)于服務(wù)類業(yè)務(wù)衷佃,業(yè)務(wù)發(fā)展推動(dòng)技術(shù)的發(fā)展!

用戶選擇服務(wù)的根本驅(qū)動(dòng)力與選擇產(chǎn)品不同蹄葱。用戶選擇一個(gè)產(chǎn)品的根本驅(qū)動(dòng)力是其“功能”氏义,而用戶選擇一個(gè)服務(wù)的根本驅(qū)動(dòng)力不是功能,而是“規(guī)耐荚疲”惯悠。

模式

論什么模式的業(yè)務(wù),如果業(yè)務(wù)的發(fā)展需要技術(shù)同步發(fā)展進(jìn)行支撐竣况,無一例外是因?yàn)闃I(yè)務(wù)“復(fù)雜度”的上升克婶,導(dǎo)致原有的技術(shù)無法支撐。

復(fù)雜度要么來源于功能不斷疊加丹泉,要么來源于規(guī)模擴(kuò)大情萤,從而對(duì)性能和可用性有了更高的要求。既然如此摹恨,判斷到底是什么復(fù)雜度發(fā)生了變化就顯得至關(guān)重要了筋岛。

那架構(gòu)師具體應(yīng)該按照什么標(biāo)準(zhǔn)來判斷呢?答案就是基于業(yè)務(wù)發(fā)展階段進(jìn)行判斷睬塌,這也是為什么架構(gòu)師必須具備業(yè)務(wù)理解能力的原因泉蝌。不同的行業(yè)業(yè)務(wù)發(fā)展路徑歇万、軌跡、模式不一樣勋陪,架構(gòu)師必須能夠基于行業(yè)發(fā)展和企業(yè)自身情況做出準(zhǔn)確判斷贪磺。

互聯(lián)網(wǎng)技術(shù)演進(jìn)模式

聯(lián)網(wǎng)業(yè)務(wù)發(fā)展一般分為幾個(gè)時(shí)期:初創(chuàng)期、發(fā)展期诅愚、競爭期寒锚、成熟期。同時(shí)期的差別主要體現(xiàn)在兩個(gè)方面:復(fù)雜性违孝、用戶規(guī)模刹前。

業(yè)務(wù)復(fù)雜性

1. 初創(chuàng)期

互聯(lián)網(wǎng)業(yè)務(wù)剛開始一般都是一個(gè)創(chuàng)新的業(yè)務(wù)點(diǎn),這個(gè)業(yè)務(wù)點(diǎn)的重點(diǎn)不在于“完善”雌桑,而在于“創(chuàng)新”喇喉,只有創(chuàng)新才能吸引用戶;而且因?yàn)槠洹靶隆钡奶攸c(diǎn)校坑,其實(shí)一開始是不可能很完善的拣技。只有隨著越來越多的用戶的使用,通過快速迭代試錯(cuò)耍目、用戶的反饋等手段膏斤,不斷地在實(shí)踐中去完善,才能繼續(xù)創(chuàng)新邪驮。

初創(chuàng)期的業(yè)務(wù)對(duì)技術(shù)就一個(gè)要求:“快”莫辨,但這個(gè)時(shí)候卻又是創(chuàng)業(yè)團(tuán)隊(duì)最弱小的時(shí)期,可能就幾個(gè)技術(shù)人員毅访,所以這個(gè)時(shí)候十八般武藝都需要用上:能買就買沮榜,有開源的就用開源的。

2. 發(fā)展期

業(yè)務(wù)快速發(fā)展時(shí)期的主要目的是將原來不完善的業(yè)務(wù)逐漸完善俺抽,因此會(huì)有越來越多的新功能不斷地加入到系統(tǒng)中敞映。對(duì)于絕大部分技術(shù)團(tuán)隊(duì)來說较曼,這個(gè)階段技術(shù)的核心工作是快速地實(shí)現(xiàn)各種需求磷斧,只有這樣才能滿足業(yè)務(wù)發(fā)展的需要。

一般會(huì)經(jīng)歷下面幾個(gè)階段:

1. 堆功能期

業(yè)務(wù)進(jìn)入快速發(fā)展期的初期捷犹,此時(shí)團(tuán)隊(duì)規(guī)模也不大弛饭,業(yè)務(wù)需求又很緊,最快實(shí)現(xiàn)業(yè)務(wù)需求的方式是繼續(xù)在原有的系統(tǒng)里面不斷地增加新的功能萍歉,重構(gòu)侣颂、優(yōu)化、架構(gòu)等方面的工作即使想做枪孩,也會(huì)受制于人力和業(yè)務(wù)發(fā)展的壓力而放在一邊憔晒。

2. 優(yōu)化期

核心思想是將現(xiàn)有的系統(tǒng)優(yōu)化藻肄。例如,采用重構(gòu)拒担、分層嘹屯、優(yōu)化某個(gè) MySQL 查詢語句,將機(jī)械硬盤換成 SSD从撼,將數(shù)據(jù)庫從 MySQL 換成 Oracle州弟,增加 Memcache 緩存等。優(yōu)勢是對(duì)系統(tǒng)改動(dòng)較小低零,優(yōu)化可以比較快速地實(shí)施婆翔;缺點(diǎn)就是可能過不了多久,系統(tǒng)又撐不住了掏婶。

3. 架構(gòu)期

經(jīng)過優(yōu)化期后啃奴,如果業(yè)務(wù)能夠繼續(xù)發(fā)展,慢慢就會(huì)發(fā)現(xiàn)優(yōu)化也頂不住了雄妥,畢竟再怎么優(yōu)化纺腊,系統(tǒng)的能力總是有極限的,只能進(jìn)行架構(gòu)調(diào)整。
架構(gòu)期可以用的手段很多茎芭,但歸根結(jié)底可以總結(jié)為一個(gè)字“拆”揖膜,什么地方都可以拆。

3. 競爭期

當(dāng)業(yè)務(wù)繼續(xù)發(fā)展梅桩,已經(jīng)形成一定規(guī)模后壹粟,一定會(huì)有競爭對(duì)手開始加入行業(yè)來競爭,當(dāng)競爭對(duì)手加入后宿百,大家互相學(xué)習(xí)和模仿趁仙,業(yè)務(wù)更加完善,也不斷有新的業(yè)務(wù)創(chuàng)新出來垦页,而且由于競爭的壓力雀费,對(duì)技術(shù)的要求是更上一層樓了。

當(dāng)系統(tǒng)的數(shù)量越來越多就會(huì)產(chǎn)生質(zhì)變痊焊,主要體現(xiàn)在下面幾個(gè)方面:

  • 重復(fù)造輪子

系統(tǒng)越來越多盏袄,各系統(tǒng)相似的工作越來越多。

  • 系統(tǒng)交互一團(tuán)亂麻

系統(tǒng)越來越多薄啥,各系統(tǒng)的交互關(guān)系變成了網(wǎng)狀辕羽。系統(tǒng)間的交互數(shù)量和系統(tǒng)的數(shù)量成平方比的關(guān)系。

針對(duì)這個(gè)時(shí)期業(yè)務(wù)變化帶來的問題垄惧,技術(shù)工作主要的解決手段有:

  • 平臺(tái)化

目的在于解決“重復(fù)造輪子”的問題刁愿。

  • 服務(wù)化

目的在于解決“系統(tǒng)交互”的問題,常見的做法是通過消息隊(duì)列來完成系統(tǒng)間的異步通知到逊,通過服務(wù)框架來完成系統(tǒng)間的同步調(diào)用铣口。

4. 成熟期

此時(shí)技術(shù)上該拆的也拆了滤钱,該平臺(tái)化的也平臺(tái)化了,技術(shù)上能做的大動(dòng)作其實(shí)也不多了脑题,更多的是進(jìn)行優(yōu)化菩暗。但有時(shí)候也會(huì)為了滿足某個(gè)優(yōu)化,系統(tǒng)做很大的改變旭蠕。

這個(gè)時(shí)候的技術(shù)優(yōu)化沒有固定的套路停团,只能按照競爭的要求,找出自己的弱項(xiàng)掏熬,然后逐項(xiàng)優(yōu)化佑稠。在逐項(xiàng)優(yōu)化時(shí),可以采取之前各個(gè)時(shí)期采用的手段旗芬。

用戶規(guī)模

用戶量增大對(duì)技術(shù)的影響主要體現(xiàn)在兩個(gè)方面:性能要求越來越高舌胶、可用性要求越來越高。

架構(gòu)模板

存儲(chǔ)層技術(shù)

SQL

隨著互聯(lián)網(wǎng)業(yè)務(wù)的發(fā)展疮丛,性能要求越來越高幔嫂,必然要面對(duì)一個(gè)問題:將數(shù)據(jù)拆分到多個(gè)數(shù)據(jù)庫實(shí)例才能滿足業(yè)務(wù)的性能需求。

數(shù)據(jù)庫拆分滿足了性能的要求誊薄,但帶來了復(fù)雜度的問題:數(shù)據(jù)如何拆分履恩、數(shù)據(jù)如何組合?這個(gè)復(fù)雜度的問題解決起來并不容易呢蔫,如果每個(gè)業(yè)務(wù)都去實(shí)現(xiàn)一遍切心,重復(fù)造輪子將導(dǎo)致投入浪費(fèi)、效率降低片吊,業(yè)務(wù)開發(fā)想快都快不起來绽昏。

所以互聯(lián)網(wǎng)公司流行的做法是業(yè)務(wù)發(fā)展到一定階段后,就會(huì)將這部分功能獨(dú)立成中間件俏脊。

當(dāng)規(guī)模繼續(xù)擴(kuò)大后全谤,力雄厚的大公司此時(shí)一般都會(huì)在 SQL 集群上構(gòu)建 SQL 存儲(chǔ)平臺(tái),以對(duì)業(yè)務(wù)透明的形式提供資源分配爷贫、數(shù)據(jù)備份认然、遷移、容災(zāi)沸久、讀寫分離季眷、分庫分表等一系列服務(wù)。

NoSQL

由于 NoSQL 方案一般自己本身就提供集群的功能卷胯,因此 NoSQL 在剛開始應(yīng)用時(shí)很方便,不像 SQL 分庫分表那么復(fù)雜威酒。

NoSQL 發(fā)展到一定規(guī)模后窑睁,通常都會(huì)在 NoSQL 集群的基礎(chǔ)之上再實(shí)現(xiàn)統(tǒng)一存儲(chǔ)平臺(tái)挺峡,統(tǒng)一存儲(chǔ)平臺(tái)主要實(shí)現(xiàn)這幾個(gè)功能:

  • 資源動(dòng)態(tài)按需動(dòng)態(tài)分配
  • 資源自動(dòng)化管理
  • 故障自動(dòng)化處理

小文件存儲(chǔ)

除了關(guān)系型的業(yè)務(wù)數(shù)據(jù),互聯(lián)網(wǎng)行業(yè)還有很多用于展示的數(shù)據(jù)担钮,這些數(shù)據(jù)具有數(shù)據(jù)小橱赠,數(shù)據(jù)量大,訪問量巨大的特點(diǎn)箫津∠烈蹋基本上每個(gè)業(yè)務(wù)都會(huì)有這樣的數(shù)據(jù),為了防止重復(fù)造輪子苏遥,所以一般會(huì)將小文件存儲(chǔ)做成統(tǒng)一的和業(yè)務(wù)無關(guān)的平臺(tái)饼拍。

得益于開源運(yùn)動(dòng)的發(fā)展和最近幾年大數(shù)據(jù)的火爆,在開源方案的基礎(chǔ)上封裝一個(gè)小文件存儲(chǔ)平臺(tái)并不是太難的事情田炭。例如师抄,HBase、Hadoop教硫、Hypertable叨吮、FastDFS 等都可以作為小文件存儲(chǔ)的底層平臺(tái),只需要將這些開源方案再包裝一下基本上就可以用了瞬矩。

大文件存儲(chǔ)

說到大文件茶鉴,特別要提到 Google 和 Yahoo,Google 的 3 篇大數(shù)據(jù)論文(Bigtable/Map- Reduce/GFS)開啟了一個(gè)大數(shù)據(jù)的時(shí)代景用,而 Yahoo 開源的 Hadoop 系列(HDFS蛤铜、HBase 等),基本上壟斷了開源界的大數(shù)據(jù)處理丛肢。

對(duì)照 Google 的論文構(gòu)建一套完整的大數(shù)據(jù)處理方案的難度和成本實(shí)在太高围肥,而且開源方案現(xiàn)在也很成熟了,所以大數(shù)據(jù)存儲(chǔ)和處理這塊反而是最簡單的蜂怎,因?yàn)槟銢]有太多選擇穆刻,只能用這幾個(gè)流行的開源方案,例如杠步,Hadoop氢伟、HBase、Storm幽歼、Hive 等朵锣。實(shí)力雄厚一些的大公司會(huì)基于這些開源方案,結(jié)合自己的業(yè)務(wù)特點(diǎn)甸私,封裝成大數(shù)據(jù)平臺(tái)诚些。

開發(fā)層技術(shù)

開發(fā)框架

一般互聯(lián)網(wǎng)公司都會(huì)指定一個(gè)大的技術(shù)方向,然后使用統(tǒng)一的開發(fā)框架。例如诬烹,Java 相關(guān)的開發(fā)框架 SSH砸烦、SpringMVC、Play绞吁,Ruby 的 Ruby on Rails幢痘,PHP 的 ThinkPHP,Python 的 Django 等家破。

對(duì)于框架的選擇颜说,有一個(gè)總的原則:優(yōu)選成熟的框架,避免盲目追逐新技術(shù)汰聋!

Web服務(wù)器

獨(dú)立開發(fā)一個(gè)成熟的 Web 服務(wù)器门粪,成本非常高,況且業(yè)界又有那么多成熟的開源 Web 服務(wù)器马僻,所以互聯(lián)網(wǎng)行業(yè)基本上都是“拿來主義”庄拇,挑選一個(gè)流行的開源服務(wù)器即可。大一點(diǎn)的公司韭邓,可能會(huì)在開源服務(wù)器的基礎(chǔ)上措近,結(jié)合自己的業(yè)務(wù)特點(diǎn)做二次開發(fā)。

選擇一個(gè)Web服務(wù)器主要和開發(fā)語言相關(guān)女淑,例如瞭郑,Java 的有 Tomcat、JBoss鸭你、Resin 等屈张,PHP/Python 的用 Nginx,當(dāng)然最保險(xiǎn)的就是用 Apache 了袱巨,什么語言都支持阁谆。

容器

容器以docker為代表占卧,已經(jīng)在BAT級(jí)別的公司有了較多的應(yīng)用意推。

  • 運(yùn)維方式會(huì)發(fā)生革命性的變化:Docker 啟動(dòng)快,幾乎不占資源灼擂,隨時(shí)啟動(dòng)和停止嫉入,基于 Docker 打造自動(dòng)化運(yùn)維焰盗、智能化運(yùn)維將成為主流方式。
  • 設(shè)計(jì)模式會(huì)發(fā)生本質(zhì)上的變化:啟動(dòng)一個(gè)新的容器實(shí)例代價(jià)如此低咒林,將鼓勵(lì)設(shè)計(jì)思路朝“微服務(wù)”的方向發(fā)展熬拒。

服務(wù)層技術(shù)

1. 配置中心

將配置中心做成通用的系統(tǒng)的好處有:

  • 集中配置多個(gè)系統(tǒng),操作效率高垫竞。
  • 所有配置都在一個(gè)集中的地方澎粟,檢查方便,協(xié)作效率高。
  • 配置中心可以實(shí)現(xiàn)程序化的規(guī)則檢查捌议,避免常見的錯(cuò)誤引有。比如說檢查最小值、最大值譬正、是否 IP 地址、是否 URL 地址曾我,都可以用正則表達(dá)式完成。
  • 配置中心相當(dāng)于備份了系統(tǒng)的配置贫贝,當(dāng)某些情況下需要搭建新的環(huán)境時(shí),能夠快速搭建環(huán)境和恢復(fù)業(yè)務(wù)稚晚。

一般以“系統(tǒng)標(biāo)識(shí) + host + port”來標(biāo)識(shí)唯一一個(gè)系統(tǒng)運(yùn)行實(shí)例型诚。

2. 服務(wù)中心

服務(wù)中心的實(shí)現(xiàn)一般來說有兩種方式:服務(wù)名字系統(tǒng)和服務(wù)總線系統(tǒng)客燕。

  • 服務(wù)名字系統(tǒng)(Service Name System)

服務(wù)名字系統(tǒng)是為了將 Service 名稱解析為“host + port + 接口名稱”,但是和 DNS 一樣狰贯,真正發(fā)起請(qǐng)求的還是請(qǐng)求方也搓。

  • 服務(wù)總線系統(tǒng)

相比服務(wù)名字系統(tǒng),服務(wù)總線系統(tǒng)更進(jìn)一步了:由總線系統(tǒng)完成調(diào)用涵紊,服務(wù)請(qǐng)求方都不需要直接和服務(wù)提供方交互了傍妒。

3. 消息隊(duì)列

傳統(tǒng)的異步通知方式是由消息生產(chǎn)者直接調(diào)用消息消費(fèi)者提供的接口進(jìn)行通知的,但當(dāng)業(yè)務(wù)變得龐大摸柄,子系統(tǒng)數(shù)量增多時(shí)颤练,這樣做會(huì)導(dǎo)致系統(tǒng)間交互非常復(fù)雜和難以管理,因?yàn)橄到y(tǒng)間互相依賴和調(diào)用塘幅,整個(gè)系統(tǒng)的結(jié)構(gòu)就像一張蜘蛛網(wǎng)昔案。

消息隊(duì)列就是為了實(shí)現(xiàn)這種跨系統(tǒng)異步通知的中間件系統(tǒng)。消息隊(duì)列既可以“一對(duì)一”通知电媳,也可以“一對(duì)多”廣播踏揣。

對(duì)比蜘蛛網(wǎng)架構(gòu),可以看到引入消息隊(duì)列后的效果:

  • 整體結(jié)構(gòu)從網(wǎng)狀結(jié)構(gòu)變?yōu)榫€性結(jié)構(gòu)匾乓,結(jié)構(gòu)清晰
  • 消息生產(chǎn)和消息消費(fèi)解耦捞稿,實(shí)現(xiàn)簡單
  • 增加新的消息消費(fèi)者,消息生產(chǎn)者完全不需要任何改動(dòng),擴(kuò)展方便
  • 消息隊(duì)列系統(tǒng)可以做高可用娱局、高性能彰亥,避免各業(yè)務(wù)子系統(tǒng)各自獨(dú)立做一套,減輕工作量
  • 業(yè)務(wù)子系統(tǒng)只需要聚焦業(yè)務(wù)即可衰齐,實(shí)現(xiàn)簡單

消息隊(duì)列系統(tǒng)基本功能的實(shí)現(xiàn)比較簡單任斋,但要做到高性能、高可用耻涛、消息時(shí)序性废酷、消息事務(wù)性則比較難。業(yè)界已經(jīng)有很多成熟的開源實(shí)現(xiàn)方案抹缕,如果要求不高,基本上拿來用即可趴俘,例如寥闪,RocketMQ橙垢、Kafka柜某、ActiveMQ 等喂击。但如果業(yè)務(wù)對(duì)消息的可靠性翰绊、時(shí)序监嗜、事務(wù)性要求較高時(shí)裁奇,則要深入研究這些開源方案刽肠,否則很容易踩坑音五。

網(wǎng)絡(luò)層技術(shù)

負(fù)載均衡

  1. DNS

DNS 是最簡單也是最常見的負(fù)載均衡方式厨钻,一般用來實(shí)現(xiàn)地理級(jí)別的均衡莉撇。

  1. Nginx 惶傻、LVS 银室、F5

DNS 用于實(shí)現(xiàn)地理級(jí)別的負(fù)載均衡蜈敢,而 Nginx抓狭、LVS否过、F5 用于同一地點(diǎn)內(nèi)機(jī)器級(jí)別的負(fù)載均衡苗桂。其中 Nginx 是軟件的 7 層負(fù)載均衡煤伟,LVS 是內(nèi)核的 4 層負(fù)載均衡便锨,F(xiàn)5 是硬件的 4 層負(fù)載均衡放案。

CDN

CDN 是為了解決用戶網(wǎng)絡(luò)訪問時(shí)的“最后一公里”效應(yīng)卿叽,本質(zhì)上是一種“以空間換時(shí)間”的加速策略贩虾,即將內(nèi)容緩存在離用戶最近的地方缎罢,用戶訪問的是緩存的內(nèi)容策精,而不是站點(diǎn)實(shí)時(shí)的內(nèi)容咽袜。

CDN 經(jīng)過多年的發(fā)展询刹,已經(jīng)變成了一個(gè)很龐大的體系:分布式存儲(chǔ)凹联、全局負(fù)載均衡蔽挠、網(wǎng)絡(luò)重定向澳淑、流量控制等都屬于 CDN 的范疇偶惠,尤其是在視頻忽孽、直播等領(lǐng)域兄一,如果沒有 CDN出革,用戶是不可能實(shí)現(xiàn)流暢觀看內(nèi)容的骂束。

幸運(yùn)的是展箱,大部分程序員和架構(gòu)師都不太需要深入理解 CDN 的細(xì)節(jié)混驰,因?yàn)?CDN 作為網(wǎng)絡(luò)的基礎(chǔ)服務(wù)昆汹,獨(dú)立搭建的成本巨大满粗,很少有公司自己設(shè)計(jì)和搭建 CDN 系統(tǒng)败潦,從 CDN 服務(wù)商購買 CDN 服務(wù)即可。

多機(jī)房

多機(jī)房設(shè)計(jì)最核心的因素就是如何處理時(shí)延帶來的影響狸膏,常見的策略有:

  1. 同城多機(jī)房
  2. 跨城多機(jī)房
  3. 跨國多機(jī)房

多中心

多中心必須以多機(jī)房為前提湾戳,但從設(shè)計(jì)的角度來看砾脑,多中心相比多機(jī)房是本質(zhì)上的飛越韧衣,難度也高出一個(gè)等級(jí)畅铭。

簡單來說硕噩,多機(jī)房的主要目標(biāo)是災(zāi)備炉擅,當(dāng)機(jī)房故障時(shí)谍失,可以比較快速地將業(yè)務(wù)切換到另外一個(gè)機(jī)房袱贮,這種切換操作允許一定時(shí)間的中斷(例如攒巍,10 分鐘柒莉、1 個(gè)小時(shí))兢孝,而且業(yè)務(wù)也可能有損失跨蟹。因此相比多機(jī)房來說窗轩,多中心的要求就高多了痢艺,要求每個(gè)中心都同時(shí)對(duì)外提供服務(wù)堤舒,且業(yè)務(wù)能夠自動(dòng)在多中心之間切換箕戳,故障后不需人工干預(yù)或者很少的人工干預(yù)就能自動(dòng)恢復(fù)漂羊。

多中心設(shè)計(jì)的關(guān)鍵就在于“數(shù)據(jù)一致性”和“數(shù)據(jù)事務(wù)性”如何保證走越,這兩個(gè)難點(diǎn)都和業(yè)務(wù)緊密相關(guān)旨指,目前沒有很成熟的且通用的解決方案,需要基于業(yè)務(wù)的特性進(jìn)行詳細(xì)的分析和設(shè)計(jì)裸扶。

用戶層技術(shù)

1. 用戶管理

稍微大一點(diǎn)的互聯(lián)網(wǎng)業(yè)務(wù)呵晨,肯定會(huì)涉及多個(gè)子系統(tǒng),這些子系統(tǒng)不可能每個(gè)都管理這么龐大的用戶粱哼,由此引申出用戶管理的第一個(gè)目標(biāo):單點(diǎn)登錄(SSO)揭措,又叫統(tǒng)一登錄桑嘶。單點(diǎn)登錄的技術(shù)實(shí)現(xiàn)手段較多不翩,例如 cookie、JSONP津坑、token 等疆瑰,目前最成熟的開源單點(diǎn)登錄方案當(dāng)屬 CAS穆役。

除此之外耿币,當(dāng)業(yè)務(wù)做大成為了平臺(tái)后淹接,開放成為了促進(jìn)業(yè)務(wù)進(jìn)一步發(fā)展的手段塑悼,需要允許第三方應(yīng)用接入厢蒜,由此引申出用戶管理的第二個(gè)目標(biāo):授權(quán)登錄“哐唬現(xiàn)在最流行的授權(quán)登錄就是 OAuth 2.0 協(xié)議鄙才,基本上已經(jīng)成為了事實(shí)上的標(biāo)準(zhǔn)攒庵,如果要做開放平臺(tái)浓冒,則最好用這個(gè)協(xié)議闲擦,私有協(xié)議漏洞多墅冷,第三方接入也麻煩寞忿。

2. 消息推送

消息推送根據(jù)不同的途徑腔彰,分為短信霹抛、郵件杯拐、站內(nèi)信藕施、App 推送裳食。除了 App浊吏,不同的途徑基本上調(diào)用不同的 API 即可完成找田,技術(shù)上沒有什么難度墩衙。

App 目前主要分為 iOS 和 Android 推送漆改,iOS 系統(tǒng)比較規(guī)范和封閉挫剑,基本上只能使用蘋果的 APNS柱衔;但 Android 就不一樣了唆铐,在國外艾岂,用 GCM 和 APNS 差別不大澳盐;但是在國內(nèi)叼耙,情況就復(fù)雜多了:首先是 GCM 不能用筛婉;其次是各個(gè)手機(jī)廠商都有自己的定制的 Android爽撒,消息推送實(shí)現(xiàn)也不完全一樣硕勿。

3. 存儲(chǔ)云源武、圖片云

需要用到小文件存儲(chǔ)技術(shù)话浇。簡單來說闹究,存儲(chǔ)云和圖片云通常的實(shí)現(xiàn)都是“CDN + 小文件存儲(chǔ)”渣淤,現(xiàn)在有了“云”之后蹋订,除非 BAT 級(jí)別刻伊,一般不建議自己再重復(fù)造輪子了捶箱,直接買云服務(wù)可能是最快也是最經(jīng)濟(jì)的方式丁屎。

普通的文件基本上提供存儲(chǔ)和訪問就夠了晨川,而圖片涉及的業(yè)務(wù)會(huì)更多愧怜,包括裁剪拥坛、壓縮猜惋、美化著摔、審核梨撞、水印等處理卧波,因此通常情況下圖片云會(huì)拆分為獨(dú)立的系統(tǒng)對(duì)用戶提供服務(wù)。

業(yè)務(wù)層技術(shù)

拋開業(yè)務(wù)上的差異螃成,各個(gè)互聯(lián)網(wǎng)業(yè)務(wù)發(fā)展最終面臨的問題都是類似的:業(yè)務(wù)復(fù)雜度越來越高寸宏。也就是說氮凝,業(yè)務(wù)層面對(duì)的主要技術(shù)挑戰(zhàn)是“復(fù)雜度”。

針對(duì)業(yè)務(wù)復(fù)雜度的調(diào)整启摄,唯一的解決辦法就是“拆”傅是,化整為零喧笔、分而治之溃斋,將整體復(fù)雜性分散到多個(gè)子業(yè)務(wù)或者子系統(tǒng)里面去。

隨著子系統(tǒng)數(shù)量越來越多截碴,如果達(dá)到幾百上千走哺,另外一個(gè)復(fù)雜度問題又會(huì)凸顯出來:子系統(tǒng)數(shù)量太多丙躏,已經(jīng)沒有人能夠說清楚業(yè)務(wù)的調(diào)用流程了晒旅,出了問題排查也會(huì)特別復(fù)雜废恋。此時(shí)就要按照“高內(nèi)聚鱼鼓,低耦合”的原則來進(jìn)行合了,將職責(zé)關(guān)聯(lián)比較強(qiáng)的子系統(tǒng)合成一個(gè)虛擬業(yè)務(wù)域课竣,然后通過網(wǎng)關(guān)對(duì)外統(tǒng)一呈現(xiàn)曹阔,類似于設(shè)計(jì)模式中的 Facade 模式赃份。

平臺(tái)層技術(shù)

運(yùn)維平臺(tái)

運(yùn)維平臺(tái)核心的職責(zé)分為四大塊:配置抓韩、部署谒拴、監(jiān)控炭序、應(yīng)急:

  • 配置:主要負(fù)責(zé)資源的管理。例如相恃,機(jī)器管理辜纲、IP 地址管理、虛擬機(jī)管理等拦耐。
  • 部署:主要負(fù)責(zé)將系統(tǒng)發(fā)布到線上耕腾。例如,包管理杀糯、灰度發(fā)布管理扫俺、回滾等。
  • 監(jiān)控:主要負(fù)責(zé)收集系統(tǒng)上線運(yùn)行后的相關(guān)數(shù)據(jù)并進(jìn)行監(jiān)控火脉,以便及時(shí)發(fā)現(xiàn)問題牵舵。
  • 主要負(fù)責(zé)系統(tǒng)出故障后的處理。例如,停止程序送火、下線故障機(jī)器、切換 IP 等先匪。

運(yùn)維平臺(tái)的核心設(shè)計(jì)要素是“四化”:標(biāo)準(zhǔn)化种吸、平臺(tái)化、自動(dòng)化呀非、可視化坚俗。

  1. 標(biāo)準(zhǔn)化

需要制定運(yùn)維標(biāo)準(zhǔn),規(guī)范配置管理岸裙、部署流程恩闻、監(jiān)控指標(biāo)、應(yīng)急能力等,各系統(tǒng)按照運(yùn)維標(biāo)準(zhǔn)來實(shí)現(xiàn)褂微,避免不同的系統(tǒng)不同的處理方式求厕。標(biāo)準(zhǔn)化是運(yùn)維平臺(tái)的基礎(chǔ)项栏,沒有標(biāo)準(zhǔn)化就沒有運(yùn)維平臺(tái)列另。

  1. 平臺(tái)化

傳統(tǒng)的手工運(yùn)維方式需要投入大量人力惭载,效率低踪古,容易出錯(cuò)纷纫,因此需要在運(yùn)維標(biāo)準(zhǔn)化的基礎(chǔ)上染簇,將運(yùn)維的相關(guān)操作都集成到運(yùn)維平臺(tái)中青灼,通過運(yùn)維平臺(tái)來完成運(yùn)維工作。

運(yùn)維平臺(tái)的好處有:

  • 可以將運(yùn)維標(biāo)準(zhǔn)固化到平臺(tái)中,無須運(yùn)維人員死記硬背運(yùn)維標(biāo)準(zhǔn)。
  • 運(yùn)維平臺(tái)提供簡單方便的操作瘸味,相比之下人工操作低效且容易出錯(cuò)枯冈。
  • 運(yùn)維平臺(tái)是可復(fù)用的瑰煎,一套運(yùn)維平臺(tái)可以支撐幾百上千個(gè)業(yè)務(wù)系統(tǒng)。
  1. 自動(dòng)化

傳統(tǒng)手工運(yùn)維方式效率低下的一個(gè)主要原因就是要執(zhí)行大量重復(fù)的操作其垄,運(yùn)維平臺(tái)可以將這些重復(fù)操作固化下來,由系統(tǒng)自動(dòng)完成橘霎。

類似的還有監(jiān)控,有了運(yùn)維平臺(tái)后柜与,運(yùn)維平臺(tái)可以實(shí)時(shí)收集數(shù)據(jù)并進(jìn)行初步分析,當(dāng)發(fā)現(xiàn)數(shù)據(jù)異常時(shí)自動(dòng)發(fā)出告警枝缔,無須運(yùn)維人員盯著數(shù)據(jù)看发钝。

  1. 可視化

可視化的主要目的就是為了提升數(shù)據(jù)查看效率夺英。

測試平臺(tái)

測試平臺(tái)的核心目的是提升測試效率垮衷,從而提升產(chǎn)品質(zhì)量徐许,其設(shè)計(jì)關(guān)鍵就是自動(dòng)化。

測試平臺(tái)的基本架構(gòu)如下:

  1. 用例管理
  2. 資源管理
  3. 任務(wù)管理
  4. 數(shù)據(jù)管理

數(shù)據(jù)平臺(tái)

數(shù)據(jù)平臺(tái)的核心職責(zé)主要包括三部分:數(shù)據(jù)管理、數(shù)據(jù)分析和數(shù)據(jù)應(yīng)用美尸。

  1. 數(shù)據(jù)管理

數(shù)據(jù)管理包含數(shù)據(jù)采集义矛、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)訪問和數(shù)據(jù)安全四個(gè)核心職責(zé)脉漏,是數(shù)據(jù)平臺(tái)的基礎(chǔ)功能坦仍。

  1. 數(shù)據(jù)分析

數(shù)據(jù)分析包括數(shù)據(jù)統(tǒng)計(jì)汽纠、數(shù)據(jù)挖掘绍昂、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)等幾個(gè)細(xì)分領(lǐng)域于置。

  1. 數(shù)據(jù)應(yīng)用

數(shù)據(jù)應(yīng)用很廣泛筹麸,既包括在線業(yè)務(wù),也包括離線業(yè)務(wù)僧界。例如,推薦、廣告等屬于在線應(yīng)用捉貌,報(bào)表、欺詐檢測折剃、異常檢測等屬于離線應(yīng)用像屋。

管理平臺(tái)

管理平臺(tái)的核心職責(zé)就是權(quán)限管理,無論是業(yè)務(wù)系統(tǒng)、中間件系統(tǒng),還是平臺(tái)系統(tǒng)金砍,都需要進(jìn)行管理。如果每個(gè)系統(tǒng)都自己來實(shí)現(xiàn)權(quán)限管理塘匣,效率太低,重復(fù)工作很多棍厂,因此需要統(tǒng)一的管理平臺(tái)來管理所有的系統(tǒng)的權(quán)限颗味。

權(quán)限管理主要分為兩部分:身份認(rèn)證、權(quán)限控制牺弹。

開源項(xiàng)目

不要重復(fù)發(fā)明輪子浦马,但要找到合適的輪子

如何選擇一個(gè)開源項(xiàng)目

  1. 聚焦是否滿足業(yè)務(wù)

聚焦于是否滿足業(yè)務(wù),而不需要過于關(guān)注開源項(xiàng)目是否優(yōu)秀张漂。

  1. 聚焦是否成熟

盡量選擇成熟的開源項(xiàng)目晶默,可以從以下方面考察開源項(xiàng)目是否成熟:

  • 版本號(hào):除非特殊情況,否則不要選 0.X 版本的鹃锈,至少選 1.X 版本的荤胁,版本號(hào)越高越好。
  • 使用的公司數(shù)量:一般開源項(xiàng)目都會(huì)把采用了自己項(xiàng)目的公司列在主頁上屎债,公司越大越好仅政,數(shù)量越多越好。
  • 社區(qū)活躍度:看看社區(qū)是否活躍盆驹,發(fā)帖數(shù)圆丹、回復(fù)數(shù)、問題處理速度等躯喇。
  1. 聚焦運(yùn)維能力

如果要將項(xiàng)目應(yīng)用到線上生產(chǎn)環(huán)境辫封,則運(yùn)維能力是必不可少的一環(huán),否則一旦出問題廉丽,運(yùn)維倦微、研發(fā)、測試都只能干瞪眼正压,求菩薩保佑了欣福!

  • 開源項(xiàng)目日志是否齊全
  • 開源項(xiàng)目是否有命令行、管理控制臺(tái)等維護(hù)工具焦履,能夠看到系統(tǒng)運(yùn)行時(shí)的情況拓劝。
  • 開源項(xiàng)目是否有故障檢測和恢復(fù)的能力雏逾,例如告警、切換等郑临。

如何使用開源項(xiàng)目

  1. 深入研究栖博,仔細(xì)測試
  • 通讀開源項(xiàng)目的設(shè)計(jì)文檔或者白皮書,了解其設(shè)計(jì)原理厢洞。
  • 核對(duì)每個(gè)配置項(xiàng)的作用和影響仇让,識(shí)別出關(guān)鍵配置項(xiàng)。
  • 進(jìn)行多種場景的性能測試犀变。
  • 進(jìn)行壓力測試妹孙,連續(xù)跑幾天,觀察 CPU获枝、內(nèi)存蠢正、磁盤 I/O 等指標(biāo)波動(dòng)。
  • 進(jìn)行故障測試:kill省店、斷電嚣崭、拔網(wǎng)線、重啟 100 次以上懦傍、切換等雹舀。
  1. 小心應(yīng)用,灰度發(fā)布

先在非核心的業(yè)務(wù)上用粗俱,然后有經(jīng)驗(yàn)后慢慢擴(kuò)展说榆。

  1. 做好應(yīng)急,以防萬一

如何基于開源項(xiàng)目做二次開發(fā)

  1. 保持純潔寸认,加以包裝

不要改動(dòng)原系統(tǒng)签财,而是要開發(fā)輔助系統(tǒng):監(jiān)控、報(bào)警偏塞、負(fù)載均衡唱蒸、管理等。

  1. 發(fā)明你要的輪子

選與不選開源項(xiàng)目灸叼,核心還是一個(gè)成本和收益的問題神汹,并不是說選擇開源項(xiàng)目就一定是最優(yōu)的項(xiàng)目,最主要的問題是:沒有完全適合你的輪子古今!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屁魏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子捉腥,更是在濱河造成了極大的恐慌氓拼,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異披诗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)立磁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門呈队,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人唱歧,你說我怎么就攤上這事宪摧。” “怎么了颅崩?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵几于,是天一觀的道長。 經(jīng)常有香客問我沿后,道長沿彭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任尖滚,我火速辦了婚禮喉刘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漆弄。我一直安慰自己睦裳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布撼唾。 她就那樣靜靜地躺著廉邑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪倒谷。 梳的紋絲不亂的頭發(fā)上蛛蒙,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音恨锚,去河邊找鬼宇驾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛猴伶,可吹牛的內(nèi)容都是我干的课舍。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼他挎,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼筝尾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起办桨,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤筹淫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后呢撞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體损姜,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饰剥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摧阅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汰蓉。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖棒卷,靈堂內(nèi)的尸體忽然破棺而出顾孽,到底是詐尸還是另有隱情,我是刑警寧澤比规,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布若厚,位于F島的核電站,受9級(jí)特大地震影響蜒什,放射性物質(zhì)發(fā)生泄漏测秸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一灾常、第九天 我趴在偏房一處隱蔽的房頂上張望乞封。 院中可真熱鬧,春花似錦岗憋、人聲如沸肃晚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽关串。三九已至,卻和暖如春监徘,著一層夾襖步出監(jiān)牢的瞬間晋修,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國打工凰盔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留墓卦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓户敬,卻偏偏與公主長得像落剪,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尿庐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容