成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

系統(tǒng)開(kāi)發(fā)之設(shè)計(jì)模式

2016-08-27    分類: 網(wǎng)站建設(shè)

上周五同事分享了design patterns in networks,里面很多patterns都是做路由器防火墻這樣的轉(zhuǎn)發(fā)設(shè)備之所以高效的精髓所在?!赋绦蛉松沟淖x者多為互聯(lián)網(wǎng)應(yīng)用(系統(tǒng))開(kāi)發(fā)者,對(duì)這些design patterns未必了解,所以這篇文章我干脆抽取同事分享內(nèi)容和互聯(lián)網(wǎng)系統(tǒng)開(kāi)發(fā)關(guān)聯(lián)較大的patterns,講講在互聯(lián)網(wǎng)項(xiàng)目上的應(yīng)用場(chǎng)景,借花獻(xiàn)佛。

Control plane和data plane分離

這兩個(gè)概念幾乎是networks 101的入門概念。Juniper上世紀(jì)末興起的重要原因之一就是嚴(yán)格區(qū)分界定control plane和data plane,然后用ASIC實(shí)現(xiàn)data plane。Data plane是指一個(gè)網(wǎng)絡(luò)設(shè)備用于報(bào)文轉(zhuǎn)發(fā)的component,它的效率決定整個(gè)設(shè)備的效率,一般會(huì)由硬件完成。Control plane是指一個(gè)設(shè)備協(xié)議相關(guān)的部分,可以沒(méi)有數(shù)據(jù)轉(zhuǎn)發(fā)那么高效。

當(dāng)你打開(kāi)瀏覽器訪問(wèn)google時(shí),internet上面的網(wǎng)絡(luò)設(shè)備就開(kāi)始緊鑼密鼓地工作,目的只有一個(gè),把你的請(qǐng)求轉(zhuǎn)發(fā)到google的服務(wù)器。學(xué)過(guò)網(wǎng)絡(luò)課程的人都知道,這其中運(yùn)行的網(wǎng)絡(luò)設(shè)備就是路由器。路由器需要有足夠快的轉(zhuǎn)發(fā)速度,延時(shí)越小越好 —— 這考量的是data plane的效率;而data plane轉(zhuǎn)發(fā)決策的依據(jù) —— 路由,則由control plane的協(xié)議處理來(lái)完成。

在一個(gè)互聯(lián)網(wǎng)系統(tǒng)上,似乎沒(méi)有control plane和data plane較為清晰的界定。我們不妨粗暴地認(rèn)為用戶訪問(wèn)的路徑為data plane,而admin相關(guān)的路徑為control plane。對(duì)于data plane上的工作,我們可以單獨(dú)劃分一個(gè)集群來(lái)處理,力求每個(gè)request都得到高效地處理,而control plane上的工作,則可以盡可能用比較小的資源完成。這里最重要的原則是:data plane和control plane做到路徑分離,讓data plane上的大量requests不致于影響control plane的正常工作;同時(shí)control plane上的慢速任務(wù)不致于拖累data plane的訪問(wèn)速度。

First path vs Fast path

做防火墻,少不了會(huì)遇到first path和fast path的概念。防火墻處理的是雙向的數(shù)據(jù)流,需要記錄狀態(tài),所以有session的概念。在first path里面,走一個(gè)慢速的全路徑,創(chuàng)建session,在fast path里面,則可以利用session里面的各種信息快速處理數(shù)據(jù)報(bào)文。

在互聯(lián)網(wǎng)系統(tǒng)上,類似的mapping很好建立。在一個(gè)需要用戶登錄的系統(tǒng)里,用戶登錄的整個(gè)過(guò)程可以被視作first path,隨后的訪問(wèn)可以被視作fast path。

用戶登錄是一個(gè)復(fù)雜的過(guò)程,不僅僅是驗(yàn)證用戶合法性這么簡(jiǎn)單。在前臺(tái)盡快給出用戶登錄后頁(yè)面的同時(shí)(responsiveness很重要),后臺(tái)需要加載一系列用戶相關(guān)的數(shù)據(jù)到緩存(比如redis)中,以便用戶在隨后的訪問(wèn)中能夠快速獲取。加載的數(shù)據(jù)可以是用戶的朋友信息,用戶可能會(huì)訪問(wèn)的熱點(diǎn)數(shù)據(jù),各種各樣的counters等等。

當(dāng)然,first path/fast path的概念不僅僅適用于登錄和登錄后的訪問(wèn),還有很多其它的應(yīng)用場(chǎng)景。比如說(shuō)一個(gè)規(guī)則系統(tǒng),首次訪問(wèn)時(shí)從規(guī)則引擎中抽取用戶相關(guān)的規(guī)則進(jìn)行編譯和緩存,之后的訪問(wèn)則直接從編譯好的規(guī)則緩存中高效讀取。

注意first path/fast path的概念是相對(duì)的,就像分形幾何一樣,first path里面可以再區(qū)分中first path/fast path,fast path里也可以再區(qū)分出first path/fast path,不斷迭代下去。這樣做的目的是,不斷地優(yōu)化系統(tǒng)中最常用的80%的路徑,讓它們的效率大化。

Slow path vs Fast path

Slow path/fast path和first path/fast path很類似,但又不盡相同。就用戶登錄而言,我們假定(或者有實(shí)際數(shù)據(jù))80%的用戶通過(guò)用戶名/密碼登錄,那么用戶名/密碼登錄就要置于fast path下,而其它的諸如LDAP,OpenID,XAuth登錄方式置于slow path下。

這樣區(qū)分fast path/slow path的好處是,一旦有需要,我們可以把對(duì)應(yīng)的代碼用更高效的方式實(shí)現(xiàn),比如說(shuō)整個(gè)系統(tǒng)是python實(shí)現(xiàn)的,系統(tǒng)中的一些fast path處在用戶訪問(wèn)的熱點(diǎn)區(qū)域,那么可以考慮用go來(lái)實(shí)現(xiàn)。

Queue based design

在網(wǎng)絡(luò)設(shè)備中,queue無(wú)處不在,幾乎成了最基本的操作。一個(gè)數(shù)據(jù)報(bào)文從硬件上來(lái)之后被放到了driver的queue上,然后在系統(tǒng)處理的各個(gè)層級(jí),不斷地被enqueue/dequeue。Queue有很多好處,比如說(shuō)延遲處理,優(yōu)先級(jí),流量整形(traffic shaping)。

一個(gè)復(fù)雜的互聯(lián)網(wǎng)系統(tǒng)很多時(shí)候也需要queue來(lái)控制任務(wù)處理的節(jié)奏。比如說(shuō)email驗(yàn)證這樣的事情,可以不必在當(dāng)前的request里完成,而放到message queue中,由后臺(tái)的worker來(lái)處理。另外,queue可以有不同的優(yōu)先級(jí),發(fā)送email和將圖片轉(zhuǎn)換成不同的size顯然可以放入不同的優(yōu)先級(jí)隊(duì)列中調(diào)度。

對(duì)于互聯(lián)網(wǎng)項(xiàng)目而言,有很多成熟的message queue system,比如RabbitMQ,ZeroMQ。

Pipeline

在網(wǎng)絡(luò)系統(tǒng)里面,如果一個(gè)任務(wù)很復(fù)雜,需要很多CPU時(shí)間,那么該任務(wù)可以分解成多個(gè)小任務(wù)來(lái)執(zhí)行,否則的話,這個(gè)任務(wù)占用CPU時(shí)間過(guò)長(zhǎng),導(dǎo)致其他任務(wù)無(wú)法執(zhí)行。當(dāng)一個(gè)任務(wù)分解成多個(gè)小任務(wù)后,每個(gè)小任務(wù)之間由queue連接,上一次處理完成之后,放入下一個(gè)queue。這樣可以任務(wù)調(diào)度更均衡。

在互聯(lián)網(wǎng)項(xiàng)目中,pipeline有很多應(yīng)用場(chǎng)合。比如說(shuō)一個(gè)workflow里面狀態(tài)機(jī)的改變,可能會(huì)執(zhí)行一系列的操作,然后最終遷移到新的狀態(tài)。如果這一系列的操作在一個(gè)大的function里執(zhí)行,而非分解成若干個(gè)通過(guò)queue相連的小操作,那么整個(gè)處理過(guò)程中的慢速操作會(huì)影響整個(gè)系統(tǒng)的吞吐量。而且,這樣做非常不利于concurrency。

在一個(gè)大型系統(tǒng)中,pipeline的程度決定了concurrency的程度。而pipeline的應(yīng)用程度會(huì)影響整個(gè)系統(tǒng)架構(gòu)的吞吐量。有些編程語(yǔ)言,如golang,天然就讓你的思維模式往pipeline的方式去轉(zhuǎn)(通過(guò)go/chan)。

Finite State Machine

既然提到了狀態(tài)機(jī),就講講狀態(tài)機(jī)。狀態(tài)機(jī)由兩個(gè)元素組成:狀態(tài);以及狀態(tài)遷移。狀態(tài)遷移是由動(dòng)作引起的,因此一個(gè)狀態(tài)機(jī)可以表示為 state machine = {state, event} -> (action, new state)。只要畫(huà)出一個(gè)二維表,就能分析系統(tǒng)所有可能的路徑,而且很難有遺漏。在網(wǎng)絡(luò)設(shè)備中,大部分協(xié)議都由狀態(tài)機(jī)來(lái)表述,比如說(shuō)ospf,igmp,tcp等等。

在互聯(lián)網(wǎng)項(xiàng)目中,狀態(tài)機(jī)無(wú)處不在。比如說(shuō)訂單處理。一個(gè)訂單的處理流程用狀態(tài)機(jī)表述再好不過(guò)。下面是我曾經(jīng)寫過(guò)的一段示例代碼(python):

ORDER_EVENTS = {
  (const.ORDER_EVENT_PAYED, const.ORDER_STATE_CREATED): {
    'new_state': const.ORDER_STATE_PAYED,
    'callback': on_order_event_payed,
  },
  (const.ORDER_EVENT_PAY_EXPIRED, const.ORDER_STATE_CREATED): {
    'new_state': const.ORDER_STATE_CANCELLED,
    'callback': on_order_event_cancelled,
  },
  (const.ORDER_EVENT_CONFIRMED, const.ORDER_STATE_PAYED): {
    'new_state': const.ORDER_STATE_CLOSED,
    'callback': on_order_event_confirmed,
  },
  (const.ORDER_EVENT_CONFIRM_EXPIRED, const.ORDER_STATE_PAYED): {
    'new_state': const.ORDER_STATE_CLOSED,
    'callback': on_order_event_confirm_expired,
  },
  ...
}

當(dāng)前文章:系統(tǒng)開(kāi)發(fā)之設(shè)計(jì)模式
瀏覽地址:http://jinyejixie.com/news/43320.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、企業(yè)建站標(biāo)簽優(yōu)化、軟件開(kāi)發(fā)、網(wǎng)站制作、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
新郑市| 唐海县| 宁安市| 迭部县| 沁阳市| 保德县| 乐亭县| 伊金霍洛旗| 新巴尔虎右旗| 五台县| 松溪县| 兰坪| 肇东市| 黄山市| 繁昌县| 十堰市| 渝北区| 平遥县| 安新县| 汽车| 静乐县| 嘉定区| 汤原县| 文安县| 丽江市| 南康市| 西丰县| 米泉市| 凤阳县| 河北区| 封开县| 峨山| 来安县| 天门市| 宾川县| 凌云县| 沙河市| 常州市| 新安县| 石嘴山市| 嘉善县|